语音信号LPC谱估计

来源:互联网 发布:看美剧的网站知乎 编辑:程序博客网 时间:2024/05/17 01:32

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。


0 0
原创粉丝点击