Ich habe eine echte Vektor-Zeitreihe x der Länge T und ein Filter h der Länge t < < T. h ist ein Filter im Fourier-Raum, real und symmetrisch. Es ist ungefähr 1/f.Fourier-Raum Filterung
Ich möchte x mit h filtern, um y zu erhalten.
Angenommen t == T und FFTs der Länge T könnten in den Speicher passen (keine davon ist wahr). Zu meiner gefilterten x in Python, ich tun würde:
import numpy as np
from scipy.signal import fft, ifft
y = np.real(np.ifft(np.fft(x) * h)))
Da die Bedingungen nicht halten, habe ich versucht, den folgenden Hack:
- auswählen padding Größe P < t/2, wählen Sie eine Blockgröße B, so dass B + 2P eine gute FFT-Größe ist
- Skalierung h über Spline-Interpolation zur Größe B + 2P> t (h_skaliert)
- y = []; Loop:
- Nehmen Block der Länge B + 2P von x (genannt x_b)
- Perform y_b = IFFT (fft (x_b) * h_scaled)
- Tropfen padding P von jeder Seite des y_b und Verketten mit y
- Select nächste x_b mit zuletzt überlappend von P
Ist das eine gute Strategie? Wie wähle ich die Polsterung P auf eine gute Weise aus? Was ist der richtige Weg, dies zu tun? Ich weiß nicht viel Signalverarbeitung. Das ist eine gute Chance zu lernen.
Ich benutze cuFFT, um Dinge zu beschleunigen, so wäre es toll, wenn der Großteil der Operationen FFTs sind. Das eigentliche Problem ist 3D. Ich mache mir auch keine Gedanken über Artefakte aus einem akausalen Filter.
Danke, Paul.
Danke für die Überlappungsspeichereferenz. Ich hatte darüber in Press et al., Numerical Recipes, in Bezug auf die Zeitdomänenfilterung gelesen, und ich war mir nicht sicher, wie dies dem Frequenzbereich zugeordnet werden sollte. Ich bin mir nicht sicher, ob ich fallen lassen sollte: 1) warum die zweite Hälfte von y_b eher als die Enden, 2) in deinem anderen SO-Post, du lässt die erste Hälfte fallen. – Paul
Mein Filter h ist von einem Durchschnitt über Rohdaten abgeleitet, mit h (f) ~ 1/f und Phasen auf 0. Ich filtere ein synthetisches Signal mit diesem Filter, um ein Spektrum zu erhalten, das meinen Rohdaten ähnelt. Ich bin mir nicht sicher, wie ich diesen Filter im Zeitbereich gestalten soll. Eine Sache, auf die Sie hingewiesen haben, ist, dass ift (h) an einem Ende besser Null sein sollte, um Artefakte zu vermeiden. Ich werde das überprüfen, da es sehr wahrscheinlich nicht ist. Gibt es ein Analogon zum Anwenden eines Hamming-Fensters in der Zeitdomäne auf eine Fenstermethode in der Frequenzdomäne (Ihr erstes Beispiel in Ihrem anderen SO-Post)? – Paul
Yeesh - tut mir leid, dass ich die erste Hälfte/zweite Hälfte vermasselt habe. Ich aktualisierte diese Korrektur und einige Gedanken über die Erzeugung eines gut erzogenen "h". – mtrw