MATLAB实现滑动平均滤波法的实例(移动平均滤波器)

原始信号

0.03    -1.46    -0.26    -0.47    -1.46    -0.06    -0.47    -1.27    0.15    -0.47    -1.47    -0.01    -0.47    -1.27    0.17    -0.63    -1.37    0.15    -0.88    -1.07    0.25    -0.88    -1.27    0.25    -0.88    -1.07    0.4    -1.08    -1.07    0.11    -1.28    -0.87    0.21    -1.28    -0.94    0.36    -1.28    -0.46    0.25    -1.28    -0.46    0.23    -1.23    -0.46    -0.07    -1.31    -0.46    0.23    -1.31    -0.46    0.13    -1.49    -0.46    -0.47    -1.39    -0.46    -0.47    -1.44    -0.36    0.03    -1.44    -0.26    0.03    -1.56    -0.26    -0.47    -1.41    -0.26    -0.47    -1.6    -0.26    -0.47    -1.27    0.07    -0.47    -1.42    0.15    -0.88    -1.27    0.3    -1.08    -1.07    0.18    -1.34    -0.46    1.86    6.65    9.06    8.03    7.14    7.79    4.79    2.88    3.08    1.55    1.26    1.96    0.44    0.96    1.45    -0.09    1.16    0.94    -0.26    1.16    -0.47    -1.27    0.1    -1.28    -0.46    0.18    -1.31    -0.46    -0.12    -1.49    -0.01    -0.68    -1.27    0.04    -1.08    -0.46    0.23    -1.28    -0.46    -0.47    -1.46    -0.31    -0.47    -1.45    0.15    -0.58    -1.47    0.15    -0.88    -1.27    0.25    -0.88    -1.27    0.35    -1.08    -1.17    0.22    -1.08    -1.07    0.11    -1.28    -1.07    0.4    -1.28    -2.49    -7.36    -11.01    -9.98    -7.39    -9.19    -6.94    -4.07    -4.6    -3.7    -1.98    -3.31    -2.69    -1.3    -2.7    -2.49    -1.13    -2.5    -2.08    -0.68    -1.69    -0.46    0.03    -1.39    -0.46    0.21    -1.31    -0.46    0.08    -1.39    -0.77    0.13    -1.49    -0.46    0.23    -1.49    -0.46    -0.02    -1.49    -0.41    0.18    -1.46    -0.46    -0.47    -1.42    -0.26    -0.47    -1.44    -0.26    -0.47    -1.55    -0.01    -0.58    -1.42    -0.46    -0.47    -1.45    -0.06    -0.5    -1.27    0.15    -0.88    -1.27    0.35    -1.28    0.55    7.48    8.33    8.76    7.83    6.83    5.72    3.48    1.97    2.54    1.02    1.36    1.86    0.34    0.96    0.94    -0.06    1.16    0.34    -0.06    0.51    -1.28    -0.46    0.13    -1.44    -0.26    -0.47    -1.45    0.06    -0.7    -1.22    0.32    -1.18    -0.46    0.07    -1.54    -0.31    -0.47    -1.27    0.15    -0.98    -1.17    0.26    -1.23    -0.46    -0.07    -1.34    -0.46    -0.07    -1.3    -0.16    -0.47    -1.49    -0.26    -0.47    -1.45    -0.06    -0.47    -1.47    0.04    -0.68    -1.42    0.07    -0.88    -2.61    -7.15    -10.3    -10.34    -7.3    -8.58    -7.75    -4.11    -4.32    -3.91    -1.63    -3.01    -3.1    -1.21    -2.6    -2.49    -1.06    -2.3    -2.08    -0.66    -1.49    -1.17    0.12    -1.28    -0.46    0.31    -1.34    -0.46    0.06    -1.49    -0.46    -0.07    -1.39    -0.41    -0.47    -1.49    -0.46    -0.47    -1.44    -0.36    -0.12    -1.46    -0.06    -0.47    -1.42    -0.21    -0.47    -1.47    -0.06    -0.53    -1.27    0.17    -0.68

 上面是最初采集到的原始信号,接下来对其进行可视化

