matlab滤波程序

2019-04-26  本文已影响0人  carry_xz

使用matlab对数据进行滤波

数据与程序

主文件 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];
上一篇下一篇

猜你喜欢

热点阅读