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?
sumber
Jawaban:
Dengan meniadakan tempat sampah frekuensi tinggi, Anda telah secara efektif mengalikan spektrum sinyal dengan fungsi persegi panjang. Perkalian dalam frekuensi adalah konvolusi dalam waktu dan pasangan Fourier dari sebuah persegi adalah sinc. Jadi yang benar-benar Anda lakukan adalah memadukan sinyal domain waktu dengan sinc dengan lebar lobus utama sinc berbanding terbalik dengan panjang rect. Inilah sebabnya mengapa banyak teknik perancangan filter seperti desain Parks-McClellan dalam apa yang disebut wilayah "transisi" atau "transisi" sehingga tidak ada perubahan instan dalam respons frekuensi filter. Teknik desain filter ini penting karena filter "ideal" seperti yang Anda gunakan memiliki efek yang tidak diinginkan dalam domain waktu.
sumber
Langkah dalam domain frekuensi akan muncul sebagai riak di domain waktu. Jika Anda menghaluskan data frekuensi Anda dengan fungsi jendela (misalnya, jendela Hamming), ini akan secara signifikan mengurangi riak.
sumber