title('原始语音和预测语音波形') subplot(2,1,2),plot(E);grid; title('预测误差'); figure
fLength(1 : 2 * N) = [M,zeros(1,N)]; Xm = fft(fLength,2 * N); X = Xm .* conj(Xm); Y = fft(X , 2 * N); Rk = Y(1 : N);
PART = sum(ai(2 : P + 1) .* Rk(1 : P)); G = sqrt(sum(Frame.^2) - PART);
A = (FTframe1 - FFTlp(1 : length(F'))) ./ FTframe1
subplot(2,1,1),plot(F',20*log(abs(FTframe1)),F',(20*log(abs(1 ./ A))),'-r'); grid;
xlabel('频率/dB');ylabel('幅度'); title('短时谱');
subplot(2,1,2),plot(F',(20*log(abs(G ./ A))));grid; xlabel('频率/dB');ylabel('幅度'); title('LPC谱');
figure%求出预测误差的倒谱 pitch = fftshift(rceps(E));
M_pitch = fftshift(rceps(Frame)); subplot(2,1,1),plot(M_pitch);grid; xlabel('语音帧');ylabel('/dB'); title('原始语音帧倒谱'); subplot(2,1,2),plot(pitch);grid; xlabel('语音帧');ylabel('/dB'); title('预测误差倒谱'); figure %画出语谱图
ai1 = lpc(I,P); % 计算原始语音lpc系数
LP1 = filter([0 -ai(2:end)],1,I); % 建立原始语音的正则方程 subplot(2,1,1);
specgram(I,N,N/2,N); title('原始语音语谱图'); subplot(2,1,2);
specgram(LP1,N,N/2,N); title('预测语音语谱图');
实验结果截图:
原始语音语谱图60Frequency4020010002000300040005000600070008000900010000Time预测语音语谱图60Frequency4020010002000300040005000600070008000900010000Time
原始语音帧倒谱50/dB-5-10050100150语音帧预测误差倒谱20025030010/dB-1-2-3050100150语音帧200250300
短时谱1000幅度-100-200-300010203040频率/dBLPC谱506070200100幅度0-100010203040频率/dB506070
原始语音和预测语音波形10.50-0.5-1050100150预测误差0.10.050-0.05-0.1050100150200250300200250300
原始语音波形10.80.60.40.20-0.2-0.4-0.6-0.8-102468101214x 105
五、实验结果与分析
这次实验利用MATLAB对信号进行分析和处理,主要就是进行语音线性预测,语音线性预测的基本思想是:一个语音信号的抽样值可以用过去若干个取样值的线性组合来逼近。通过使实际语音抽样值与线性预测抽样值的均方误差达到最小,可以确定唯一的一组线性预测系数。做了LPC特征提取的实验之后,促进了我对MFCC特征提取进行探究和验证,此次试验让我对相关知识加深了理解。