原始信号
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 的移动平均值滤波器:
编写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算是滑动平均滤波