前言:
转载自http://blog.sina.com.cn/s/blog_45eac6860102uyni.html
信号与系统大作业需要滤除高斯白噪声,苦于MATLAB使用不熟练。
这篇文章质量很高,不仅是对不同滤波方式的简介和感性认识,也是对于MATLAB基本使用的熟悉。

文章目录

  • 信号创建
  • 传统滤波
    • Butterworth滤波
    • FIR
    • 移动平均滤波
    • 中值滤波
  • 现代滤波
    • 维纳滤波
    • 自适应滤波
    • 小波变换

信号创建

%****************************************************************************************
%
%                      创建两个信号Mix_Signal_1 和信号 Mix_Signal_2
%
%***************************************************************************************Fs = 1000; %采样率
N = 1000; %采样点数
n = 0:N - 1;
t = 0:1 / Fs:1 - 1 / Fs; %时间序列
Signal_Original_1 = sin(2 * pi * 10 * t) + sin(2 * pi * 20 * t) + sin(2 * pi * 30 * t);
Noise_White_1 = [0.3 * randn(1, 500), rand(1, 500)]; %前500点高斯分部白噪声,后500点均匀分布白噪声
Mix_Signal_1 = Signal_Original_1 + Noise_White_1; %构造的混合信号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)];
Noise_White_2 = 0.5 * randn(1, 1000); %高斯白噪声
Mix_Signal_2 = Signal_Original_2 + Noise_White_2; %构造的混合信号

传统滤波

Butterworth滤波

巴特沃斯滤波器适合用于信号和噪声没有重叠的情况下。

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作巴特沃斯低通滤波。
%
%***************************************************************************************%混合信号 Mix_Signal_1  巴特沃斯低通滤波
figure(1);
Wc=2*50/Fs;                                          %截止频率 50Hz
[b,a]=butter(4,Wc);
Signal_Filter=filter(b,a,Mix_Signal_1);subplot(4,1,1);                                        %Mix_Signal_1 原始信号
plot(Mix_Signal_1);
axis([0,1000,-4,4]);
title('原始信号1 ');subplot(4,1,2);                                        %Mix_Signal_1 低通滤波滤波后信号
plot(Signal_Filter);
axis([0,1000,-4,4]);
title('巴特沃斯低通滤波后信号1');%混合信号 Mix_Signal_2  巴特沃斯低通滤波
Wc=2*100/Fs;                                          %截止频率 100Hz
[b,a]=butter(4,Wc);
Signal_Filter=filter(b,a,Mix_Signal_2);subplot(4,1,3);                                        %Mix_Signal_2 原始信号
plot(Mix_Signal_2);
axis([0,1000,-10,30]);
title('原始信号2 ');subplot(4,1,4);                                      %Mix_Signal_2 低通滤波滤波后信号
plot(Signal_Filter);
axis([0,1000,-10,30]);
title('巴特沃斯低通滤波后信号2');

下图是巴特沃斯对两个信号的滤波效果。


从图上可以看出巴特沃斯低通滤波器对信号一的滤波效果还是可以的,主要是因为有效的信号最高频率才30Hz,本程序将50Hz以上的信号全部滤除,通过的频率成分中仍然是有白噪声的。
对于信号二,滤波后的信号与没有加噪声的信号相比就有失真了,上升沿和下降沿的高频信号被滤除了。

FIR

