【卡尔曼】卡尔曼滤波的语音处理应用——matlab

地址::http://blog.sina.com.cn/s/blog_892508d501012hzg.html

这一段时间对现代滤波进行了学习,对自适应滤波器和卡尔曼滤波器有了一定认识,并对它们用MATLAB对语音信号进行了滤波,发现卡尔曼滤波器还是比较有用,能够在较大的噪声中还原原来的信号。新的学期马上就开始了,由于TI的开发板一直在维修,所以学习TI开发板的计划搁置,但是对声音信号的处理及滤波器的认识有了进一步提高。新的学期继续努力!  

    卡尔曼滤波的基本思想是:以最小均方误差为最佳估计准则,采用信号与噪声的状态空间模型,利用前一时刻的估计值和当前时刻的观测值来更新对状态变量的估计,求出当前时刻的估计值,算法根据建立的系统方程和观测方程对需要处理的信号做出满足最小均方误差的估计。

语音信号在较长时间内是非平稳的,但在较短的时间内的一阶统计量和二阶统计量近似为常量,因此语音信号在相对较短的时间内可以看成白噪声激励以线性时不变系统得到的稳态输出。假定语音信号可看成由一AR模型产生:

                     卡尔曼滤波算法及MATLAB实现

     时间更新方程:

                       卡尔曼滤波算法及MATLAB实现

    测量更新方程:

                      卡尔曼滤波算法及MATLAB实现

    K(t)为卡尔曼增益,其计算公式为:

                        卡尔曼滤波算法及MATLAB实现

其中

                       卡尔曼滤波算法及MATLAB实现            

卡尔曼滤波算法及MATLAB实现卡尔曼滤波算法及MATLAB实现分别为过程模型噪声协方差和测量模型噪声协方差,测量协方差可以通过观测得到,则较难确定,在本实验中则通过与两者比较得到。

     由于语音信号短时平稳,因此在进行卡尔曼滤波之前对信号进行分帧加窗操作,在滤波之后对处理得到的信号进行合帧,这里选取帧长为256,而帧重叠个数为128;

     下图为原声音信号与加噪声后的信号以及声音信号与经卡尔曼滤波处理后的信号:

卡尔曼滤波算法及MATLAB实现

                                原声音信号与加噪声后的信号

卡尔曼滤波算法及MATLAB实现

                               原声音信号与经卡尔曼滤波处理后的信号

MATLAB程序实现如下:

%%%%%%%%%%%%%%%%%基于LPC全极点模型的最大后验概率估计法,采用卡尔曼滤波%%%%%%%%%%%%%%

clear;

clc;

%%%%%%%%%%%%%%%%%%%%%%%%%%%加载声音数据%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

load voice.mat

y=m1(2,:);

x=y+0.08*randn(1,length(y));

%%%%%%%%%%%%%%%原声音信号和加噪声后的信号%%%%%%%%%%%%%%%

figure(1);

subplot(211);plot(m1(1,:),m1(2,:));xlabel('时间');ylabel('幅度');title('原声音信号');

subplot(212);plot(m1(1,:),x);xlabel('时间');ylabel('幅度');title('加噪声后的信号');

%%%%%%%%%%%%%%%%%%%%%%%%%输入参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Fs=44100;                      %信号采样的频率

bits=16;                 %信号采样的位数

N=256;                      %帧长

m=N/2;                      %每帧移动的距离

lenth=length(x);            %输入信号的长度

count=floor(lenth/m)-1;     %处理整个信号需要移动的帧数%%%先不考虑补零的问题

p=11;                             %AR模型的阶数

a=zeros(1,p);

w=hamming(N);                   %加汉明窗函数

y_temp=0;

F=zeros(11,11);           %转移矩阵

F(1,2)=1;

F(2,3)=1;

F(3,4)=1;

F(4,5)=1;

F(5,6)=1;

F(6,7)=1;

F(7,8)=1;

F(8,9)=1;

F(9,10)=1;

F(10,11)=1;

H=zeros(1,p);                        %

S0=zeros(p,1);

P0=zeros(p);

S=zeros(p);

H(11)=1;

s=zeros(N,1);

G=H';

P=zeros(p);

%%%%%%%%%%%%%%%%测试噪声协方差%%%%%%%%%%%%%%%%%%%%%%

y_temp=cov(x(1:7680));

x_frame=zeros(256,1);

x_frame1=zeros(256,1);

T=zeros(lenth,1);

for r=1:count

%%%%%%%%%%%%%%%%%%%5%%%%%分帧处理%%%%%%%%%%%%%%%%%%%%%

        x_frame=x((r-1)*m+1:(r+1)*m);

%%%%%%%%%%%%%%%%采用LPC模型求转移矩阵参数%%%%%%%%%%%%%%   

          if r==1

           [a,VS]=lpc(x_frame(:),p);  

         else 

           [a,VS]=lpc(T((r-2)*m+1:(r-2)*m+256),p);

        end

%%%%%%%%%%%%%%%%帧长内过程噪声协方差%%%%%%%%%%%%%%%%%%

        if (VS-y_temp>0)   

            VS=VS-y_temp;

        else 

            VS=0.0005;

        end

  

        F(p,:)=-1*a(p+1:-1:2);

 

        for j=1:256

            if(j==1)

            S=F*S0;

            Pn=F*P*F'+G*VS*G';

            else 

            S=F*S;      %时间更新方程

            Pn=F*P*F'+G*VS*G';

            end

            K=Pn*H'*(y_temp+H*P*H').^(-1); %卡尔曼增益

            P=(eye(p)-K*H)*Pn;                     %测量更新方程

            S=S+K*[x_frame(j)-H*S];

            T((r-1)*m+j)=H*S;

        end

