Jadi saya mencoba untuk menulis interpolator domain frekuensi yang nol-bantalan respon frekuensi sinyal dan transformasi terbalik. Ada dua kasus yang harus saya tangani:
- Bahkan-panjang respon - harus membagi bin karena itu ambigu. Jadi saya menyalin bagian negatif dari spektrum, dan menambahkan nol di antaranya.
n*(interp-1)-1
- Respon ganjil-panjang - tidak ada bin jadi hanya membagi frekuensi positif / negatif dan masukkan nol di antara mereka.
n*(interp-1)
Kode yang melakukan zero-padding dapat dilihat di sini
// 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));
}
}
Kasing pertama bekerja dengan baik, saya mengujinya pada sinyal kicauan dan interpolasi baik-baik saja, ada sedikit suara numerik, tapi itu bulat melalui FFT jadi apa yang dapat Anda lakukan ( atau lebih dari sinyal menunjukkan):
Masalahnya adalah dengan transformasi panjang aneh, saya mendapatkan respon sementara yang cukup keji pada sampel nyata saja ( lagi, nyata):
Saluran imajiner memiliki riak kecil, tetapi tidak seburuk itu:
Ini seperti aku sudah mengacaukan saya bin dalam kasus aneh, tetapi tidak ada F s / 2 bin, jadi saya sangat bingung. Adakah yang punya pikiran?