Warum ist es eine schlechte Idee, FFT-Bins auf Null zu setzen?


72

Es ist sehr einfach, ein Signal zu filtern, indem eine FFT durchgeführt wird, einige der Bins auf Null gesetzt werden und dann eine IFFT durchgeführt wird. Zum Beispiel:

t = linspace(0, 1, 256, endpoint=False)
x = sin(2 * pi * 3 * t) + cos(2 * pi * 100 * t)
X = fft(x)
X[64:192] = 0
y = ifft(X)

Die Hochfrequenzkomponente wird durch dieses "brickwall" -FFT-Filter vollständig entfernt.

Aber ich habe gehört, dass dies keine gute Methode ist.

  • Warum ist es im Allgemeinen eine schlechte Idee?
  • Gibt es Umstände, unter denen es eine gute oder gute Wahl ist?

[ wie von Pichenetten vorgeschlagen ]

Antworten:


74

Das Nullsetzen von Bins im Frequenzbereich entspricht dem Multiplizieren mit einem rechteckigen Fenster im Frequenzbereich. Die Multiplikation mit einem Fenster im Frequenzbereich entspricht der zirkulären Faltung durch die Transformation dieses Fensters im Zeitbereich. Die Transformation eines rechteckigen Fensters ist die Sinc-Funktion ( ). Beachten Sie, dass die Sinc-Funktion viele große Wellen und Wellen aufweist, die die gesamte Breite der Zeitbereichsapertur ausdehnen. Wenn ein Zeitbereichsfilter, der all diese Ripples (Klingeln) ausgeben kann, eine "schlechte Idee" ist, dann ist dies auch das Nullsetzen von Bins.sin(ωt)/ωt

Diese Welligkeiten sind für jeden spektralen Inhalt am größten, der "zwischen Bins" liegt oder nicht ganzzahlig-periodisch in der FFT-Aperturbreite ist. Wenn Ihre ursprünglichen FFT-Eingabedaten also ein Fenster für Daten sind, die in diesem Fenster nicht periodisch sind (z. B. die meisten nicht synchron abgetasteten "realen" Signale), werden diese bestimmten Artefakte durch Nullstellen von Bins erzeugt.

Eine andere Sichtweise ist, dass jeder FFT-Ergebnisbereich eine bestimmte Frequenz der Sinuswelle im Zeitbereich darstellt. Das Nullsetzen eines Bins führt also zum gleichen Ergebnis wie das Subtrahieren dieser Sinuswelle oder gleichermaßen das Addieren einer Sinuswelle mit einer exakten FFT-Bin-Mittenfrequenz, jedoch mit der entgegengesetzten Phase. Beachten Sie, dass, wenn die Häufigkeit einiger Inhalte in der Zeitdomäne in der FFT-Breite nicht rein ganzzahlig ist, der Versuch, sie durch Addition der Inversen einer genau ganzzahligen periodischen Sinuswelle zu annullieren, keine Stille erzeugt, sondern eher etwas Ähnliches eine "Schlag" -Note (AM-modulierte Sinuswelle einer anderen Frequenz). Auch hier wird wohl nicht das gesucht.

Umgekehrt, wenn Ihr ursprüngliches Zeitdomänensignal nur aus wenigen reinen unmodulierten Sinuskurven besteht, die in der FFT-Aperturbreite genau ganzzahlig sind, werden durch Nullstellen der FFT-Bins die angegebenen ohne Artefakte entfernt.


3
Diese Antwort hat gute Eigenschaften, aber ich würde mich eher auf den Gibbs-Effekt konzentrieren.
Jim Clay

4
Ein Versuch, eine Antwort auf den Gibbs-Effekt zu erhalten, wurde bereits hier gestellt: dsp.stackexchange.com/questions/1144/…
hotpaw2

@ hotpaw2 Das ist eine gute Erklärung. Ich brauche jedoch einen Verweis darauf und finde einige Schwierigkeiten, einen zu identifizieren. Dies ist der Grund, warum wir Zeitbereichsfilterung durchführen, anstatt im Frequenzbereich zu arbeiten. (Auch die Zeitdomäne kann Echtzeit sein.) Allerdings scheint niemand damit zu beginnen, dies anzugeben!
Hugh

Wie kann dies mit der Fenstermethode für das Filterdesign in Beziehung gesetzt werden?
Filipe Pinto

Vergleichen Sie die Transformation eines Von-Hann-Fensters (ua) mit der eines rechteckigen Fensters. Viel bessere Filterreaktion im Allgemeinen, insbesondere zwischen FFT-Bins im Stoppband. Im Allgemeinen ist ein abrupter Nullabgleich in der Nähe der Übergänge schlechter als ein Nullabgleich.
hotpaw2

3

Diese Frage hat mich auch lange verwirrt. Die Erklärung von @ hotpaw2 ist gut. Das einfache Experiment mit matlab könnte Sie interessieren.

https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html


aktualisierte Information.