matlab程序:

%% 可视化
clearvars
clc
close
y0=[0.03	-1.46	-0.26	-0.47	-1.46	-0.06	-0.47	-1.27	0.15	-0.47	-1.47	-0.01	-0.47	-1.27	0.17	-0.63	-1.37	0.15	-0.88	-1.07	0.25	-0.88	-1.27	0.25	-0.88	-1.07	0.4	-1.08	-1.07	0.11	-1.28	-0.87	0.21	-1.28	-0.94	0.36	-1.28	-0.46	0.25	-1.28	-0.46	0.23	-1.23	-0.46	-0.07	-1.31	-0.46	0.23	-1.31	-0.46	0.13	-1.49	-0.46	-0.47	-1.39	-0.46	-0.47	-1.44	-0.36	0.03	-1.44	-0.26	0.03	-1.56	-0.26	-0.47	-1.41	-0.26	-0.47	-1.6	-0.26	-0.47	-1.27	0.07	-0.47	-1.42	0.15	-0.88	-1.27	0.3	-1.08	-1.07	0.18	-1.34	-0.46	1.86	6.65	9.06	8.03	7.14	7.79	4.79	2.88	3.08	1.55	1.26	1.96	0.44	0.96	1.45	-0.09	1.16	0.94	-0.26	1.16	-0.47	-1.27	0.1	-1.28	-0.46	0.18	-1.31	-0.46	-0.12	-1.49	-0.01	-0.68	-1.27	0.04	-1.08	-0.46	0.23	-1.28	-0.46	-0.47	-1.46	-0.31	-0.47	-1.45	0.15	-0.58	-1.47	0.15	-0.88	-1.27	0.25	-0.88	-1.27	0.35	-1.08	-1.17	0.22	-1.08	-1.07	0.11	-1.28	-1.07	0.4	-1.28	-2.49	-7.36	-11.01	-9.98	-7.39	-9.19	-6.94	-4.07	-4.6	-3.7	-1.98	-3.31	-2.69	-1.3	-2.7	-2.49	-1.13	-2.5	-2.08	-0.68	-1.69	-0.46	0.03	-1.39	-0.46	0.21	-1.31	-0.46	0.08	-1.39	-0.77	0.13	-1.49	-0.46	0.23	-1.49	-0.46	-0.02	-1.49	-0.41	0.18	-1.46	-0.46	-0.47	-1.42	-0.26	-0.47	-1.44	-0.26	-0.47	-1.55	-0.01	-0.58	-1.42	-0.46	-0.47	-1.45	-0.06	-0.5	-1.27	0.15	-0.88	-1.27	0.35	-1.28	0.55	7.48	8.33	8.76	7.83	6.83	5.72	3.48	1.97	2.54	1.02	1.36	1.86	0.34	0.96	0.94	-0.06	1.16	0.34	-0.06	0.51	-1.28	-0.46	0.13	-1.44	-0.26	-0.47	-1.45	0.06	-0.7	-1.22	0.32	-1.18	-0.46	0.07	-1.54	-0.31	-0.47	-1.27	0.15	-0.98	-1.17	0.26	-1.23	-0.46	-0.07	-1.34	-0.46	-0.07	-1.3	-0.16	-0.47	-1.49	-0.26	-0.47	-1.45	-0.06	-0.47	-1.47	0.04	-0.68	-1.42	0.07	-0.88	-2.61	-7.15	-10.3	-10.34	-7.3	-8.58	-7.75	-4.11	-4.32	-3.91	-1.63	-3.01	-3.1	-1.21	-2.6	-2.49	-1.06	-2.3	-2.08	-0.66	-1.49	-1.17	0.12	-1.28	-0.46	0.31	-1.34	-0.46	0.06	-1.49	-0.46	-0.07	-1.39	-0.41	-0.47	-1.49	-0.46	-0.47	-1.44	-0.36	-0.12	-1.46	-0.06	-0.47	-1.42	-0.21	-0.47	-1.47	-0.06	-0.53	-1.27	0.17	-0.68];
t=1:max(size(y0));

