diff options
author | Colin McQuillan <m.niloc@googlemail.com> | 2009-08-12 19:54:28 +0000 |
---|---|---|
committer | Robert Swain <robert.swain@gmail.com> | 2009-08-12 19:54:28 +0000 |
commit | d4d6ae16033097462c8336868eb4acfa617acd6c (patch) | |
tree | 48060d235aebc1afe921c636182b6aafe1deb2aa | |
parent | 51fdb6f08d3e18d052f2be630ad7ec160d4247ec (diff) | |
download | ffmpeg-d4d6ae16033097462c8336868eb4acfa617acd6c.tar.gz |
Add ff_celp_circ_addf() function to be used for sparse vector circular
convolution in the upcoming AMR-NB floating point decoder. The function scales
and adds a vector, that is lagged by some offset, to another vector with the
same number of elements.
Patch by Colin McQuillan ( m.niloc googlemail com )
Originally committed as revision 19634 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/celp_filters.c | 10 | ||||
-rw-r--r-- | libavcodec/celp_filters.h | 15 |
2 files changed, 25 insertions, 0 deletions
diff --git a/libavcodec/celp_filters.c b/libavcodec/celp_filters.c index cd475533a5..d54e2fa709 100644 --- a/libavcodec/celp_filters.c +++ b/libavcodec/celp_filters.c @@ -47,6 +47,16 @@ void ff_celp_convolve_circ(int16_t* fc_out, } } +void ff_celp_circ_addf(float *out, const float *in, + const float *lagged, int lag, float fac, int n) +{ + int k; + for (k = 0; k < lag; k++) + out[k] = in[k] + fac * lagged[n + k - lag]; + for (; k < n; k++) + out[k] = in[k] + fac * lagged[ k - lag]; +} + int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t* filter_coeffs, const int16_t* in, diff --git a/libavcodec/celp_filters.h b/libavcodec/celp_filters.h index ccdffe8483..d9db95d454 100644 --- a/libavcodec/celp_filters.h +++ b/libavcodec/celp_filters.h @@ -42,6 +42,21 @@ void ff_celp_convolve_circ(int16_t* fc_out, int len); /** + * Add an array to a rotated array. + * + * out[k] = in[k] + fac * lagged[k-lag] with wrap-around + * + * @param out result vector + * @param in samples to be added unfiltered + * @param lagged samples to be rotated, multiplied and added + * @param lag lagged vector delay in the range [0, n] + * @param fac scalefactor for lagged samples + * @param n number of samples + */ +void ff_celp_circ_addf(float *out, const float *in, + const float *lagged, int lag, float fac, int n); + +/** * LP synthesis filter. * @param out [out] pointer to output buffer * @param filter_coeffs filter coefficients (-0x8000 <= (3.12) < 0x8000) |