Dering bernilai nyata saat FFT zero-padding odd-length

13

Jadi saya mencoba untuk menulis interpolator domain frekuensi yang nol-bantalan respon frekuensi sinyal dan transformasi terbalik. Ada dua kasus yang harus saya tangani:

  1. Bahkan-panjang respon - harus membagi bin karena itu ambigu. Jadi saya menyalin bagian negatif dari spektrum, dan menambahkan nol di antaranya.Fs/2n*(interp-1)-1
  2. Respon ganjil-panjang - tidak ada bin jadi hanya membagi frekuensi positif / negatif dan masukkan nol di antara mereka.Fs/2n*(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 ( 50μs atau lebih dari sinyal menunjukkan):

Masalahnya adalah dengan transformasi panjang aneh, saya mendapatkan respon sementara yang cukup keji pada sampel nyata saja ( lagi, nyata):50μs

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?Fs/2Fs/2

gt
sumber
Plot Anda agak sulit dilihat karena sudah menyusut.
Jason R
@ Alasan maaf saya pikir mereka terhubung, saya mengubah html sehingga mereka dapat mengklik untuk ukuran penuh sekarang.
gt
3
Apakah Anda memiliki kode atau file contoh untuk apa yang Anda gunakan sebagai input? Satu hal yang perlu diingat adalah bahwa syarat batas diasumsikan oleh DFT. Secara khusus, ada asumsi yang melekat bahwa sinyal bunga bersifat periodik. Jadi, jika ada diskontinuitas antara sampel pertama dan terakhir dalam input panjang ganjil, maka Anda dapat melihat dering seperti apa yang Anda amati. Mungkin saja sampel panjang rata-rata lebih berkelanjutan dari awal hingga akhir, sehingga Anda tidak melihat fenomena ini.
Jason R
Saya tidak memiliki data dalam format yang dapat dicerna oleh orang lain, tetapi saya pikir Anda benar. Saya baru saja tiba di sini untuk bekerja dan mengkompilasi ulang kode saya / membuat ulang input tes (10Hz-100Hz kicauan lebih dari 1 detik) dan menjalankan kembali kode dan tidak mendapatkan dering. Saya melihat komentar Anda dan mengubah frekuensinya menjadi 10-100.314 dan saya melihat dering pada transformasi genap dan ganjil sekarang.
gt
1
Sudahkah Anda mencoba menerapkan fungsi jendela ke data Anda? Itu biasanya akan mengurangi dering.
MarkSci

Jawaban:

1

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.

pengguna27575
sumber
0

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.

Jian
sumber