www.pudn.com > lpc_specgram.rar > lpc2.m


I = wavread('北风');%读入原始语音 
Q = I'; 
N = 256; % 窗长 
Hamm = hamming(N); % 加窗 
frame = 30;%需要处理的帧位置 
M = Q(((frame - 1) * (N / 2) + 1):((frame - 1) * (N / 2) + N)); 
Frame = M .* Hamm';%加窗后的语音帧 
 
[B,F,T] = specgram(I,N,N/2,N);  
[m,n] = size(B); 
for i = 1:m 
    FTframe1(i) = B(i,frame); 
end 
 
P1 =5; 
ai1 = lpc(Frame,P1); % 计算lpc系数 
LP1 = filter([0 -ai1(2:end)],1,Frame); % 建立语音帧的正则方程 
FFTlp = fft(LP1); 
E1 = Frame - LP1; % 预测误差 
 
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); 
PART1 = sum(ai1(2 : P1 + 1) .* Rk(1 : P1)); 
G = sqrt(sum(Frame.^2) - PART1); 
 
A1 = (FTframe1 - FFTlp(1 : length(F'))) ./ FTframe1 ;  
subplot(3,1,1),plot(F',20*log(abs(FTframe1)),F',(20*log(abs(1 ./ A1))),'-r');grid; 
xlabel('频率/dB');ylabel('幅度'); 
title('P1 =5') 
 
P2 =10; 
ai2 = lpc(Frame,P2); % 计算lpc系数 
LP2 = filter([0 -ai2(2:end)],1,Frame); % 建立语音帧的正则方程 
FFTlp = fft(LP2); 
E2 = Frame - LP2; % 预测误差 
 
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); 
PART2 = sum(ai2(2 : P2 + 1) .* Rk(1 : P2)); 
G = sqrt(sum(Frame.^2) - PART2); 
 
A2 = (FTframe1 - FFTlp(1 : length(F'))) ./ FTframe1 ;  
subplot(3,1,2),plot(F',20*log(abs(FTframe1)),F',(20*log(abs(1 ./ A2))),'-r');grid; 
xlabel('频率/dB');ylabel('幅度'); 
title('P1 =10') 
 
P3 =20; 
ai3 = lpc(Frame,P3); % 计算lpc系数 
LP3 = filter([0 -ai3(2:end)],1,Frame); % 建立语音帧的正则方程 
FFTlp = fft(LP3); 
E3 = Frame - LP3; % 预测误差 
 
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); 
PART3 = sum(ai3(2 : P3 + 1) .* Rk(1 : P3)); 
G = sqrt(sum(Frame.^2) - PART3); 
 
A3 = (FTframe1 - FFTlp(1 : length(F'))) ./ FTframe1 ;  
subplot(3,1,3),plot(F',20*log(abs(FTframe1)),F',(20*log(abs(1 ./ A3))),'-r');grid; 
xlabel('频率/dB');ylabel('幅度'); 
title('P1 =20')