资源简介

基于滑动窗口可以实现对一维曲线平滑及降噪,根据有用信号的频率,选取合适的窗口宽度。

资源截图

代码片段和文件信息

function avin=smooth(indist)  %in为输入的二维矩阵,dist为窗口的大小

if dist == 1   %判定窗口的大小是否为1,如果为1则返回
  avin=in;
  return
end

[nm]=size(in); % 将输入矩阵0轴和1轴输入给n,m
if n == 1       % 如果n=1,则将矩阵转置
  in=in‘;
  [nm]=deal(mn);  % 交换nm的值
  flip=1;
else
  flip=0;
end
in=full(in);

%       创建滤波器
idist=2*fix((dist-1)/2)+1;    %考虑窗口长度是奇数偶数的两种情况,因为窗口的宽度总是为奇数,如果输入的是偶数程序会将偶数转换成奇数
xdist=dist-idist;             

if xdist == 0                  %如果滤波器窗口数目是奇数的情况执行以下操作
  weights=ones(dist1)/dist;   %创建一个平均滤波器,滤波器窗口的宽度为输入的窗口输入
else                           % 如果滤波器窗口数目是偶数的情况执行以下操作
  weights=ones(idist+21);     %将滤波器的窗口数目转化成dist+1成为奇数,并使每一个元素等于1
  weights([1end])=0.5*xdist;  % 使滤波器首尾元素等于0.5
  weights=weights/dist;        %使滤波器归一化处理
end

if length(weights) > n       %判定滤波器窗口数目是否大于输入数列的长度,一般情况下窗口数目都是远远小于数列的长度,所以该判定模块一般都是跳过
  avin=mean(in);
  avin=avin(ones(n1):);
  return
end

append=(length(weights)-1)/2;  %append等于滤波器的一半大小
avin=zeros(nm);               % 构建一个n*m的0矩阵

for ii=1:size(in2)           % 求取输入阵列的列数,对每一列采取循环的方式分别进行滤波
  temp1=conv(in(:ii)weights);  % 把滤波器和输入数列进行卷积运算,结果是一个长度为(输入数列长度+2*append)的数列
  avin(:ii)=temp1(append+1:end-append);   % 截取temp1数列从append+1到end-append中间部分的数列,此时长度应该等于输入数列的长度
end

%       对两端边界值进行修正
for ii=1:append                               
  %fact=1/sum(weights(1:end-append-1+ii));
  %avin(ii:)=avin(ii:)*fact;
  %avin(end-ii+1:)=avin(end-ii+1:)*fact;
  fact=sum(weights(1:append+1-ii));          %计算修订因子fact,边界不同位置上的数采用不同的修正因子
  avin(ii:)=avin(ii:)+in(ii:)*fact;       %修订输入数列的前边界的值
  avin(end-ii+1:)=avin(end-ii+1:)+in(end-ii+1:)*fact;   %修订输入数列后边界的值
end

if flip                               %如果输入的n等于1,则将结果转置
  avin=avin‘;
end

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2129  2012-11-21 14:54  smooth.m

----------- ---------  ---------- -----  ----

                 2129                    1


评论

共有 条评论