Um zu verifizieren, dass diese Tatsache einfach ist, müssen wir nur das Spektrum der Impulsantwort eines idealen (?) Bandpassfilters, das gerade FFT-Bins auf Null setzt, vorsichtig beobachten. Warum muss ich das Adverb "vorsichtig" hinzufügen? Wenn wir nur die gleiche Größe der FFT verwenden, um die Antwort des Impulses zu beobachten, werden wir getäuscht, wie in 1 gezeigt . Wenn wir jedoch die Ordnung der DFT addieren, wenn wir die Ausgabe des Filters beobachten, dh die Impulsantwort mit Null auffüllen, können wir das sogenannte Gibbs-Phänomen finden, Wellen im Frequenzbereich, wie in Fig. 2 dargestellt .

Die Ergebnisse stammen tatsächlich aus dem Fenstereffekt. Wenn Sie das Problem vollständig verstehen möchten, lesen Sie bitte Kapitel 7.6 und Kapitel 10.1-10.2 der DSP-Bibel (1). Zusammenfassend werden hier drei wichtige Punkte genannt.

  1. Fenstergröße und Reihenfolge der DFT (FFT) sind völlig unabhängig. Mischen Sie sie nicht zusammen.
  2. Die Eigenschaften des Fensters (Typ / Größe) bestimmen die Form der DTFT. (Bsp. breitere Hauptkeule führt zu einem breiteren Einschwingbereich im Frequenzgang.)
  3. DFT ist nur die Abtastung von DTFT im Frequenzbereich. Darüber hinaus ist das Spektrum der DFT umso dichter, je höher die Ordnung der DFT ist.

Mit Hilfe des dichteren Spektrums in Abb. 2 können wir also durch die Maske des idealen (gefälschten) Bandpassfilters sehen.

Bildbeschreibung hier eingebenBetrügerisch Freq. Antwort.

Bildbeschreibung hier eingebenGibbs-Phänomen in Freq. Antwort.

(1) Alan V. Oppenheim und Ronald W. Schafer. 2009. Discrete-Time Signal Processing (3. Aufl.). Prentice Hall Press, Upper Saddle River, New Jersey, USA.

fps = 15;

LPF = 1;
HPF = 2;

n = -511:512;
n0 = 0;
imp = (n==n0);

NyquistF = 1/2*fps;

%% Ideal BPF
tmp_N = 512;
tmp_n = 0:1:tmp_N-1;
freq = ( n .* fps) ./ tmp_N;
F = fft(imp, tmp_N);  
F_bpf = IdealBandpassFilter(F, fps, LPF, HPF);
imp_rep =[real(ifft(F_bpf))'];

% Zero padding.
imp_rep2 =[zeros(1,2048) real(ifft(F_bpf))' zeros(1,2048)];

N = 2^nextpow2(length(imp_rep));
F = fft(imp_rep,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Mis leading Freq Response');


N = 2^nextpow2(length(imp_rep2));
F = fft(imp_rep2,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Zero Padding (DFT) with more points');

%% Function
function filered_signal = IdealBandpassFilter(input_signal, fs, w1, w2)

    N = length(input_signal);
    n = 0:1:N-1;
    freq = ( n .* fs) ./ N;

    filered_signal = zeros(N, 1);

    for i = 1:N
        if freq(i) > w1 & freq(i) < w2
            filered_signal(i) = input_signal(i);
        end

    end
end

Kann dies in einen Kommentar umgewandelt werden?
Endolith

Entschuldigung, ich habe nicht genug Ruf. Die Erklärung in der URL stammt ebenfalls von mir. Ich möchte nur einen Testcode bereitstellen, der den schlechten Einfluss von Welligkeit sichtbar machen kann.
Po-wei Huang

1

FFT liefert eine schlechte Zeitauflösung, dh es gibt keine Informationen darüber, zu welcher Zeit diese bestimmte Frequenz existiert. Es gibt Informationen zu vorhandenen Frequenzkomponenten für eine bestimmte Signaldauer.

Durch Nullstellen von Bins in der FFT ergibt sich eine schlechte Auflösung nach der IFFT im Zeitbereich.


Es gibt jedoch Rechenschwierigkeiten, wenn ein sehr langes Signal zuerst fft und dann ifft dauert. Um Zitters / Ringing zu vermeiden, muss die Filterung eines Signals reibungslos vom Durchlassband zum Stoppband erfolgen.
Itta Gouthami

"FFT ergibt eine schlechte Zeitauflösung" FFT ergibt keine Zeitauflösung, es handelt sich um eine Spektralbereichstransformation und gibt daher, wie nachfolgend erwähnt, nur Informationen über Frequenzkomponenten eines Signals.
EdParadox

Die von einer FFT bereitgestellte Auflösung ist die Länge ihres Fensters. Alles außerhalb des Fensters der FFT wird nicht als innerhalb des Fensters der FFT aufgelöst.
Hotpaw2
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.