matlab自带了LPC计算函数 http://www.mathworks.cn/cn/help/signal/ref/lpc.html
为了验证LPC谱与短时傅里叶谱的逼近程度,首先计算STFT,再计算LPC谱,最后在一张图上画出来
matlab代码片段如下:
frameData = z_frame(idx,:);
[ar,g] = lpc(frameData,p);
fft_mag = abs(fft(frameData, n));
lpc_mag = abs(fft(ar,n));
plot(20*log10(sqrt(g)./lpc_mag(1:81)),'--r');hold on;
plot(20*log10(fft_mag(1:81)));hold off;
legend('LPC spectrum','STFT');
得到如下图所示的谱,LPC谱的形状倒是与STFT一致,只是增益gain貌似差的有点大,百思不得其解……
再用voicebox里面的lpcauto函数试试 http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/lpcauto.html
matlab代码中的lpc函数替换成lpcauto,得到如下结果,哈哈,差不多就是了
matlab自带的lpc函数和voicebox的lpcauto函数均是采用自相关法实现的,怎会有这么大的差距?
到lpc函数里面去看个究竟,原来有这么一行
X = fft(x,2^nextpow2(2*size(x,1)-1));
R = ifft(abs(X).^2);
R = R./m; % Biased autocorrelation estimate !!!
[a,e] = levinson(R,N);
m不就是帧长么,那就将该函数得到的g乘m就得到想要的结果
通过对比发现,matlab自带的lpc函数和voicebox的lpcauto函数计算的LPC系数存在一定的误差,但将阶数p增加到50可以看到lpc函数得到的LPC谱貌似更逼近STFT。