美文网首页
matlab滤波程序

matlab滤波程序

作者: carry_xz | 来源:发表于2019-04-26 20:22 被阅读0次

    使用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];
    

    相关文章

      网友评论

          本文标题:matlab滤波程序

          本文链接:https://www.haomeiwen.com/subject/bwtcnqtx.html