情况同巴特沃斯低通滤波器相似。

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作FIR低通滤波。
%
%***************************************************************************************%混合信号 Mix_Signal_1  FIR低通滤波
figure(2);
F  =  0:0.05:0.95;
A  =  [1    1      0    0    0    0      0    0    0    0    0    0    0    0    0    0    0  0  0   0] ;
b  =  firls(20,F,A);
Signal_Filter = filter(b,1,Mix_Signal_1);subplot(4,1,1);                                          %Mix_Signal_1 原始信号
plot(Mix_Signal_1);
axis([0,1000,-4,4]);
title('原始信号1 ');subplot(4,1,2);                                          %Mix_Signal_1 FIR低通滤波滤波后信号
plot(Signal_Filter);
axis([0,1000,-5,5]);
title('FIR低通滤波后的信号1');%混合信号 Mix_Signal_2  FIR低通滤波
F  =  0:0.05:0.95;
A  =  [1    1      1    1    1    0      0    0    0    0    0    0    0    0    0    0    0  0  0   0] ;
b  =  firls(20,F,A);
Signal_Filter = filter(b,1,Mix_Signal_2);
subplot(4,1,3);                                          %Mix_Signal_2 原始信号
plot(Mix_Signal_2);
axis([0,1000,-10,30]);
title('原始信号2 ');subplot(4,1,4);                                          %Mix_Signal_2 FIR低通滤波滤波后信号
plot(Signal_Filter);
axis([0,1000,-10,30]);
title('FIR低通滤波后的信号2');

滤波后的效果如下:

移动平均滤波

移动平均的思路是将离散点附近的点取平均从而实现平滑化。但这种粗糙的平均,对于变换较为平缓的信号进行趋势预测非常有益。

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作移动平均滤波
%
%***************************************************************************************%混合信号 Mix_Signal_1  移动平均滤波
figure(3);
b  =  [1 1 1 1 1 1]/6;
Signal_Filter = filter(b,1,Mix_Signal_1);subplot(4,1,1);                                          %Mix_Signal_1 原始信号
plot(Mix_Signal_1);
axis([0,1000,-4,4]);
title('原始信号 ');subplot(4,1,2);                                          %Mix_Signal_1 移动平均滤波后信号
plot(Signal_Filter);
axis([0,1000,-4,4]);
title('移动平均滤波后的信号');%混合信号 Mix_Signal_2  移动平均滤波
b  =  [1 1 1 1 1 1]/6;
Signal_Filter = filter(b,1,Mix_Signal_2);
subplot(4,1,3);                                          %Mix_Signal_2 原始信号
plot(Mix_Signal_2);
axis([0,1000,-10,30]);
title('原始信号 ');subplot(4,1,4);                                          %Mix_Signal_2 移动平均滤波后信号
plot(Signal_Filter);
axis([0,1000,-10,30]);
title('移动平均滤波后的信号');

滤波效果如下:

中值滤波

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作中值滤波
%
%***************************************************************************************%混合信号 Mix_Signal_1  中值滤波
figure(4);
Signal_Filter=medfilt1(Mix_Signal_1,10);subplot(4,1,1);                                          %Mix_Signal_1 原始信号
plot(Mix_Signal_1);
axis([0,1000,-5,5]);
title('原始信号 ');subplot(4,1,2);                                          %Mix_Signal_1 中值滤波后信号
plot(Signal_Filter);
axis([0,1000,-5,5]);
title('中值滤波后的信号');%混合信号 Mix_Signal_2  中值滤波
Signal_Filter=medfilt1(Mix_Signal_2,10);
subplot(4,1,3);                                          %Mix_Signal_2 原始信号
plot(Mix_Signal_2);
axis([0,1000,-10,30]);
title('原始信号 ');subplot(4,1,4);                                          %Mix_Signal_2 中值滤波后信号
plot(Signal_Filter);
axis([0,1000,-10,30]);
title('中值滤波后的信号');

从上图可以看出,无论是对信号一还是对信号二,中值滤波的滤波效果都是很不错,特备是对于信号二,上升沿和下降失真比较的小。

现代滤波

维纳滤波

维纳滤波器是我们这里介绍的第一个现代滤波器。

传统的滤波器只能滤除信号和干扰频带没有重叠的情况,当信号和干扰频带有重叠的时候传统滤波器将无能为力,这时就需要用到现代滤波器。

现代滤波器利用信号和干扰的统计特征(如自相关函数、功率谱等)导出一套最佳估值算法,然后用硬件或软件予以实现。

维纳滤波是以均方误差最小(Least Mean Square,或简称LMS)为准则的,它根据过去观测值和当前观测值来估计信号的当前值,因此它的解形式是系统的传递函数或单位脉冲响应。

