+/**
+ * Apply Welch window function to audio block
+ */
+static void lpc_apply_welch_window_c(const int32_t *data, int len,
+ double *w_data)
+{
+ int i, n2;
+ double w;
+ double c;
+
+ /* The optimization in commit fa4ed8c does not support odd len.
+ * If someone wants odd len extend that change. */
+ assert(!(len & 1));
+
+ n2 = (len >> 1);
+ c = 2.0 / (len - 1.0);
+
+ w_data+=n2;
+ data+=n2;
+ for(i=0; i<n2; i++) {
+ w = c - n2 + i;
+ w = 1.0 - (w * w);
+ w_data[-i-1] = data[-i-1] * w;
+ w_data[+i ] = data[+i ] * w;
+ }
+}
+
+/**
+ * Calculate autocorrelation data from audio samples
+ * A Welch window function is applied before calculation.
+ */
+static void lpc_compute_autocorr_c(const double *data, int len, int lag,
+ double *autoc)
+{
+ int i, j;
+
+ for(j=0; j<lag; j+=2){
+ double sum0 = 1.0, sum1 = 1.0;
+ for(i=j; i<len; i++){
+ sum0 += data[i] * data[i-j];
+ sum1 += data[i] * data[i-j-1];
+ }
+ autoc[j ] = sum0;
+ autoc[j+1] = sum1;
+ }
+
+ if(j==lag){
+ double sum = 1.0;
+ for(i=j-1; i<len; i+=2){
+ sum += data[i ] * data[i-j ]
+ + data[i+1] * data[i-j+1];
+ }
+ autoc[j] = sum;
+ }
+}
+