plot(t,y0)
title("原始信号")

 

  可以看到原始信号存在周期性的干扰,所以根据文章《数字滤波算法》,可以采用滑动平均滤波算法(也叫移动平均滤波)。

MATLAB自带函数filter程序

%%
clearvars
clc
close
y0=[0.03	-1.46	-0.26	-0.47	-1.46	-0.06	-0.47	-1.27	0.15	-0.47	-1.47	-0.01	-0.47	-1.27	0.17	-0.63	-1.37	0.15	-0.88	-1.07	0.25	-0.88	-1.27	0.25	-0.88	-1.07	0.4	-1.08	-1.07	0.11	-1.28	-0.87	0.21	-1.28	-0.94	0.36	-1.28	-0.46	0.25	-1.28	-0.46	0.23	-1.23	-0.46	-0.07	-1.31	-0.46	0.23	-1.31	-0.46	0.13	-1.49	-0.46	-0.47	-1.39	-0.46	-0.47	-1.44	-0.36	0.03	-1.44	-0.26	0.03	-1.56	-0.26	-0.47	-1.41	-0.26	-0.47	-1.6	-0.26	-0.47	-1.27	0.07	-0.47	-1.42	0.15	-0.88	-1.27	0.3	-1.08	-1.07	0.18	-1.34	-0.46	1.86	6.65	9.06	8.03	7.14	7.79	4.79	2.88	3.08	1.55	1.26	1.96	0.44	0.96	1.45	-0.09	1.16	0.94	-0.26	1.16	-0.47	-1.27	0.1	-1.28	-0.46	0.18	-1.31	-0.46	-0.12	-1.49	-0.01	-0.68	-1.27	0.04	-1.08	-0.46	0.23	-1.28	-0.46	-0.47	-1.46	-0.31	-0.47	-1.45	0.15	-0.58	-1.47	0.15	-0.88	-1.27	0.25	-0.88	-1.27	0.35	-1.08	-1.17	0.22	-1.08	-1.07	0.11	-1.28	-1.07	0.4	-1.28	-2.49	-7.36	-11.01	-9.98	-7.39	-9.19	-6.94	-4.07	-4.6	-3.7	-1.98	-3.31	-2.69	-1.3	-2.7	-2.49	-1.13	-2.5	-2.08	-0.68	-1.69	-0.46	0.03	-1.39	-0.46	0.21	-1.31	-0.46	0.08	-1.39	-0.77	0.13	-1.49	-0.46	0.23	-1.49	-0.46	-0.02	-1.49	-0.41	0.18	-1.46	-0.46	-0.47	-1.42	-0.26	-0.47	-1.44	-0.26	-0.47	-1.55	-0.01	-0.58	-1.42	-0.46	-0.47	-1.45	-0.06	-0.5	-1.27	0.15	-0.88	-1.27	0.35	-1.28	0.55	7.48	8.33	8.76	7.83	6.83	5.72	3.48	1.97	2.54	1.02	1.36	1.86	0.34	0.96	0.94	-0.06	1.16	0.34	-0.06	0.51	-1.28	-0.46	0.13	-1.44	-0.26	-0.47	-1.45	0.06	-0.7	-1.22	0.32	-1.18	-0.46	0.07	-1.54	-0.31	-0.47	-1.27	0.15	-0.98	-1.17	0.26	-1.23	-0.46	-0.07	-1.34	-0.46	-0.07	-1.3	-0.16	-0.47	-1.49	-0.26	-0.47	-1.45	-0.06	-0.47	-1.47	0.04	-0.68	-1.42	0.07	-0.88	-2.61	-7.15	-10.3	-10.34	-7.3	-8.58	-7.75	-4.11	-4.32	-3.91	-1.63	-3.01	-3.1	-1.21	-2.6	-2.49	-1.06	-2.3	-2.08	-0.66	-1.49	-1.17	0.12	-1.28	-0.46	0.31	-1.34	-0.46	0.06	-1.49	-0.46	-0.07	-1.39	-0.41	-0.47	-1.49	-0.46	-0.47	-1.44	-0.36	-0.12	-1.46	-0.06	-0.47	-1.42	-0.21	-0.47	-1.47	-0.06	-0.53	-1.27	0.17	-0.68];

