Matlab信号处理(平滑滤波)

Matlab信号处理(平滑滤波)

1.使用matlab的内有函数进行滤波

移动平均滤波

原理:滑动平均法(moving average)也叫做移动平均法、平均法、移动平均值滤波法等等,是一种时间域思想上的信号光滑方法。算法思路为,将该点附近的采样点做算数平均,作为这个点光滑后的值。
在这里插入图片描述
上图是将窗体设置为3时的滑动平均流程(窗体设置最好为奇数)
算法实现:

y(n)=1/3(x(n−1)+x(n)+x(n+1))

matlab实现:

clear;
close all;
clc;
x = linspace(-pi,pi,100);
y = sin(2*pi*x);
n = randn(size(x));
t = y+n;
y1 = movmean(t,8);
subplot(211);
plot(x,t);
title('带噪声输入信号');
subplot(212);
plot(x,y1);
title('平滑滤波后的信号');

结果展示:
在这里插入图片描述
将窗体从8设置为3时可以观看效果:

在这里插入图片描述

利用卷积函数进行滤波

利用卷积原理就是对输入噪声波形和【1/N_Window … 1/N_Window】(N_Window个1/N_Window)进行卷积
原理和移动平均滤波相同,也是求一个区域的平均值!!!可知与上述用平滑函数的结果相同!只是头部信号
和尾部信号不同,是因为movmean()函数在处理边缘时,采用减小窗口的方式,而conv()相当于在两端补零!!

%%
clear;
close all;
clc;
N_Window = 5;                   %设置窗体数
x = linspace(-pi,pi,100);
y = cos(2*pi*x);
n = randn(size(x));
t = y+n;                        %杂波信号

z  = 1/N_Window*ones(1,N_Window);
y1 = conv(t,z,"same");

y2 = movmean(t,5);

subplot(211);
plot(x,t);
title('带噪声输入信号');
subplot(212);
plot(x,y1,x,y2,'r');
title('平滑滤波后的信号');

在这里插入图片描述

2.0Savitzky-Golay法,又叫做平滑滤波器,最著名的就是5点3次滤波器。这是一种基于时间域上的多项式拟合,来消除噪声的方法。

将数据进行多项式拟合,进行数据的平滑滤波;(利用matlab自带的smoothdata(A,‘sgolay’)函数就可以实现Savitzky-Golay法滤波。但是,该函数只支持N点2次的滤波)
%%
clear
clc
close all

N_window = 9;%窗口长度(最好为奇数)

t = 0:0.1:10;
A = cos(2*pi*0.5*t)+0.4*rand(size(t));

%matlab自带的n点2次插值
B1 = smoothdata(A,'sgolay' ,N_window);
figure(1)
plot(t,A,t,B1)                                                      %%拟合原理进行滤波

在这里插入图片描述

### 关于滑动平均滤波算法在MATLAB中的实现 #### 滑动平均滤波原理 滑动平均滤波通过计算一组连续数据点的均值来平滑信号,从而减少随机噪声的影响。这种方法特别适合用于实时处理和噪声水平较低的情况[^2]。 #### MATLAB代码实例 下面是一个简单的MATLAB脚本,展示了如何应用滑动平均滤波器去除模拟电压测量中的噪音: ```matlab % 初始化参数设置 clear all; dt = 0.2; % 时间间隔 t = 0:dt:10; % 创建时间向量 Nsamples = length(t); % 获取样本数量 windowSize = 5; % 定义窗口大小 Avgsaved = zeros(Nsamples, 1); % 存储过滤后的结果 Xmsaved = zeros(Nsamples, 1); % 原始数据存储 for k = windowSize:Nsamples % 模拟读取传感器数据 (此处用GetVolt()函数表示) xm = sin(2*pi*t(k)/5)+randn(size(t(k)))*0.5; % 添加高斯白噪声 % 计算当前窗口内的平均值作为输出 avg = mean(xm(k-windowSize+1:k)); Avgsaved(k) = avg; % 保存经过滤的数据 Xmsaved(k) = xm; % 保存原始带噪数据 end % 绘制图形对比原信号与滤波后效果 figure; subplot(2,1,1); plot(t,Xmsaved,'r-*'); title('Original Noisy Signal'); xlabel('Time(s)'); ylabel('Amplitude'); subplot(2,1,2); plot(t(Avgsaved~=0),Avgsaved(Avgsaved~=0),'b-o'); title(['Filtered Signal with Window Size=',num2str(windowSize)]); xlabel('Time(s)'); ylabel('Amplitude'); ``` 此段代码首先定义了一个固定的时间序列` t `以及相应的采样周期` dt `,接着创建了两个数组分别用来储存未经处理(` XmSaved`) 和已经过滑窗平均处理过的 (`AvgSaved`) 数据集。循环体内部实现了对每一个新到来的数据点执行一次新的移动平均运算,并更新对应的存储位置;最后利用绘图功能直观展示两者之间的差异。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值