Ich mache eine Post-hoc-Analyse eines Datensatzes, der aus einer Reihe von Filmbildern besteht, die durch ein stark periodisches Artefakt kontaminiert sind. Ich möchte dieses Artefakt aus meinen Frames entfernen.
Um das Plotten zu vereinfachen, habe ich gerade mein Array M
von Pixelwerten auf umgeformt [nframes, npixels]
und dann über alle Pixelwerte gemittelt, um einen 1D-Vektor zu erhalten m
. So sieht dieses Signal im Zeitbereich aus. Sie können die Schwingung im gezoomten Einschub ziemlich deutlich sehen.
Ich machte dann ein Periodogramm durch Aufnehmen Fm = rfft(m)
und zeichnete abs(Fm)**2
gegen die Frequenz. Ich sehe eine sehr scharfe Spitze bei ~ 1,5 Hz:
Neben der zeitlichen Periodizität scheint dieses Artefakt auch eine schwächere räumliche Komponente zu haben, da beim exakten Spitzenfrequenzwert eine gleichmäßige Phasenänderung über die x-Achse meiner Frames zu erfolgen scheint, so dass Pixel auf der rechts neigen dazu, Pixel links hinterherzuhinken:
Als Brute-Force-Ansatz habe ich versucht, jedes Pixel im Zeitbereich mit einem auf 1,5 Hz zentrierten Sperrfilter zu filtern. Ich habe einen Butterworth-Filter der Ordnung 4 mit kritischen Frequenzen von 1,46 und 1,52 Hz verwendet (ich bin mit dem Filterdesign nicht vertraut, daher bin ich mir sicher, dass es geeignetere Optionen gibt).
So sieht das mittlere Pixelsignal nach dem Filtern aus:
Und das entsprechende Periodogramm:
Der Sperrfilter reduziert das Artefakt einigermaßen gut, aber da es im Grunde genommen wie eine reine stationäre Sinuskurve aussieht, kann ich nicht anders, als zu glauben, dass ich es besser machen könnte, als nur diesen Teil des Frequenzraums zu dämpfen.
Meine anfängliche (sehr naive) Idee war, etwas zu tun wie:
- Holen Sie sich die Frequenz, Phase und Amplitude der Schwingung aus dem Fourier-Spektrum für jedes Pixel im Film
- Rekonstruieren Sie die Schwingung im Zeitbereich
- Subtrahieren Sie es von den Filmbildern
Mir ist klar, dass dies normalerweise nicht der Fall ist, da Interferenzen normalerweise nicht so spektral rein und zeitlich stationär sind, aber ich frage mich, ob dies in meinem Fall sinnvoll sein könnte.
Daten
Voller 16-Bit-TIFF-Stapel (~ 2 GB unkomprimiert)
Räumlich dezimierte 8-Bit-Version (~ 35 MB unkomprimiert)
x
, dann nehme ich Fx = rfft(x)
und erhalte die Leistung alsabs(Fx)**2