?? kalmancolour.m
字號:
function enhancedsignal=kalmancolour(noisyspeech,samplefrequency)
x=noisyspeech;
fs=samplefrequency;
nx=length(x);
enhanced_x=zeros(1,nx);
%分幀
FrameLen=fix(0.025*fs);
overlap=0;
inc=FrameLen-overlap; %幀移
x_frame=enframe(x,FrameLen,inc); %分幀
nf=size(x_frame,1); % 幀數
P=8; %預測階數
%噪聲估計
NNoise=23;
noise=x(1:NNoise*FrameLen);
[NMetric,VN]=lpc(noise,P);
%卡爾曼濾波
for i=1:nf
if i==1
[SMetric,VS]=lpc(x_frame(i,:),P);
else
[SMetric,VS]=lpc(xn(P,:),P);
end
if (VS-VN>0)
VS=VS-VN;
else
VS=0.001;
end
%狀態矩陣
FS=[zeros(P-1,1) eye(P-1); -1*fliplr(SMetric(2:P+1))];
FN=[zeros(P-1,1) eye(P-1); -1*fliplr(NMetric(2:P+1))];
F=[FS zeros(P,P); zeros(P,P) FN]; %狀態轉移矩陣
H=[zeros(1,P-1) 1 zeros(1,P-1) 1]; %觀測矩陣
G=[zeros(P-1,2);1 0;zeros(P-1,2);0 1]; %輸入矩陣
Q=[VS 0;0 VN];
xn=zeros(2*P,FrameLen);
%初始化
if i==1
x0=[zeros(2*P,1)]; %初始狀態
P0=[zeros(2*P,2*P)]; %初始誤差方差
else
x0=[xn(P,(FrameLen-P+1:FrameLen))';zeros(P,1)];
P0=Pn;
end
%濾波
for k=1:FrameLen
%預測
if(k==1)
xn(:,k)=F*x0;
Pm=F*P0*F'+G*Q*G';
else
xn(:,k)=F*xn(:,k-1);
Pm=F*P0*F'+G*Q*G';
end
%卡爾曼增益
K=Pm*H'*inv(H*Pm*H'+VN);
%更新
xn(:,k)=xn(:,k)+K*(x_frame(i,k)-H*xn(:,k));
Pn=(eye(2*P)-K*H)*Pm;
end
enhanced_x(1+(i-1)*inc:(i-1)*inc+FrameLen)=enhanced_x(1+(i-1)*inc:(i-1)*inc+FrameLen)+xn(P,:); %得到增強后語音
end
enhancedsignal=enhanced_x;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -