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?