我正尝试用另一种语言重现冗长的MATLAB代码,该语言没有内置等效项,即无相滤波器filtfilt()。我正在尝试通过简单的过滤(或卷积)操作来重新广播该函数,以便可以轻松地重现它。我知道此过滤操作等效于正向过滤,然后是反向过滤,但是我发现数据边缘存在细微差异。特别:
filtfilt()
data = [1 1 1 2 2 3 5 7 1 1 1 1 1]; ker = [2 1 1]; a = filtfilt(ker,1,data) b = fliplr( filter( ker, 1, fliplr( filter(ker, 1, data) ) ) ) % a = % % 16 18 21 29 39 57 66 68 42 28 16 16 16 % % b = % % 11 16 21 29 39 57 66 68 42 28 16 12 8
我曾尝试在一个或两个过滤操作之前在数据的一端或两端用零填充。我认为我可能会遗漏一些明显的东西,但找不到它。
filtfilt算法匹配过滤器上的初始条件,以最大程度地减少(从doc filtfilt)的开始和结束瞬变。如果您键入edit filtfilt,则可以看到代码- 有一个函数getCoeffsAndInitialConditions(b,a,Npts)可以向您显示此代码的详细信息。
doc filtfilt
edit filtfilt
getCoeffsAndInitialConditions(b,a,Npts)