t=1:max(size(y0));

windowSize = 3; 
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y1 = filter(b,a,y0);

windowNum=3;
subplot(windowNum,1,1)
plot(t,y0)
title("原始信号")

subplot(windowNum,1,2)
plot(t,y1)
title("滤波后")

subplot(windowNum,1,3)
plot(t,y0)
hold on
plot(t,y1)
title("对比")

 运行结果:

从第二张图片可以看到滤波后的曲线蛮光滑的,从第三张图片的对比可以看到滤波效果可以算是差强人意。 

自己编写滤波程序

接下来为了后面方便移植到C语言,所以尝试自己完成函数filter的功能,根据函数filter的帮助文档,了解到

移动平均值滤波器沿数据移动长度为 windowSize 的窗口,并计算每个窗口中包含的数据的平均值。以下差分方程定义向量 x 的移动平均值滤波器:

y(n)=\frac{1}{windowSize}*[x(n)+x(n-1)+...+x(n-(windowSize-1))].

 编写fun_myFilter函数:

function [outputArg] = fun_myFilter(windowSize,inputArg)
%FUN_MYFILTER windowSize-窗口大小;inputArg-原始信号
%   实现MATLAB自带函数filter的移动平均滤波器
window=zeros(1,windowSize);
size_in=size(inputArg);
p_data=1;
outputArg=zeros(size_in);

for i=1:max(size_in)
    window(p_data)=inputArg(i);
    outputArg(i)=sum(window)/windowSize;
    p_data=p_data+1;
    if p_data>windowSize
        p_data=1;
    end
end

end

fun_myFilter与filter的对比

