性能仿真数据处理,常常要用到滤波
如下是经常用的滤波算法代码,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