Linear Predictive Coding example in MATLAB

I have some data that is highly correlated and I wanted to see if I could try and encode it using linear predictive coding (LPC). Here is how I've been understanding the process:

Encoding

1. Generate predictive filter coefficients
2. Filter signal with these coefficients to obtain and error signal $$r[n]$$.
3. Check if $$r[n]$$ is white.
4. If it is, store the variance of $$r[n]$$ along with the coefficients and you are done.
5. If not, increase order until (hopefully) $$r[n]$$ becomes white.

Decoding

1. With the encoding variance, produce a white signal.
2. Pass that white signal through the inverse filter.
3. You produce a signal $$s[n]$$ that has the same autocorrelation sequence and power spectrum as your original.

I've completed all the encoding steps - computed my coefficients, checked if my residual signal was white (autocorrelation is a delta function) and then stored its variance. However, the trouble comes during the decoding process. I took the variance I encoded, produced white noise, and filtered it with the inverse filter. Not only was my signal nowhere near a representation of my old signal, but the two signals had very different autocorrelation sequences as well. I've posted my code and my outputs below. I mainly just want to know if I'm misunderstanding something about LPC or if I'm implementing it wildly incorrectly.

load('amp.mat') %this gets loaded as the variable y with timestamp t

order = 15;
[a,variance] = aryule(y,order);
error = filter(a,1,y);

%Now check to see if error is white

[acs, lags] = xcorr(error,'coeff');
plot(lags,acs), grid;


noise = sqrt(variance)*randn(length(y),1);

%compare noise to error signal
plot(t,error,t,noise)


%synthesize signal
yrecon = filter(1,a,noise);
%actual signal, as produced by our residual
yact = filter(1,a,error);

plot(t,yrecon,t,yact);
title('Signal vs synthesized signal')


%check autocorrelation sequence of each and plot
[yacs, ylags] = xcorr(y,'coeff');
[yracs, yrlags] = xcorr(yrecon, 'coeff');
subplot(2,1,1)
plot(yrlags,yracs), grid
title('Autocorrelation sequence of reconstructed signal')
subplot(2,1,2)
plot(ylags, yacs), grid
title('Autocorrelation sequence of signal'}


• wow it's exremely efficient to store only the variance of $r[n]$... ;-) consider a signal of length 1 G samples and you reduce it to a few prediction coefficients and a single variance ? something wrong ? – Fat32 Nov 25 '18 at 16:02
• I agree that something seems wayyyy off haha. I mean I've tried increasing the number of prediction coefficients, but it neither makes the error 'more white' nor does it seem to make the auto correlation sequences more similar. I apologize, but I'm just really out of my depth here, I've looked all over for examples of implementing LPC for compression but I can't find any worked out examples so I've been trying to do it myself. I just figured that if I can get the residual to be white by removing all correlations in the signal, I've finished the encoding process. I'm guessing that's not true? – compscinoob Nov 25 '18 at 19:23
• do you know what LPC is used for and how it does achieve its purpose ? – Fat32 Nov 25 '18 at 20:24
• LPC is mianly used for speech because it's designed to fit the model of our vocal system. Our speech is modeled as a filter that is excited by either an impulse train or white noise. I do not know how it achieves its purpose. Although it's used mainly for speech, I don't see why it can't be used for any general signal that's correlated and can be reduced to some residual white noise. Maybe I'm misunderstanding everything, but I would really appreciate it if you could tell me how I could correct my already existing implementation and/or my understanding of LPC. – compscinoob Nov 27 '18 at 14:10
• You are ok with the predictive part of the LPC. But it seems you have a problem with the coding part of it; that's where the compression actually takes place. You should consider the quantization stage carefully. I suggest you read Introduction to Data Compression by Khalid Sayood. For a full grasp of LPC and other data compression methods. – Fat32 Nov 27 '18 at 15:16