# HG changeset patch # User superdump # Date 1250106868 0 # Node ID d35904b4fe3f52999008c9bfe9a6a001f5037f7c # Parent 560708e850a4876f13538b2510f760b47dac4366 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 ) diff -r 560708e850a4 -r d35904b4fe3f celp_filters.c --- a/celp_filters.c Wed Aug 12 13:25:37 2009 +0000 +++ b/celp_filters.c Wed Aug 12 19:54:28 2009 +0000 @@ -47,6 +47,16 @@ } } +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 -r 560708e850a4 -r d35904b4fe3f celp_filters.h --- a/celp_filters.h Wed Aug 12 13:25:37 2009 +0000 +++ b/celp_filters.h Wed Aug 12 19:54:28 2009 +0000 @@ -42,6 +42,21 @@ 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)