使用matlab对数据进行滤波
数据与程序
- data.xlsx 数据使用excel保存,确保第一列为时间(单调递增),第二列为数据。
- main_test.m 主程序,与其他滤波器函数放同一文件夹
- oneLevelFilter.m 一阶滤波器文件
- moveAverageFilter.m 移动平均滤波
- oneLevelFilter.m 限幅滤波
主文件 main_test.m
clc;close all;
file_name = 'data.xlsx'
% 文件名称,可以修改为目标target.xlsx文件
% 注意文件内部有两列,第一列为时间(标题用time),第二列是数据(标题用data)
Data = xlsread(file_name);
%% 原始数据图
% time:n*1向量(单调递增)
% data: n*1向量
time = Data(:,1);
data = Data(:,2);
figure('name','原数据')
subplot(3,1,1)
plot(time,data);
title('data 数据')
subplot(3,1,2)
v = [0;diff(data)./diff(time)];
plot(time,v);
title('data_v 数据变化速度')
subplot(3,1,3)
a = [0;diff(v)./diff(time)];
plot(time,a);
title('data_a 数据变化的加速度')
%% 移动平均滤波
[s,v,a,time1]=moveAverageFilter(time,data,5);
figure('name','移动平均滤波')
subplot(3,1,1)
plot(time1,s);
title('data 数据')
subplot(3,1,2)
plot(time1,v);
title('data_v 数据变化速度')
subplot(3,1,3)
plot(time1,a);
title('data_a 数据变化的加速度')
%% 一阶滤波
[s,v,a,time1]=oneLevelFilter(time,data,0.2);
figure('name','一阶滤波')
subplot(3,1,1)
plot(time1,s);
title('data 数据')
subplot(3,1,2)
plot(time1,v);
title('data_v 数据变化速度')
subplot(3,1,3)
plot(time1,a);
title('data_a 数据变化的加速度')
%% 限幅滤波
[s,v,a,time1]=limitAmpFilter(time,data,100);
figure('name','限幅滤波')
subplot(3,1,1)
plot(time1,s);
title('data 数据')
subplot(3,1,2)
plot(time1,v);
title('data_v 数据变化速度')
subplot(3,1,3)
plot(time1,a);
title('data_a 数据变化的加速度')
一阶滤波器文件 oneLevelFilter.m
function [s,v,a,time1]=oneLevelFilter(time,data,gin)
% 一阶滤波,data为输入数据(n行1列),time为时间序列(n行1列)
% gin为滤波器参数一般取0.08
% 返回值为滤波后的数据s,数据变化率v,数据变化加速度a,重新插值后的时间序列time1
persistent y0
if isempty(y0)
y0 = data(1);
end
time1 = time(1):(time(end)-time(1))/(length(time)-1):time(end);
data = interp1(time,data,time1);
s=[];
for ii = 1:length(data)
snow = gin*(data(ii)-y0)+y0;
s = [s;snow];
y0 = snow;
end
clear y0;
v = diff(s)/(time1(2)-time(1));
v = [0;v];
a = diff(v)/(time1(2)-time(1));
a = [0;a];
移动平均滤波 moveAverageFilter.m
function [s,v,a,time1]=moveAverageFilter(time,data,n)
% 移动平均滤波,输入数据data(n行1列,不含时间),time为时间序列
% n滤波数据采样点(越大越平滑,过大容易失真)
% 返回元数据平滑后的数据s ,a是s的导数,v是s二阶导数
time1 = time(1):(time(end)-time(1))/(length(time)-1):time(end);
data = interp1(time,data,time1);
s=[];
for ii = 1:length(data)
if ii<n
ang_mv = sum(data(1:ii))/ii;
else
ang_mv = sum(data(ii-n+1:ii))/n;
end
s = [s;ang_mv];
end
v = diff(s)/(time1(2)-time1(1));
v = [0;v];
a = diff(v)/(time1(2)-time1(1));
a = [0;a];
限幅滤波 limitAmpFilter.m
function [s,v,a,time1]=limitAmpFilter(time,data,vlimit)
s = [data(1)];
time1 = time(1):(time(end)-time(1))/(length(time)-1):time(end);
data = interp1(time,data,time1);
delt_time=(time1(2)-time1(1));
for ii = 2:length(data)
if data(ii)-s(ii-1)>vlimit*delt_time
s(ii) = s(ii-1)+0.5*sign(data(ii)-s(ii-1))*vlimit*delt_time;
else
s(ii) = data(ii);
end
end
v = diff(s')/delt_time;
v = [0;v];
a = diff(v)/delt_time;
a = [0;a];