MATLAB ist filtfilt () - Algorithmus
Ich versuche zu reproduzieren lange Teil von MATLAB-code in einer anderen Sprache, die keine built-in Entsprechung der phaseless filter filtfilt()
. Ich versuche, die neu-Besetzung der Funktion in Bezug auf die einfache Filterung (oder Faltung) Operationen, so kann ich einfach nachvollziehen.
Ich verstehe, dass dieser Filtervorgang entspricht forward-Filterung, gefolgt von reverse-filtern, aber ich sehe die kleinen Unterschiede an den Kanten der Daten. Speziell:
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
Ich habe versucht, die Polsterung der Daten mit Nullen an einem oder an beiden enden, bevor Sie eine oder beide der Filter-Operationen. Ich denke, ich bin wahrscheinlich etwas fehlt offensichtlich, aber kann nicht es vor Ort.
- Ich hatte das gleiche Problem mit
scipy.signal.filtfilt
. Es gibt zwei wichtige Dinge, diefiltfilt
hat, zusätzlich zu der Ausführung des filters vorwärts und rückwärts: 1. gelten "ungerade" Polsterung, um bei start und Ende des Signals; 2. bestimmen Sie den Anfangszustandzi
und leitet Sie an den eigentlichen filter. Details finden Sie in diesem einfache filtfilt Umsetzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den filtfilt Algorithmus entspricht dem ursprünglichen Bedingungen auf dem filter zu minimieren, die start-und end-Transienten (aus der
doc filtfilt
). Wenn Sieedit filtfilt
sehen Sie den code - es ist eine FunktiongetCoeffsAndInitialConditions(b,a,Npts)
, zeigen Ihnen die details des diese.