均方误差为:
E[e2(n)]=E[(s(n),s^(n))2]E\left[e^2(n)\right] = E\left[\left(s(n), \hat{s}(n)\right)^2\right] E[e2(n)]=E[(s(n),s^(n))2]

MATLAB代码:

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作维纳滤波
%
%***************************************************************************************%混合信号 Mix_Signal_1  维纳滤波
figure(5);
Rxx=xcorr(Mix_Signal_1,Mix_Signal_1);              %得到混合信号的自相关函数
M=100;                                                            %维纳滤波器阶数
for i=1:M                                                          %得到混合信号的自相关矩阵for j=1:Mrxx(i,j)=Rxx(abs(j-i)+N);end
end
Rxy=xcorr(Mix_Signal_1,Signal_Original_1);      %得到混合信号和原信号的互相关函数
for i=1:Mrxy(i)=Rxy(i+N-1);
end                                                                  %得到混合信号和原信号的互相关向量
h = inv(rxx)*rxy';                                              %得到所要涉及的wiener滤波器系数
Signal_Filter=filter(h,1, Mix_Signal_1);              %将输入信号通过维纳滤波器subplot(4,1,1);                                                  %Mix_Signal_1 原始信号
plot(Mix_Signal_1);
axis([0,1000,-5,5]);
title('原始信号 ');subplot(4,1,2);                                                  %Mix_Signal_1 维纳滤波后信号
plot(Signal_Filter);
axis([0,1000,-5,5]);
title('维纳滤波后的信号');%混合信号 Mix_Signal_2  维纳滤波
Rxx=xcorr(Mix_Signal_2,Mix_Signal_2);              %得到混合信号的自相关函数
M=500;                                                            %维纳滤波器阶数
for i=1:M                                                          %得到混合信号的自相关矩阵for j=1:Mrxx(i,j)=Rxx(abs(j-i)+N);end
end
Rxy=xcorr(Mix_Signal_2,Signal_Original_2);      %得到混合信号和原信号的互相关函数
for i=1:Mrxy(i)=Rxy(i+N-1);
end                                                                  %得到混合信号和原信号的互相关向量
h=inv(rxx)*rxy';                                              %得到所要涉及的wiener滤波器系数
Signal_Filter=filter(h,1, Mix_Signal_2);            %将输入信号通过维纳滤波器subplot(4,1,3);                                                  %Mix_Signal_2 原始信号
plot(Mix_Signal_2);
axis([0,1000,-10,30]);
title('原始信号 ');subplot(4,1,4);                                                  %Mix_Signal_2 维纳滤波后信号
plot(Signal_Filter);
axis([0,1000,-10,30]);
title('维纳滤波后的信号');

多次进行,可以看到统计特征的不利影响,即不稳定。时而效果是并不好的。事实上作者在源程序中对于信号2的处理也并不佳。

自适应滤波

