medfilt1函數(shù)功能為一維中值濾波,最近在MATLAB R2018b中使用時,發(fā)現(xiàn)該函數(shù)已經(jīng)不能支持直接輸入復數(shù)進行濾波了,如下圖在幫助文檔中也有說明

1.png
在網(wǎng)上查詢了好久,不知道為啥沒有一點相關(guān)資料。后來下載了MATLAB R2010b進行安裝,果然低版本的medfilt1函數(shù)就是支持輸入復數(shù),進入函數(shù)m文件,發(fā)現(xiàn)高低版本內(nèi)部實現(xiàn)方式不同,但順藤摸瓜、追根溯源一通,最后發(fā)現(xiàn)在哪個版本(高或低具體忘了)中,medfilt1函數(shù)中最終是調(diào)用了求中值函數(shù)median,這也是medfilt1的核心所在,只是對一段數(shù)據(jù)通過一個移動的窗不斷進行median操作,看到這突然有點激動,用復數(shù)一試便知median是支持復數(shù)操作的,這就好辦了,自己動手寫一個medfilt1函數(shù),為了與MATLAB庫函數(shù)區(qū)別開,函數(shù)名為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