📄 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 + -