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('小波濾波后信號 ');

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM