几种常用信号平滑去噪的方法(附Matlab代码)

2020年8月更新:增加一个时域和频域的转换关系图,增加相应小节1.5
2021年8月更新:增加第6章小波去噪的内容

信号在实际测量中,难免会混入各种噪声。通常我们希望去除高频的随机噪声,或者是偏离正常测量太大的离群误差,以获得低频的测量数据。下面介绍几种常用的信号平滑去噪的方法。

还是惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算法感兴趣才写此博客。所以如果有错误,欢迎在评论区指正,不胜感激。本文主要关注于算法的实现,对于实际应用等问题本人没有任何经验,所以也不再涉及。

1 滑动平均法

本章参考目录
1《数字信号处理》-胡广书
2《Digital Signal Processing - A Practical Guide For Engineers and Scientists》 - Steven W.Smith

1.0 移动平均法的方法原理

作为开篇第一个方法,会夹带一些数字信号处理的基本方法,可能会导致篇幅比较啰嗦,之后几章我会尽量挑重点的讲解。

滑动平均法(moving average)也叫做移动平均法、平均法、移动平均值滤波法等等,是一种时间域思想上的信号光滑方法。算法思路为,将该点附近的采样点做算数平均,作为这个点光滑后的值。
在这里插入图片描述
一般窗口为对称窗口,防止出现相位偏差。窗口一般为奇数。
以3点平均(窗口长度为3)公式为例,原数据为x,平滑后的数据为y:
y ( n ) = 1 / 3 ∗ ( x ( n − 1 ) + x ( n ) + x ( n + 1 ) ) y(n)=1/3*( x(n-1)+x(n)+x(n+1) ) y(n)=1/3(x(n1)+x(n)+x(n+1))
对y(n)和y(n+1)相减,可以得到另一种计算形式:
y ( n + 1 ) = y ( n ) − 1 3 x ( n − 1 ) + 1 3 x ( n + 2 ) y(n+1)=y(n)-\frac{1}{3}x(n-1)+\frac{1}{3}x(n+2) y(n+1)=y(n)31x(n1)+31x(n+2)
当然这两者都是等价的。

1.1 matlab内自带函数实现移动平均法

matlab有两个函数实现滑动平均法,一个是smoothdata()函数,一个是movmean()函数。
以窗口长度为5为例,smoothdata()函数调用方法为:

y = smoothdata( x , 'movmean' , 5 );

但是这个smoothdata函数实际上是调用了movmean()函数。所以如果直接使用的话,直接用movmean()会更快。
movmean()函数的调用方法为:

y = movmean( x , 5 );

下面以一个加噪声的正弦信号为例:

%移动平均滤波
clear
clc
close all

N_window = 5;%窗口长度(最好为奇数)
t = 0:0.1:10;
A = cos(2*pi*0.5*t)+0.3*rand(size(t));
B1 = movmean(A,N_window);
figure(1)
plot(t,A,t,B1)

在这里插入图片描述

1.2 利用卷积函数conv()实现移动平均法

根据之前的公式,我们可以看到
y ( n ) = 1 / 3 ∗ ( x ( n − 1 ) + x ( n ) + x ( n + 1 ) ) y(n)=1/3*( x(n-1)+x(n)+x(n+1) ) y(n)=1/3(x(n1)+x(n)+x(n+1))
就相当于一个对x和向量[1/3 1/3 1/3]做卷积。
可以验证:

N_window = 5;%窗口长度(最好为奇数)
t = 0:0.25:10;%时间
A = cos(2*pi*0.5*t)+0.3*rand(size(t));
B1 = movmean(A,N_window);

F_average = 1/N_window*ones(1,N_window);%构建卷积核
B2 = conv(A,F_average,'same');%利用卷积的方法计算
figure(2)
plot(t,B1,t,B2)

在这里插入图片描述
中间部分两者完全一致,但是两端有所差别。主要是因为,movmean()函数在处理边缘时,采用减小窗口的方式,而conv()相当于在两端补零。所以如何处理边缘也是值得注意的。

1.3 利用filter滤波函数实现移动平均法

首先介绍一下Z变换。以向前的滑动平均为例(这里中间值不是n而是n+1,所以相位会移动)。
y ( n ) = 1 / 3 ∗ ( x ( n ) + x ( n + 1 ) + x ( n + 2 ) ) y(n)=1/3*( x(n)+x(n+1)+x(n+2) ) y(n)=1/3(x(n)+x(n+1)+x(n+2))
它的Z变换可以简单的理解为,把x(n+k)替换为z^(-k),即
H ( z ) = 1 3 ( z 0 + z − 1 + z − 2 ) H(z)=\frac{1}{3}(z^{0}+z^{-1}+z^{-2}) H(z)=31(z0+z1+z2)

因此对于filter滤波函数,输入的格式为:

y = filter(b,a,x)

其中b和a的定义为:
H ( z ) = b 1 + b 2 ⋅ z − 1 + b 3 ⋅ z − 2 + ⋯ + b n ⋅ z − n + 1 1 + a 2 ⋅ z − 1 + a 3 ⋅ z − 2 + ⋯ + a m ⋅ z − m + 1 H(z)=\frac{b_1+b_2\cdot z^{-1}+b_3\cdot z^{-2}+\cdots +b_{n}\cdot z^{-n+1}}{1+a_2\cdot z^{-1}+a_3\cdot z^{-2}+\cdots +a_{m}\cdot z^{-m+1}} H(z)=1+a2z1+a3

  • 389
    点赞
  • 2595
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: MATLAB是一款强大的科学计算软件,应用广泛,包括信号处理方面。在信号处理中,去噪是一个重要的步骤,可以提高信号质量、提升信号的可靠性。MATLAB提供了许多常用去噪算法,下面将简单介绍并汇总几个常用去噪代码: 1.小波去噪:小波去噪是目前最广泛应用的去噪方法之一,MATLAB提供了多种小波变换函数和小波去噪函数,如wavedec、waverec、wthresh等,可以根据需要进行调用。 2.中值滤波:中值滤波是最简单快速的一种去噪方法MATLAB提供了medfilt1、medfilt2等函数实现中值滤波。 3.均值滤波:均值滤波是一种简单的去噪方法,在MATLAB中可通过fspecial、imfilter等函数实现。 4.高斯滤波:高斯滤波可以平滑噪声信号MATLAB提供了fspecial、imfilter等函数实现高斯滤波。 5.卡尔曼滤波:卡尔曼滤波是一种适用于线性系统的滤波方法,可以降低信号噪声和误差,MATLAB提供了kalman和ekf等函数实现卡尔曼滤波。 除以上几种方法外,还有其他各种去噪方法和算法,如低通滤波、高通滤波、小波包去噪、多小波去噪、时域滤波等。这些方法和算法都可以在MATLAB中实现,可以根据实际需求进行选择。 ### 回答2: MATLAB是一个很强大的数学软件,专门用于计算机数据分析和数字信号处理。噪声是信号处理中常见的一种信号,对于信号质量有很大的影响。因此,去噪是数字信号处理中一个非常重要的问题。在MATLAB中,有很多的去噪算法可供选择,比如小波去噪、中值滤波、均值滤波、高斯滤波等。以下是一些MATLAB去噪代码的汇总。 1. 小波去噪: 小波去噪信号分析中是非常常用的一种方法MATLAB中也内置了小波变换函数。下面是一个基于小波去噪算法的MATLAB代码: ```matlab %读入数据,并添加噪声 data=load('example.mat'); data=data+0.1*randn(size(data)); %小波去噪 level=5; threshold=0.1; [c,l]=wavedec(data,level,'db4'); for i=1:level index = [sum(l(1:i-1))+1:sum(l(1:i))]; c(index) = wthresh(c(index), 'h', threshold); end y = waverec(c, l, 'db4'); ``` 2. 中值滤波: 中值滤波是一种基于排序的滤波方法,可以有效去除噪声。MATLAB中也提供了相应的函数medfilt1,下面是一个示例代码: ```matlab %读入数据,并添加噪声 data=load('example.mat'); data=data+0.1*randn(size(data)); %中值滤波 window_size=5; y=medfilt1(data,window_size); ``` 3. 均值滤波: 均值滤波是一种简单的滤波方法,可以消除一部分噪声。MATLAB中也提供了相应的函数filter2,使用时需要指定滤波器的大小。下面是示例代码: ```matlab %读入数据,并添加噪声 data=load('example.mat'); data=data+0.1*randn(size(data)); %均值滤波 window_size=[5,5]; h=fspecial('average',window_size); y=imfilter(data,h) ``` 4. 高斯滤波 高斯滤波是一种模糊滤波方法,可以消除高斯噪声。MATLAB中也提供了相应的函数fspecial和imfilter,使用时需要指定滤波器的大小和标准差。下面是示例代码: ```matlab %读入数据,并添加噪声 data=load('example.mat'); data=data+0.1*randn(size(data)); %高斯滤波 window_size=[5,5]; sigma=2; h=fspecial('gaussian',window_size,sigma); y=imfilter(data,h) ``` 综上所述,MATLAB提供了丰富的去噪算法和函数,可以根据不同的应用场景选择合适的去噪方法。在实际应用中,需要根据数据情况和需求进行调整,以达到最佳去噪效果。 ### 回答3: matlab是一个广泛使用的科学和工程计算软件,在信号处理和图像处理领域有着广泛的应用。噪声是在信号处理和图像处理领域中常见的问题,因此matlab提供了许多去噪算法和工具包。 下面是一些常见的matlab去噪代码汇总,供大家参考: 1. 均值滤波器:该算法可以通过将每个像素点周围的像素点与其平均值进行比较来平滑图像。matlab提供了imfilter函数来实现。 2. 中值滤波器:该算法使用了中值在一定程度上抵消图像中的噪声。在matlab中,可以使用medfilt2函数来实现。 3. 小波去噪算法:小波是一种能够将信号或图像分解成不同频率分量的数学方法,经过处理后可以将图像中的噪声去除。在matlab中,可以使用wden函数来实现。 4. 基于局部像素组合方法去噪算法:这些算法通常利用了像素的相似性来处理图像。在matlab中,可以使用BM3D和TNRD两个工具包来实现。 5. 基于稀疏表示的去噪算法:这些算法充分利用了稀疏表示来消除噪声。在matlab中,可以使用KSVD和OMP两个工具包来实现。 总之,matlab提供了各种各样的去噪算法和工具包,可用于处理不同类型的信号和图像,具有广泛的应用前景。但是,在使用这些工具包和算法时,我们需要了解算法的基本原理,以及如何根据我们的应用场景进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值