维纳滤波器参数是固定的,适合于平稳随机信号。卡尔曼滤波器参数是时变的,适合于非平稳随机信号。然而,只有在信号和噪声的统计特性先验已知的情况下,这两种滤波技术才能获得最优滤波。在实际应用中,常常无法得到信号和噪声统计特性的先验知识。在这种情况下,自适应滤波技术能够获得极佳的滤波性能,因而具有很好的应用价值。

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作自适应滤波
%
%***************************************************************************************%混合信号 Mix_Signal_1 自适应滤波
figure(6);
N=1000;                                            %输入信号抽样点数N
k=100;                                                  %时域抽头LMS算法滤波器阶数
u=0.001;                                            %步长因子%设置初值
yn_1=zeros(1,N);                                  %output signal
yn_1(1:k)=Mix_Signal_1(1:k);                %将输入信号SignalAddNoise的前k个值作为输出yn_1的前k个值
w=zeros(1,k);                                        %设置抽头加权初值
e=zeros(1,N);                                        %误差信号%用LMS算法迭代滤波
for i=(k+1):NXN=Mix_Signal_1((i-k+1):(i));yn_1(i)=w*XN';e(i)=Signal_Original_1(i)-yn_1(i);w=w+2*u*e(i)*XN;
endsubplot(4,1,1);
plot(Mix_Signal_1);                              %Mix_Signal_1 原始信号
axis([k+1,1000,-4,4]);
title('原始信号1');subplot(4,1,2);
plot(yn_1);                                            %Mix_Signal_1 自适应滤波后信号
axis([k+1,1000,-4,4]);
title('自适应滤波后信号1');%混合信号 Mix_Signal_2 自适应滤波
N=1000;                                            %输入信号抽样点数N
k=500;                                                %时域抽头LMS算法滤波器阶数
u=0.000011;                                        %步长因子%设置初值
yn_1=zeros(1,N);                                  %output signal
yn_1(1:k)=Mix_Signal_2(1:k);                  %将输入信号SignalAddNoise的前k个值作为输出yn_1的前k个值
w=zeros(1,k);                                        %设置抽头加权初值
e=zeros(1,N);                                        %误差信号%用LMS算法迭代滤波
for i=(k+1):NXN=Mix_Signal_2((i-k+1):(i));yn_1(i)=w*XN';e(i)=Signal_Original_2(i)-yn_1(i);w=w+2*u*e(i)*XN;
endsubplot(4,1,3);
plot(Mix_Signal_2);                              %Mix_Signal_1 原始信号
axis([k+1,1000,-10,30]);
title('原始信号2');subplot(4,1,4);
plot(yn_1);                                            %Mix_Signal_1 自适应滤波后信号
axis([k+1,1000,-10,30]);
title('自适应滤波后信号2');

自适应滤波的滤波效果如下:

本程序是基于LMS算法的自适应滤波,从上图可以看出,滤波效果也是很不错的,特别是对于信号二,上升沿有失真,下降沿保持还可以,最要的是得到的波形十分的平滑。由此可见自适应滤波极具使用价值。

小波变换

%****************************************************************************************
%
%                信号Mix_Signal_1 和 Mix_Signal_2  分别作小波滤波
%
%***************************************************************************************%混合信号 Mix_Signal_1  小波滤波
figure(7);
subplot(4,1,1);
plot(Mix_Signal_1);                                %Mix_Signal_1 原始信号
axis([0,1000,-5,5]);
title('原始信号 ');subplot(4,1,2);
[xd,cxd,lxd] = wden(Mix_Signal_1,'sqtwolog','s','one',2,'db3');
plot(xd);                                                %Mix_Signal_1 小波滤波后信号
axis([0,1000,-5,5]);
title('小波滤波后信号 ');%混合信号 Mix_Signal_2  小波滤波
subplot(4,1,3);
plot(Mix_Signal_2);                                %Mix_Signal_2 原始信号
axis([0,1000,-10,30]);
title('原始信号 ');subplot(4,1,4);
[xd,cxd,lxd] = wden(Mix_Signal_2,'sqtwolog','h','sln',3,'db3');
plot(xd);                                                %Mix_Signal_2 小波滤波后信号
axis([0,1000,-10,30]);
title('小波滤波后信号 ');

对于信号二,小波的去噪效果非常不错,虽然得到波形不是很平滑,但是上升沿和下降沿保持的非常高,基本可以看到棱角

