medfilt1函数功能为一维中值滤波,最近在MATLAB R2018b中使用时,发现该函数已经不能支持直接输入复数进行滤波了,如下图在帮助文档中也有说明
在网上查询了好久,不知道为啥没有一点相关资料。后来下载了MATLAB R2010b进行安装,果然低版本的medfilt1函数就是支持输入复数,进入函数m文件,发现高低版本内部实现方式不同,但顺藤摸瓜、追根溯源一通,最后发现在哪个版本(高或低具体忘了)中,medfilt1函数中最终是调用了求中值函数median,这也是medfilt1的核心所在,只是对一段数据通过一个移动的窗不断进行median操作,看到这突然有点激动,用复数一试便知median是支持复数操作的,这就好办了,自己动手写一个medfilt1函数,为了与MATLAB库函数区别开,函数名为medfilt。
function [y] = medfilt(sig,n)
% input sig is a column vector
slen = length(sig);
y = zeros(slen,1);
if(mod(n,2)==0)
N = n/2;
stpt = zeros(N,1);
edpt = zeros(N-1,1);
sigex = [stpt;sig;edpt]; % 前补N个零,后补N-1个零
else
N = (n-1)/2;
adpt = zeros(N,1);
sigex = [adpt;sig;adpt]; % 前后各补N个零
end
for k = 1:slen
subsig = sigex(k:k+n-1);
y(k,1) = median(subsig);
end
end