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:
- 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.
n*(interp-1)-1
- Antwort mit ungerader Länge - Es gibt kein Bin. also die positive / negative Frequenz auf und fügen Sie Nullen dazwischen ein.
n*(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):
Das Problem ist die Transformation mit ungerader Länge. Ich erhalte eine ziemlich abscheuliche Einschwingreaktion nur für die realen Samples (wieder , real):
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?
quelle
Antworten:
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.
quelle
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.
quelle