⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kalmanwhite.m

📁 MATLAB代码,利用卡尔曼滤波实现加入白色噪声后的语音信号的增强.效果不错.
💻 M
字号:
function enhancedsignal=kalmanwhite(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=20;
noise=x(1:NNoise*FrameLen);
VN=var(noise);

%卡尔曼滤波
for i=1:nf
        if i==1
           [Metric,VS]=lpc(x_frame(i,:),P);  
        else 
           [Metric,VS]=lpc(xn(P,:),P);
        end
        if (VS-VN>0)   
            VS=VS-VN;
        else 
            VS=0.0005;
        end
        
        %状态矩阵
        F=[zeros(P-1,1) eye(P-1); -1*fliplr(Metric(2:P+1))]; %转移矩阵
        H=[zeros(1,P-1) 1]; %观测矩阵
        G=transpose(H);     %输入矩阵
        xn=zeros(P,FrameLen);
                
        %初始化
        if i==1   
            x0=[zeros(P,1)];  %初始状态
            P0=[zeros(P,P)];  %初始误差方差                                      
        else 
            x0=xn(P,(FrameLen-P+1:FrameLen))'; 
            P0=Pn;                               
        end

        %滤波
        for k=1:FrameLen
            %预测
            if(k==1)
                xn(:,k)=F*x0;
                Pm=F*P0*F'+G*VS*G';
            else
                xn(:,k)=F*xn(:,k-1);
                Pm=F*P0*F'+G*VS*G';
            end
   
            %卡尔曼增益
            K=Pm*H'*inv(H*Pm*H'+VN);
     
            %更新
            xn(:,k)=xn(:,k)+K*(x_frame(i,k)-H*xn(:,k));
            Pn=(eye(P)-K*H)*Pm; 
        end
        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 + -