Add ff_celp_circ_addf() function to be used for sparse vector circular
authorColin McQuillan <m.niloc@googlemail.com>
Wed, 12 Aug 2009 19:54:28 +0000 (19:54 +0000)
committerRobert Swain <robert.swain@gmail.com>
Wed, 12 Aug 2009 19:54:28 +0000 (19:54 +0000)
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

libavcodec/celp_filters.c
libavcodec/celp_filters.h

index cd47553..d54e2fa 100644 (file)
@@ -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,
index ccdffe8..d9db95d 100644 (file)
@@ -41,6 +41,21 @@ void ff_celp_convolve_circ(int16_t* fc_out,
                            const int16_t* filter,
                            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