%%%%%%%%%%%%%%%%对得到的每帧数据进行加窗操作%%%%%%%%%%%%%%%%%%%%%%%%

        ss(1:256,r)=T((r-1)*m+1:(r-1)*m+256);

         sss(1:256,r)=ss(1:256,r).*w;

     

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%合帧操作%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

         for r=1:count

             if r==1

            s_out(1:128)=sss(1:128,r);

            else if r==count

            s_out(r*m+1:r*m+m)=sss(129:256,r);

            else

             s_out(((r-1)*m+1):((r-1)*m+m))=sss(129:256,r-1)+sss(1:128,r);

             end

            end

       end

 

figure(2)

subplot(211);plot(m1(1,:),m1(2,:));xlabel('时间');ylabel('幅度');title('原声音信号');

subplot(212);plot((1:1109760)/Fs,s_out);xlabel('时间');ylabel('幅度');title('经卡尔曼滤波后的声音信号');


  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 滤波是一种用于实时估计动态系统状态的算法。它在许多领域中被广泛应用,如航空航天、导航、机器人等。滤波算法通过结合系统的测量数据和模型预测值,来动态地更新系统的状态估计。它的核心思想是将已有的信息与新的观测结果进行加权平均,从而得到对系统真实状态更准确的估计。 在Matlab中,我们可以通过编写滤波的仿真程序来实现对系统状态的估计。首先,我们需要定义系统的状态方程和观测方程,以及系统的初始状态和噪声模型。然后,使用kalman函数来进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 具体而言,我们可以按照以下步骤来编写滤波Matlab仿真程序: 1. 定义系统的状态方程和观测方程,并初始化系统状态和滤波器的状态估计。 2. 定义系统的噪声模型,包括过程噪声和观测噪声的协方差矩阵。 3. 生成系统的真实状态序列和对应的观测数据。 4. 使用kalman函数进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 5. 计算滤波器的误差协方差矩阵,评估滤波器性能。 6. 绘制真实状态序列、观测数据和滤波器估计值的曲线图,以及滤波器误差的方差曲线图。 在编写程序时,我们还可以尝试不同的参数设置和噪声模型,以及对结果进行分析和优化。 总之,通过在Matlab中编写滤波的仿真程序,我们可以更好地理解滤波的原理和应用,并对其进行调试和优化,从而实现更准确的状态估计。 ### 回答2: 滤波是一种用于估计状态变量的方法,它通过将测量观测值与先验估计进行加权平均,来获得更准确的状态估计值。这种滤波方法常用于控制系统中,尤其是在传感器测量带有噪声的情况下。 滤波的原理主要包含两个步骤:预测和更新。在预测步骤中,使用系统的状态转移方程预测下一时刻的状态变量;而在更新步骤中,根据已有的观测值和预测值之间的误差,计算增益,从而对预测值进行修正,得到更准确的状态估计。 Matlab是一种广泛使用的科学计算与数据分析工具,提供了丰富的数学函数和工具箱,可以方便地进行滤波的仿真。在Matlab中,可以使用kalman函数来实现滤波。具体步骤如下: 1. 定义系统的状态转移方程、观测方程和噪声协方差矩阵。 2. 初始化系统的状态向量和协方差矩阵。 3. 通过循环迭代,对每个时刻进行滤波。 4. 在预测步骤中,使用状态转移方程进行状态的预测。 5. 在更新步骤中,计算观测值与预测值之间的误差,并计算增益。 6. 根据增益修正预测值,得到更准确的状态估计。 7. 更新协方差矩阵,并记录滤波结果。 Matlab还提供了一些用于可视化和分析滤波结果的函数,如plot函数和mean函数等。 通过使用Matlab进行滤波的仿真,我们可以观察到滤波结果与真实值的接近程度,评估滤波算法的性能并进行参数调整,以获得更准确的状态估计。这对于控制系统的设计和实际应用具有重要意义。 ### 回答3: 滤波是一种最优化的滤波方法,用于估计系统的状态。它通过融合系统的测量值和预测值,提供对未知状态的最优估计。滤波的原理是基于贝叶斯定理,它假设系统的状态满足线性动力学方程,并且状态的噪声满足高斯分布。在滤波中,有两个主要的步骤:预测步骤和更新步骤。 预测步骤是根据上一个时刻的状态估计值,预测当前时刻的状态估计值和协方差矩阵。更新步骤是通过测量值,根据预测的状态估计值和当前测量值之间的差异,进行状态的修正和协方差矩阵的更新。 Matlab中提供了滤波的仿真工具箱,可以通过设置系统模型、测量模型、协方差矩阵以及初始状态值等参数,实现对状态的估计。 随书程序是指在教科书中附带的示例程序。滤波的随书程序是指通过Matlab编写的滤波的代码示例。这些示例程序可以帮助读者理解滤波的原理和应用,并且可以通过修改参数和增加噪声等操作,进行仿真实验,观察估计结果的变化。 通过使用Matlab编写随书程序,读者可以更好地理解滤波的算法,掌握滤波的实现方法,并且可以在实际应用中进行调试和参数优化。 总之,滤波原理和应用的随书程序是一种辅助学习和实验的工具,通过使用Matlab编写,可以更好地理解滤波的算法,并且可以进行仿真实验,优化参数,提高对系统状态的估计精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值