MATLAB的7种滤波方法(重制版)相关推荐

  1. matlab加权滤波,matlab实现七种滤波方法

    对于信号二,小波的去噪效果非常不错,虽然得到波形不是很平滑,但是上升沿和下降沿保持的非常高,基本可以看到棱角. %******************************************* ...

  2. 动力定位 matlab,matlab起重船动力定位系统滤波方法研究+源程序

    摘要船舶动力定位系统是指不借助锚泊系统,而利用自身推进装置有效地产生反作用力和力矩去抵抗风浪流和其它外力对船舶的作用,使船舶保持在设定位置和艏向,与传统的锚泊系统相比,有不受水深限制.机动性能好.定位 ...

  3. matlab怎样实现滤波,【转】matlab七种滤波方法实现和测试

    创建两个混合信号,便于更好测试滤波器效果.同时用七中滤波方法测试. 混合信号Mix_Signal_1 = 信号Signal_Original_1+白噪声. 混合信号Mix_Signal_2 = 信号S ...

  4. 随机森林matlab降维,七种降维方法

    之前介绍过关于降维和特征选择,这里对几种降维方法进行介绍,与之前的方法大致相同. ​1 缺失值比例 ​该方法的是基于包含太多缺失值的数据列包含有用信息的可能性较少.因此,可以将数据列缺失值大于某个阈值 ...

  5. matlab对信号的滤波方法

    https://blog.csdn.net/colapin/article/details/52840075: 关于信号的滤波方法: 1.巴特沃斯低通滤波器去噪 在[B,A]=butter(n,wn) ...

  6. matlab对信号滤波,matlab对信号的滤波方法

    https://blog.csdn.net/colapin/article/details/52840075: 关于信号的滤波方法: 1.巴特沃斯低通滤波器去噪 在[B,A]=butter(n,wn) ...

  7. PCL-- removal outliers(四种滤波方法)

    1. StatisticalOutlierRemoval Filter 对点云中的每个点进行统计分析 //微微修改一下官方文档的code,大体如下#include <iostream> # ...

  8. matlab的三种注释方法

    A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释的语句, 编辑器菜单Text-&g ...

  9. 微弱信号检测中四种降噪滤波方法的matlab实现

    用Matlab实现4种滤波降噪处理算法,信号为正弦信号叠加上白噪声,参数可自主定制. %matlab clear all;clc; fs=300; Time=128; t=0:1/fs:Time; f ...

  10. matlab散斑噪声,合成孔径雷达图像的散斑噪声滤波方法与流程

    本发明属于星载合成孔径雷达和光学图像信息处理领域,涉及一种新的合成孔径雷达图像的散斑噪声滤波方法. 背景技术: 合成孔径雷达(synthetic aperture radar,SAR)是一种高分辨的微 ...

最新文章

  1. 未经任何测试的源代码开放
  2. python glances来监控linux服务器CPU 内存 IO使用
  3. HP LoadRunner 11.00 新鲜尝
  4. cocos2d-x初探学习笔记(2)--重要概念及Test例子结构
  5. 光纤收发器和光电转换器有什么区别?
  6. duration java_Java Duration类| ofDays()方法与示例
  7. 纯CSS实现table表头固定(自创备忘)
  8. tracker服务器php,FastDFS-5.05 tracker服务器安装nginx+php
  9. html语言ppt,HTML语言课件.ppt
  10. 跨域访问的相关概念及解决方法
  11. Android状态页切换(数据加载中,数据加载失败,空数据)
  12. 2022秋招蚂蚁金服数据研发一面
  13. 解决VMware Workstation Pro15 无法在Windows上运行
  14. 【APPInventor\腾讯云】使用APPInventor开发连接腾讯云的安卓物联网遥控APP
  15. js base64解码JWT失败:VM273:1 Uncaught DOMException: Failed to execute 'atob' on 'Window': The string to
  16. ORACLE PL/SQL编程
  17. 【计算机网络】环回接口、lo网卡
  18. 从零学Java(9)之修饰符,小AD竟打起了钱的主意!
  19. 6C++11/C++14/C++17-王桂林-专题视频课程
  20. 一种刷下行流量的方式 [爱快 docker版]

热门文章

  1. 天锋w2019_三星看了想打人,华强北神机天锋W2019现世,专卖店都难辨真假
  2. ADAS技术市场总结展望(2021年-2022年)
  3. fmd单片机c语言教程,ft62f08x_c语言 FMD单片机C语言列子程序 - 下载 - 搜珍网
  4. 成功凤凰刷机刷出诺基亚E5系统版本042.014纯净简体中文版
  5. DelphiXe Ansistring使用注意事项
  6. Android Binder实战开发指南之开篇
  7. java生成excel图表
  8. Excel用控件动态控制图表
  9. Jmeter压力测试流程
  10. html返回顶部代码(简单)