Moving Average in C Language
<p>I am trying to do a moving average filter in C language, I've adapted a matlab program that works correctly, the input of my filter is a .pcm archive (a sweep audio signal), the problem to me is the output archive of the moving average in C language, the output goes wrong, the signal only decreases along the time (don't filtter).</p>

<p>Below My C code: </p>

<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;



#define m 16  // MEDIA LENGTH

int main()
{
    short *x;                              // X VECTOR = 0
    double coef[m];                           // COEF VECTOR = 0
    int i;                                  // FOR COUNT VARIABLE
    int n;                                  // FOR COUNT VARIABLE
    int itera;                              // LENGTH OF THE INPUT FILE
    double aux;                                // AUX VARIABLE TO MAKE THE SUM
    double *y;                              // AUX VECTOR TO RECEIVE X VECTOR
    double *saida;                          // OUTPUT VECTOR
    FILE *arq;                                 // POINTER TO THE FILE

    for (i = 0; i &lt; m; i++) {
        coef[i] = 1.0/m;
    }
    arq = fopen("sweep_100_3400.pcm", "rb");
    if (arq == NULL)
    {
        printf("ERROR WHILE OPENING THE FILE\n");
        return;
    }
    // compute size of file
    fseek(arq,0,SEEK_END);
    itera = ftell(arq)/sizeof(short);
    rewind(arq);

    // alloc mem for x, read the vector from input file
    x = malloc(itera*sizeof(short));
    fread(x,sizeof(short),itera,arq);
    fclose(arq);
    // alloc mem for y

    y = malloc(itera*sizeof(double));
    saida = malloc(itera*sizeof(double));

    for (i=0; i &lt; itera; i++) {
        y[0] = x[i];
        aux=0;
        for (n=0; n&lt;m; n++){
            aux += coef[n] * y[n];
        }
        saida[i]=aux;
        for (n=m; n &lt;2; n--){
            x[n] = x[n-1];
        }
    }
    arq=fopen("saida_medial_movel_c.pcm","wb");
    fwrite(saida, sizeof(double),itera,arq);
    fclose(arq);
    free(saida);
    free(y);
    free(x);
}
</code></pre>

<p>The image below is the output of the matlab program to moving average with length 16:</p>

<p><a href="https://i.stack.imgur.com/aD79R.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/aD79R.png" alt="enter image description here"></a></p>

<p>This image is the output in C language with moving average with length 16:</p>

<p><a href="https://i.stack.imgur.com/iEIu6.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/iEIu6.png" alt="enter image description here"></a></p>

<p>Someone knows what may be?</p>

<p>Below the code in matlab, that I've adapted:</p>

<pre><code>%MOVING AVERAGE EXAMPLE SCRIPT
clear all;
close all;
clc;
% DEFINES MEDIA LENGTH
m = 16;
%VECTOS EQUAL ZERO
x = zeros (m,1); 
coef = zeros (m,1);
%INITIALIZE VECTOR 
for j = 1 : m,
        coef (j,1) = 1/m;
end
%READ INPUT FILE
fid = fopen ('sweep_100_3400.pcm','rb');
s = fread (fid, 'int16');
fclose(fid);
subplot(2,1,1);
plot(s);
grid on;
title('ENTRADA DO FILTRO');
%PROCESS
itera = length(s);
sav_y = zeros (itera, 1);
%EXECUTE PROCESS
for j = 1 : itera,
    x(1,1) = s (j,1);
    %PRODUCTS SUM
    y=0;
    for n = 1 : m,
        y = y + coef(n,1) * x(n,1);
    end
    sav_y(j,1) = y;
    %SHIFT THE VECTOR
    for n = m: -1 : 2,
        x (n,1) = x(n-1,1);
    end 
end 
%PLOT OUTPUT
subplot (2,1,2);
plot (sav_y);
grid on;
title('SAÍDA DO FLITRO');
%SAVE THE OUTPUT IN ANOTHER FILE
fid = fopen('saida_mm_manual.pcm','wb');
fwrite(fid,sav_y,'int16');
fclose(fid);
</code></pre>

<hr>

<p>Update 1 (Using the answer above):</p>

<p><a href="https://i.stack.imgur.com/gW0eP.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gW0eP.png" alt="enter image description here"></a></p>

<p>The begining of the signal still with interference, but from the middle to the end of the signal is correctly.</p>