Realwertiges Klingeln beim Auffüllen einer ungeraden FFT

13

Ich versuche also, einen Frequenzbereich-Interpolator zu schreiben, der den Frequenzgang eines Signals und die inversen Transformationen auf null setzt. Es gibt zwei Fälle, mit denen ich mich befassen muss:

  1. Antwort mit Länge - muss das da es nicht eindeutig ist. Also kopiere ich den negativen Teil des Spektrums und füge dazwischen Nullen hinzu.Fs/2n*(interp-1)-1
  2. Antwort mit ungerader Länge - Es gibt kein Bin. also die positive / negative Frequenz auf und fügen Sie Nullen dazwischen ein.Fs/2n*(interp-1)

Der Code, der das Auffüllen mit Nullen vornimmt, ist hier zu sehen

// Copy negative frequency components to end of buffer and zero out middle
//  inp    - input buffer of complex floats
//    n    - transform size
//  interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
    if ((n % 2) == 0) {
        memmove(inp + n*interp - n/2, inp + n/2,     n/2*sizeof(cfloat_t));
        memset (inp + n/2 + 1, 0,       (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero

        inp[n/2]          /= 2.0;
        inp[n*interp-n/2] /= 2.0;
    } else {
        memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
        memset (inp + (n+1)/2, 0,         (n*(interp-1))*sizeof(cfloat_t));
    }
}

Der erste Fall funktioniert gut, teste ich es auf einem Chirp - Signal und es interpoliert ganz gut, es ist ein wenig numerischer Lärm, aber es ist rund um durch eine FFT ausgelöst , so etwas kann man tun (erster oder so von der Signal Show):50μs

Das Problem ist die Transformation mit ungerader Länge. Ich erhalte eine ziemlich abscheuliche Einschwingreaktion nur für die realen Samples (wieder , real):50μs

Der imaginäre Kanal weist eine kleine Welligkeit auf, die aber bei weitem nicht so schlimm ist:

Es ist, als hätte ich meine in einem Fall , aber es gibt keine , also bin ich sehr verwirrt. Hat jemand irgendwelche Gedanken?Fs/2Fs/2

gct
quelle
Ihre Parzellen sind etwas schwer zu sehen, da sie geschrumpft sind.
Jason R
@Jason Entschuldigung, ich dachte, sie wären verlinkt. Ich habe den HTML-Code angepasst, damit sie jetzt in voller Größe angezeigt werden können.
gct
3
Haben Sie einen Code oder eine Beispieldatei für das, was Sie als Eingabe verwenden? Dabei ist zu beachten, dass die von der DFT angenommenen Randbedingungen eingehalten werden. Insbesondere besteht eine inhärente Annahme, dass das interessierende Signal periodisch ist. Wenn es also eine Diskontinuität zwischen dem ersten und dem letzten Sample in der Eingabe ungerader Länge gibt, können Sie ein Klingeln sehen, wie Sie es beobachtet haben. Es ist möglich, dass das Sample mit gerader Länge von Anfang bis Ende kontinuierlicher ist, sodass Sie dieses Phänomen nicht sehen.
Jason R
Ich habe keine Daten in einem Format, das andere problemlos verarbeiten können, aber ich denke, Sie haben Recht. Ich bin gerade zur Arbeit gekommen und habe meinen Code neu kompiliert / eine Testeingabe (10Hz-100Hz Zwitschern über 1 Sekunde) neu generiert und den Code erneut ausgeführt, ohne das Klingeln zu bekommen. Ich habe Ihren Kommentar gesehen und die Frequenz auf 10-100.314 geändert und sehe jetzt sowohl bei geraden als auch bei ungeraden Transformationen ein Klingeln.
gct
1
Haben Sie versucht, eine Fensterfunktion auf Ihre Daten anzuwenden? Das reduziert normalerweise das Klingeln.
MarkSci

Antworten:

1

Indem Sie Hochfrequenz-Bins auf Null setzen, haben Sie das Spektrum des Signals effektiv mit einer Rechteckfunktion multipliziert. Die Multiplikation in der Frequenz ist die Faltung in der Zeit und das Fourier-Paar eines Rektums ist ein Sinc. Was Sie also wirklich getan haben, war, das Zeitdomänensignal mit einem sinc zu falten, dessen Breite der Hauptkeule des sinc umgekehrt proportional zur Länge des rect ist. Dies ist der Grund, warum die zahlreichen Filterdesign-Techniken wie Parks-McClellan das sogenannte "Übergangsbereich" - oder "Übergangsbereich" -Band so gestalten, dass sich der Frequenzgang des Filters nicht sofort ändert. Diese Filterdesign-Techniken sind wichtig, da der "ideale" Filter, wie Sie ihn verwendet haben, solche unerwünschten Effekte im Zeitbereich hat.

user27575
quelle
0

Ein Schritt im Frequenzbereich wird als Welligkeit im Zeitbereich angezeigt. Wenn Sie Ihre Frequenzdaten mit einer Fensterfunktion (z. B. Hamming-Fenster) glätten, sollten die Welligkeiten erheblich reduziert werden.

Jian
quelle