%% fun_myFilter与filter的对比
clearvars
clc
close
y0=[0.03	-1.46	-0.26	-0.47	-1.46	-0.06	-0.47	-1.27	0.15	-0.47	-1.47	-0.01	-0.47	-1.27	0.17	-0.63	-1.37	0.15	-0.88	-1.07	0.25	-0.88	-1.27	0.25	-0.88	-1.07	0.4	-1.08	-1.07	0.11	-1.28	-0.87	0.21	-1.28	-0.94	0.36	-1.28	-0.46	0.25	-1.28	-0.46	0.23	-1.23	-0.46	-0.07	-1.31	-0.46	0.23	-1.31	-0.46	0.13	-1.49	-0.46	-0.47	-1.39	-0.46	-0.47	-1.44	-0.36	0.03	-1.44	-0.26	0.03	-1.56	-0.26	-0.47	-1.41	-0.26	-0.47	-1.6	-0.26	-0.47	-1.27	0.07	-0.47	-1.42	0.15	-0.88	-1.27	0.3	-1.08	-1.07	0.18	-1.34	-0.46	1.86	6.65	9.06	8.03	7.14	7.79	4.79	2.88	3.08	1.55	1.26	1.96	0.44	0.96	1.45	-0.09	1.16	0.94	-0.26	1.16	-0.47	-1.27	0.1	-1.28	-0.46	0.18	-1.31	-0.46	-0.12	-1.49	-0.01	-0.68	-1.27	0.04	-1.08	-0.46	0.23	-1.28	-0.46	-0.47	-1.46	-0.31	-0.47	-1.45	0.15	-0.58	-1.47	0.15	-0.88	-1.27	0.25	-0.88	-1.27	0.35	-1.08	-1.17	0.22	-1.08	-1.07	0.11	-1.28	-1.07	0.4	-1.28	-2.49	-7.36	-11.01	-9.98	-7.39	-9.19	-6.94	-4.07	-4.6	-3.7	-1.98	-3.31	-2.69	-1.3	-2.7	-2.49	-1.13	-2.5	-2.08	-0.68	-1.69	-0.46	0.03	-1.39	-0.46	0.21	-1.31	-0.46	0.08	-1.39	-0.77	0.13	-1.49	-0.46	0.23	-1.49	-0.46	-0.02	-1.49	-0.41	0.18	-1.46	-0.46	-0.47	-1.42	-0.26	-0.47	-1.44	-0.26	-0.47	-1.55	-0.01	-0.58	-1.42	-0.46	-0.47	-1.45	-0.06	-0.5	-1.27	0.15	-0.88	-1.27	0.35	-1.28	0.55	7.48	8.33	8.76	7.83	6.83	5.72	3.48	1.97	2.54	1.02	1.36	1.86	0.34	0.96	0.94	-0.06	1.16	0.34	-0.06	0.51	-1.28	-0.46	0.13	-1.44	-0.26	-0.47	-1.45	0.06	-0.7	-1.22	0.32	-1.18	-0.46	0.07	-1.54	-0.31	-0.47	-1.27	0.15	-0.98	-1.17	0.26	-1.23	-0.46	-0.07	-1.34	-0.46	-0.07	-1.3	-0.16	-0.47	-1.49	-0.26	-0.47	-1.45	-0.06	-0.47	-1.47	0.04	-0.68	-1.42	0.07	-0.88	-2.61	-7.15	-10.3	-10.34	-7.3	-8.58	-7.75	-4.11	-4.32	-3.91	-1.63	-3.01	-3.1	-1.21	-2.6	-2.49	-1.06	-2.3	-2.08	-0.66	-1.49	-1.17	0.12	-1.28	-0.46	0.31	-1.34	-0.46	0.06	-1.49	-0.46	-0.07	-1.39	-0.41	-0.47	-1.49	-0.46	-0.47	-1.44	-0.36	-0.12	-1.46	-0.06	-0.47	-1.42	-0.21	-0.47	-1.47	-0.06	-0.53	-1.27	0.17	-0.68];

t=1:max(size(y0));


windowSize = 3; 
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y1 = filter(b,a,y0);

y2 = fun_myFilter(windowSize,y0);

windowNum=3;
subplot(windowNum,1,1)
plot(t,y0)
hold on
plot(t,y1)
title("filter")

subplot(windowNum,1,2)
plot(t,y0)
hold on
plot(t,y2)
title("fun\_myFilter")

subplot(windowNum,1,3)
plot(t,y1)
hold on
plot(t,y2)
title("filter和fun\_myFilter对比")

