Reply by alexandra3753 June 28, 20092009-06-28
Hi, I'm doing some speech processing using Linear Predictive Coding, and I'm trying to use MATLAB to find the feedback coefficients, ai, for a digital filter of the form

y[n] = x[n] + Ʃ(ai * y[n-i])

(sum goes from i = 1 to i = N where N is the order of the filter)

where n is the index of the sample point, y[n] is the output, x[n] is a pulse input with period equal to the pitch period of the speech segment, and the y[n-i] are the past outputs. I'm pretty sure the feedforward coefficients in this case should be b = [1 0 0 0....0] of length N +1, so I ignore them in the formula.

I wrote a program which will solve for the ai's by simply looping through and plugging in each value of y[n], a 0 for x[n] and the previous values for y[n], but now I'm confused:

Once I solve for my ai's, I can plug them back in and get my vector y[n], since that's what I used to solve for the coefficients in the first place... but when I use the filter function in MATLAB

y = filter(b,a,x(n));

where x(n) is the pulse input, I thought y should be equal or at least close to my original output vector y[n], but it isn't. Also, when I use the freqz function

[H,F] = freqz(b,a,# of points,sampling frequency);
plot(F,20*log10(abs(H)));

The plot does not look like the frequency spectrum of the original signal, and does not get better as I increase the order of the filter. This tells me my coefficients must be wrong. When I use the built-in MATLAB function

a = lpc(y,N) (where N is again the filter order)

I get coefficients that are nothing like the ones I found, and when I use the filter function on them, the y is nothing like the original y[n]. However, the plot of the spectral envelope looks just like it should, so obviously the coefficients are correct.

I know the built-in lpc function is using the autocorrelation method, but I don't understand why my method of finding the coefficients isn't working!

I must be missing something, as I'm very new to signal processing. Could you please help me figure out what I'm doing wrong? Why am I not getting the right results by simply plug in present output, present pulse input and past outputs to solve for the coefficients?

Don't ask me why I can't just use the built-in MATLAB lpc function :) ... I just need to know why my method isn't working or whether it would work if I fixed something that I'm doing wrong.
Any help/suggestions would be very very much appreciated!

Thank you! Alexandra.