• matlab数据序列的几种滤波器


    一维数据序列滤波的matlab代码,

    其实和之前做的图像滤波大同小异,

    只是图像的噪声情况复杂得多,

    而且是二维的。

    做这个主要是手上有个心电的的mens传感器,

    蓝牙把数据传过来做一个数据的100Hz左右的带通滤波,

    用butterworht做个带通滤波,

    再用c语言重构一下。

     1 %****************************************************************************************
     2 %  
     3 %                      创建两个信号Mix_Signal_1 和信号 Mix_Signal_2 
     4 %
     5 %***************************************************************************************
     6 
     7 Fs = 1000;                                                                        %采样率
     8 N  = 1000;                                                                        %采样点数
     9 n  = 0:N-1;
    10 t   = 0:1/Fs:1-1/Fs;                                                            %时间序列 
    11 Signal_Original_1 =sin(2*pi*10*t)+sin(2*pi*20*t)+sin(2*pi*30*t); 
    12 Noise_White_1    = [0.3*randn(1,500), rand(1,500)];           %前500点高斯分部白噪声,后500点均匀分布白噪声
    13 Mix_Signal_1   = Signal_Original_1 + Noise_White_1;        %构造的混合信号
    14 
    15 Signal_Original_2  =  [zeros(1,100), 20*ones(1,20), -2*ones(1,30), 5*ones(1,80), -5*ones(1,30), 9*ones(1,140), -4*ones(1,40), 3*ones(1,220), 12*ones(1,100), 5*ones(1,20), 25*ones(1,30), 7 *ones(1,190)]; 
    16 Noise_White_2     =  0.5*randn(1,1000);                                 %高斯白噪声
    17 Mix_Signal_2        =  Signal_Original_2 + Noise_White_2;      %构造的混合信号

    一、butterworth filter

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作巴特沃斯低通滤波。
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1  巴特沃斯低通滤波
     8 figure(1);
     9 Wc=2*50/Fs;                                          %截止频率 50Hz
    10 [b,a]=butter(4,Wc);
    11 Signal_Filter=filter(b,a,Mix_Signal_1);
    12 
    13 subplot(4,1,1);                                        %Mix_Signal_1 原始信号                 
    14 plot(Mix_Signal_1);
    15 axis([0,1000,-4,4]);
    16 title('原始信号 ');
    17 
    18 subplot(4,1,2);                                        %Mix_Signal_1 低通滤波滤波后信号  
    19 plot(Signal_Filter);
    20 axis([0,1000,-4,4]);
    21 title('巴特沃斯低通滤波后信号');
    22 
    23 %混合信号 Mix_Signal_2  巴特沃斯低通滤波
    24 Wc=2*100/Fs;                                          %截止频率 100Hz
    25 [b,a]=butter(4,Wc);
    26 Signal_Filter=filter(b,a,Mix_Signal_2);
    27 
    28 subplot(4,1,3);                                        %Mix_Signal_2 原始信号                 
    29 plot(Mix_Signal_2);
    30 axis([0,1000,-10,30]);
    31 title('原始信号 ');
    32 
    33 subplot(4,1,4);                                       %Mix_Signal_2 低通滤波滤波后信号  
    34 plot(Signal_Filter);
    35 axis([0,1000,-10,30]);
    36 title('巴特沃斯低通滤波后信号');

    二、FIR

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作FIR低通滤波。
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1  FIR低通滤波
     8 figure(2);
     9 F   =  [0:0.05:0.95]; 
    10 A  =  [1    1      0     0     0    0      0     0     0    0     0     0     0     0     0     0    0   0   0   0] ;
    11 b  =  firls(20,F,A);
    12 Signal_Filter = filter(b,1,Mix_Signal_1);
    13 
    14 subplot(4,1,1);                                          %Mix_Signal_1 原始信号                 
    15 plot(Mix_Signal_1);
    16 axis([0,1000,-4,4]);
    17 title('原始信号 ');
    18 
    19 subplot(4,1,2);                                          %Mix_Signal_1 FIR低通滤波滤波后信号  
    20 plot(Signal_Filter);
    21 axis([0,1000,-5,5]);
    22 title('FIR低通滤波后的信号');
    23 
    24 %混合信号 Mix_Signal_2  FIR低通滤波
    25 F   =  [0:0.05:0.95]; 
    26 A  =  [1    1      1     1     1    0      0    0     0    0     0     0     0     0     0     0    0   0   0   0] ;
    27 b  =  firls(20,F,A);
    28 Signal_Filter = filter(b,1,Mix_Signal_2);
    29 subplot(4,1,3);                                          %Mix_Signal_2 原始信号                 
    30 plot(Mix_Signal_2);
    31 axis([0,1000,-10,30]);
    32 title('原始信号 ');
    33 
    34 subplot(4,1,4);                                          %Mix_Signal_2 FIR低通滤波滤波后信号  
    35 plot(Signal_Filter);
    36 axis([0,1000,-10,30]);
    37 title('FIR低通滤波后的信号');

    三、移动平均滤波

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作移动平均滤波
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1  移动平均滤波
     8 figure(3);
     9 b  =  [1 1 1 1 1 1]/6;
    10 Signal_Filter = filter(b,1,Mix_Signal_1);
    11 
    12 subplot(4,1,1);                                          %Mix_Signal_1 原始信号                 
    13 plot(Mix_Signal_1);
    14 axis([0,1000,-4,4]);
    15 title('原始信号 ');
    16 
    17 subplot(4,1,2);                                          %Mix_Signal_1 移动平均滤波后信号  
    18 plot(Signal_Filter);
    19 axis([0,1000,-4,4]);
    20 title('移动平均滤波后的信号');
    21 
    22 %混合信号 Mix_Signal_2  移动平均滤波
    23 b  =  [1 1 1 1 1 1]/6;
    24 Signal_Filter = filter(b,1,Mix_Signal_2);
    25 subplot(4,1,3);                                          %Mix_Signal_2 原始信号                 
    26 plot(Mix_Signal_2);
    27 axis([0,1000,-10,30]);
    28 title('原始信号 ');
    29 
    30 subplot(4,1,4);                                          %Mix_Signal_2 移动平均滤波后信号  
    31 plot(Signal_Filter);
    32 axis([0,1000,-10,30]);
    33 title('移动平均滤波后的信号');

    四、中值滤波

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作中值滤波
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1  中值滤波
     8 figure(4);
     9 Signal_Filter=medfilt1(Mix_Signal_1,10);
    10 
    11 subplot(4,1,1);                                          %Mix_Signal_1 原始信号                 
    12 plot(Mix_Signal_1);
    13 axis([0,1000,-5,5]);
    14 title('原始信号 ');
    15 
    16 subplot(4,1,2);                                          %Mix_Signal_1 中值滤波后信号  
    17 plot(Signal_Filter);
    18 axis([0,1000,-5,5]);
    19 title('中值滤波后的信号');
    20 
    21 %混合信号 Mix_Signal_2  中值滤波
    22 Signal_Filter=medfilt1(Mix_Signal_2,10);
    23 subplot(4,1,3);                                          %Mix_Signal_2 原始信号                 
    24 plot(Mix_Signal_2);
    25 axis([0,1000,-10,30]);
    26 title('原始信号 ');
    27 
    28 subplot(4,1,4);                                          %Mix_Signal_2 中值滤波后信号  
    29 plot(Signal_Filter);
    30 axis([0,1000,-10,30]);
    31 title('中值滤波后的信号');

    五、维纳滤波

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作维纳滤波
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1  维纳滤波
     8 figure(5);
     9 Rxx=xcorr(Mix_Signal_1,Mix_Signal_1);              %得到混合信号的自相关函数
    10 M=100;                                                             %维纳滤波器阶数
    11 for i=1:M                                                           %得到混合信号的自相关矩阵
    12     for j=1:M
    13         rxx(i,j)=Rxx(abs(j-i)+N);
    14     end
    15 end
    16 Rxy=xcorr(Mix_Signal_1,Signal_Original_1);       %得到混合信号和原信号的互相关函数
    17 for i=1:M
    18     rxy(i)=Rxy(i+N-1);
    19 end                                                                  %得到混合信号和原信号的互相关向量
    20 h = inv(rxx)*rxy';                                               %得到所要涉及的wiener滤波器系数
    21 Signal_Filter=filter(h,1, Mix_Signal_1);               %将输入信号通过维纳滤波器
    22 
    23 subplot(4,1,1);                                                   %Mix_Signal_1 原始信号                 
    24 plot(Mix_Signal_1);
    25 axis([0,1000,-5,5]);
    26 title('原始信号 ');
    27 
    28 subplot(4,1,2);                                                   %Mix_Signal_1 维纳滤波后信号  
    29 plot(Signal_Filter);
    30 axis([0,1000,-5,5]);
    31 title('维纳滤波后的信号');
    32 
    33 %混合信号 Mix_Signal_2  维纳滤波
    34 Rxx=xcorr(Mix_Signal_2,Mix_Signal_2);              %得到混合信号的自相关函数
    35 M=500;                                                             %维纳滤波器阶数
    36 for i=1:M                                                           %得到混合信号的自相关矩阵
    37     for j=1:M
    38         rxx(i,j)=Rxx(abs(j-i)+N);
    39     end
    40 end
    41 Rxy=xcorr(Mix_Signal_2,Signal_Original_2);       %得到混合信号和原信号的互相关函数
    42 for i=1:M
    43     rxy(i)=Rxy(i+N-1);
    44 end                                                                  %得到混合信号和原信号的互相关向量
    45 h=inv(rxx)*rxy';                                               %得到所要涉及的wiener滤波器系数
    46 Signal_Filter=filter(h,1, Mix_Signal_2);             %将输入信号通过维纳滤波器
    47 
    48 subplot(4,1,3);                                                  %Mix_Signal_2 原始信号                 
    49 plot(Mix_Signal_2);
    50 axis([0,1000,-10,30]);
    51 title('原始信号 ');
    52 
    53 subplot(4,1,4);                                                  %Mix_Signal_2 维纳滤波后信号  
    54 plot(Signal_Filter);
    55 axis([0,1000,-10,30]);
    56 title('维纳滤波后的信号');

    六、自适应滤波

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作自适应滤波
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1 自适应滤波
     8 figure(6);
     9 N=1000;                                             %输入信号抽样点数N
    10 k=100;                                                  %时域抽头LMS算法滤波器阶数
    11 u=0.001;                                             %步长因子
    12 
    13 %设置初值
    14 yn_1=zeros(1,N);                                  %output signal
    15 yn_1(1:k)=Mix_Signal_1(1:k);                 %将输入信号SignalAddNoise的前k个值作为输出yn_1的前k个值
    16 w=zeros(1,k);                                        %设置抽头加权初值
    17 e=zeros(1,N);                                        %误差信号
    18 
    19 %用LMS算法迭代滤波
    20 for i=(k+1):N
    21         XN=Mix_Signal_1((i-k+1):(i));
    22         yn_1(i)=w*XN';
    23         e(i)=Signal_Original_1(i)-yn_1(i);
    24         w=w+2*u*e(i)*XN;
    25 end
    26 
    27 subplot(4,1,1);
    28 plot(Mix_Signal_1);                               %Mix_Signal_1 原始信号
    29 axis([k+1,1000,-4,4]);
    30 title('原始信号');
    31 
    32 subplot(4,1,2);
    33 plot(yn_1);                                            %Mix_Signal_1 自适应滤波后信号
    34 axis([k+1,1000,-4,4]);
    35 title('自适应滤波后信号');
    36 
    37 %混合信号 Mix_Signal_2 自适应滤波
    38 N=1000;                                             %输入信号抽样点数N
    39 k=500;                                                %时域抽头LMS算法滤波器阶数
    40 u=0.000011;                                        %步长因子
    41 
    42 %设置初值
    43 yn_1=zeros(1,N);                                   %output signal
    44 yn_1(1:k)=Mix_Signal_2(1:k);                  %将输入信号SignalAddNoise的前k个值作为输出yn_1的前k个值
    45 w=zeros(1,k);                                        %设置抽头加权初值
    46 e=zeros(1,N);                                        %误差信号
    47 
    48 %用LMS算法迭代滤波
    49 for i=(k+1):N
    50         XN=Mix_Signal_2((i-k+1):(i));
    51         yn_1(i)=w*XN';
    52         e(i)=Signal_Original_2(i)-yn_1(i);
    53         w=w+2*u*e(i)*XN;
    54 end
    55 
    56 subplot(4,1,3);
    57 plot(Mix_Signal_2);                               %Mix_Signal_1 原始信号
    58 axis([k+1,1000,-10,30]);
    59 title('原始信号');
    60 
    61 subplot(4,1,4);
    62 plot(yn_1);                                            %Mix_Signal_1 自适应滤波后信号
    63 axis([k+1,1000,-10,30]);
    64 title('自适应滤波后信号');

    七、小波滤波

     1 %****************************************************************************************
     2 %  
     3 %                信号Mix_Signal_1 和 Mix_Signal_2  分别作小波滤波
     4 %
     5 %***************************************************************************************
     6 
     7 %混合信号 Mix_Signal_1  小波滤波
     8 figure(7);
     9 subplot(4,1,1);
    10 plot(Mix_Signal_1);                                 %Mix_Signal_1 原始信号
    11 axis([0,1000,-5,5]);
    12 title('原始信号 ');
    13 
    14 subplot(4,1,2);
    15 [xd,cxd,lxd] = wden(Mix_Signal_1,'sqtwolog','s','one',2,'db3');
    16 plot(xd);                                                 %Mix_Signal_1 小波滤波后信号
    17 axis([0,1000,-5,5]);
    18 title('小波滤波后信号 ');
    19 
    20 %混合信号 Mix_Signal_2  小波滤波
    21 subplot(4,1,3);
    22 plot(Mix_Signal_2);                                 %Mix_Signal_2 原始信号
    23 axis([0,1000,-10,30]);
    24 title('原始信号 ');
    25 
    26 subplot(4,1,4);
    27 [xd,cxd,lxd] = wden(Mix_Signal_2,'sqtwolog','h','sln',3,'db3');
    28 plot(xd);                                                %Mix_Signal_2 小波滤波后信号
    29 axis([0,1000,-10,30]);
    30 title('小波滤波后信号 ');

  • 相关阅读:
    PCA与LDA
    SVM--交叉验证
    git的基本使用
    MySQL的操作
    MySQL安装和远程连接
    javaScript进阶
    javaScript基础入门篇
    javaScript运动
    可变对象和不可变对象
    基本数据类型
  • 原文地址:https://www.cnblogs.com/MnsterLu/p/5738992.html
Copyright © 2020-2023  润新知