结果如下:

 可以看到最后两个曲线是重合的,所以fun_myFilter算是滑动平均滤波

  • 13
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 滑动平均滤波是一种常用的信号处理方,用于平滑信号中的噪声。在MATLAB中,可以使用以下代码实现滑动平均滤波。 首先,定义一个输入信号向量x和滑动窗口大小n。 ```matlab x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % 输入信号向量 n = 3; % 滑动窗口大小 ``` 然后,使用for循环遍历输入信号向量,计算每个窗口的平均值,并将结果存储在一个新的向量中。 ```matlab y = zeros(1, length(x)); % 存储滤波后的信号 for i = 1:length(x) if i <= n y(i) = mean(x(1:i)); % 计算前n个元素的平均值 else y(i) = mean(x(i-n+1:i)); % 计算窗口大小为n的平均值 end end ``` 最后,可以通过绘制输入信号向量和滑动平均滤波后的信号向量来比较它们。 ```matlab plot(x, 'b'); % 绘制输入信号向量 hold on; plot(y, 'r'); % 绘制滑动平均滤波后的信号向量 legend('原始信号', '滤波后的信号'); ``` 执行上述代码,即可实现滑动平均滤波并绘制结果图。通过调整滑动窗口大小n,可以改变平滑程度。 ### 回答2: 滑动平均滤波是一种常用的信号处理方,它可以用来平滑时间序列数据,去除噪音和杂波。在MATLAB中,可以通过以下步骤实现滑动平均滤波: 1. 定义输入信号。首先,我们需要定义一个输入信号的向量,例如x = [1, 2, 3, 4, 5]。这个向量包含了我们要平滑处理的原始数据。 2. 定义滑动窗口大小。滑动平均滤波是通过取窗口内数据的平均值来实现的。我们需要定义一个滑动窗口的大小,例如w = 3。这意味着我们每次取3个数据的平均值来平滑数据。 3. 实施滑动平均滤波。使用循环来遍历输入信号向量x,并在每个位置上取滑动窗口大小w内的数据。然后,计算这些数据的平均值,并将其存储在一个新的向量y中。例如,对于第一个滑动窗口,我们需要计算x(1)、x(2)和x(3)的平均值,并将其存储在y(2)中。然后,移动窗口一个位置,计算x(2)、x(3)和x(4)的平均值,并将其存储在y(3)中。以此类推,直到遍历完整个输入信号向量x。 4. 输出滤波后的结果。最后,我们可以输出滤波后的结果y,这个向量包含了经过滑动平均滤波处理后的数据。 下面是一个具体的示例代码: ```matlab x = [1, 2, 3, 4, 5]; % 定义输入信号 w = 3; % 定义滑动窗口的大小 y = zeros(1, length(x)-w+1); % 初始化输出向量 for i = 1:length(y) y(i) = mean(x(i:i+w-1)); % 计算滑动窗口内数据的平均值 end disp(y); % 输出滤波后的结果 ``` 运行这段代码,我们得到的输出结果为[2, 3, 4],这就是经过滑动平均滤波处理后的数据。 ### 回答3: 在Matlab中编写滑动平均滤波,可以使用以下步骤: 1. 首先,确定数据集的大小和滑动窗口的大小。滑动窗口是指在数据集中移动的固定大小的窗口。 2. 使用一个for循环来迭代遍历数据集中的每个数据点。 3. 在每个循环迭代中,确定滑动窗口的起始和结束索引。起始索引可以通过当前数据点的索引减去滑动窗口大小的一半来获得。 4. 确保滑动窗口保持在数据集的边界内。如果滑动窗口超出了数据集的边界,可以根据需要调整滑动窗口的大小或在边界处进行补零。 5. 计算滑动窗口内数据点的平均值。可以使用mean函数来计算滑动窗口内数据点的平均值。 6. 将计算得到的平均值存储在一个新的数组中,以便后续分析。可以使用一个空的数组,在每个循环迭代中将平均值添加到该数组中。 7. 循环迭代结束后,你将得到一个存储了滑动窗口平均值的数组。 下面是一个简单的示例代码: ```matlab data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % 数据集 window_size = 3; % 滑动窗口大小 filtered_data = zeros(size(data)); % 存储滤波后的数据 for i = 1:length(data) start_index = i - floor(window_size/2); end_index = i + floor(window_size/2); % 确保滑动窗口在数据集范围内 if start_index < 1 start_index = 1; end if end_index > length(data) end_index = length(data); end % 计算滑动窗口内数据点的平均值 average = mean(data(start_index:end_index)); % 将平均值存储在新数组中 filtered_data(i) = average; end disp(filtered_data); % 输出滤波后的数据 ``` 这段代码将根据给定的数据集和滑动窗口大小计算滑动平均滤波,并输出滤波后的数据。注意,这个例子是简化的,实际中你可能需要根据具体需求进行优化和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值