240307_007_移动平均滤波算法_脚本代码

性能仿真数据处理,常常要用到滤波

如下是经常用的滤波算法代码,MTALB脚本,有需要的朋友可以借鉴,祝一切都好!!

% 滑动平均滤波算法
% Inputs: 
%   X, 向量
%   p, 滑动平均的滑动窗口宽度,正整数
%   varargin, 可选输入为'filter'和'end_val',默认为'filter'
% Outputs:
%   滑动平均后的向量,size与输入的向量的size保持一致
function Z = moving_average( X, p, varargin )
% 输入X必须为待滑动平均的向量
if ~isvector( X )
    error( 'First input must a vector' );
end
% 判断是行向量还是列向量,当为列向量时,转置
if isequal( X, X( : )' )
    is_col = false;
else
    is_col = true;
    X = X';
end
% p必须为正整数,滑动窗口的宽度
if p ~= round( p ) || p <= 0
    error( 'Second argument has to be a strictly positive integer' )
end
% 当可选输入为空时,默认为'filter'
if isempty( varargin )
    method = 'filter';
elseif strcmp( varargin{ 1 }, 'filter' ) || strcmp( varargin{ 1 }, 'end_val' )
    method = varargin{ 1 };
else
    error( 'Invalid method: 3rd argument can be omitted or has to be ''filter'' or ''end_val''' )
end
% 开始进行滑动平均算法
n = 2 * p + 1;
% 向左移动1~p个单位,形成p个新的向量
% 向右移动1~p个单位,形成p个新的向量
% 向左和向右移动时都存在边界问题,这里是通过和边界值相同的方式进行赋值
idx = 1:length( X );
for j = 1:p
    minus( j, : ) = X( max( 1, idx - j ) );
    plus( j, : ) = X( min( length( X ), idx + j ) );
end
% p个向左移动的向量、p个向右移动的向量、1个原有的向量相加并取平均
Zt = ( sum( minus, 1 ) + sum( plus, 1 ) + X ) / n;
% 当可选输入为'end_val'时,最后的p个值取未进行滤波的值
switch ( method )
    case ( 'filter' )
        Z = Zt;
    case ( 'end_val' )
        Z = Zt;
        Z( 1:p ) = X( 1:p );
        Z( end  - p + 1:end  ) = X( end  - p + 1:end  );
end
% 当输入为列向量时,最后的结果还是以列向量形式输出
if is_col
    Z = Z';
end

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

simpleoval

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值