Bagaimana cara menggeser sinyal secara sepersekian sampel?

22

The pergeseran Teorema mengatakan :

Mengalikan dengan fase linear e 2 π ixn untuk suatu bilangan bulatmsesuai denganpergeseran melingkardari outputXk:Xkdiganti denganXk-m, di mana subscript yang ditafsirkan moduloN(yaitu, secara berkala).e2πsayaNnmXkXkXk-m

Ok, itu berfungsi dengan baik:

plot a

sinyal 9-sampel sewenang-wenang

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

sinyal digeser oleh 3 sampel dalam domain frekuensi

Itu bergeser 3 sampel, seperti yang saya harapkan.

Saya pikir Anda juga bisa melakukan ini untuk menggeser fraksi sampel, tetapi ketika saya mencobanya, sinyal saya menjadi imajiner dan sama sekali tidak seperti aslinya:

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

sinyal setelah dikalikan dengan 3,5 eksponensial kompleks

Saya tidak mengharapkan ini sama sekali. Bukankah ini setara dengan berbelit-belit dengan dorongan nyata yang telah digeser oleh 3,5 sampel? Jadi dorongan itu harus tetap nyata, dan hasilnya harus tetap nyata? Dan itu seharusnya memiliki bentuk yang kurang lebih sama dengan aslinya, tetapi diinterpolasi dengan tulus?

endolith
sumber
Berikut ini adalah pengiriman Matlab File Exchange yang menghitung modulasi yang benar untuk sinyal real / complex genap / ganjil dan penundaan-fraksinya: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

Jawaban:

14

Jika Anda ingin output bergeser dari IFFT menjadi nyata, fase twist / rotasi dalam domain frekuensi harus konjugat simetris, serta data. Ini dapat dilakukan dengan menambahkan offset yang sesuai ke eksponen exp () kompleks Anda, untuk kemiringan fase yang diberikan, sehingga fase setengah atas (atau negatif), modulo 2 Pi, mencerminkan bagian bawah di aperture FFT . Fungsi pergeseran eksponensial yang kompleks juga dapat dibuat simetris konjugat dengan mengindeksnya dari -N / 2 ke N / 2 dengan fase nol pada indeks 0.

Kebetulan offset yang tepat untuk lilitan atau spiral fase, yang menyelesaikan kelipatan integer yang tepat dari rotasi 2 Pi dalam aperture, untuk menjadi konjugat simetris dalam aperture, adalah nol.

Dengan vektor twist fase simetris konjugat, hasilnya kemudian harus berakhir sebagai interpolasi Sinc melingkar untuk pergeseran non-integer.

Elaborasi oleh OP:

Pilihan Anda k = [0, 1, 2, 3, 4, 5, 6, 7, 8] menghasilkan eksponensial kompleks asimetris:

upaya pergeseran sampel 0,5 eksponensial asimetris kompleks, dengan bagian imajiner sebagai garis putus-putus

Jika Anda menggunakan k = [0, 1, 2, 3, 4, -4, -3, -2, -1] sebagai gantinya, Anda mendapatkan eksponensial kompleks Hermite-simetris:

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

Eksponensial kompleks hermit-simetris untuk pergeseran sampel 0,5, dengan bagian imajiner sebagai garis putus-putus

dan sekarang ketika Anda menggunakan rumus eksponensial yang sama untuk menggeser 0,5 atau 3,5 sampel, Anda mendapatkan hasil nyata:

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

bergeser dengan 0,5 dan 3,5 sampel, dengan aslinya sebagai garis putus-putus

hotpaw2
sumber
Aha! Alih-alih k = [0, 1, 2, 3, 4], saya harus menggunakank = [0, 1, 2, -2, -1]
endolith
@endolith / hotpaw2, Dengan kata lain ini semua tentang pengindeksan sampel waktu-domain?
TheGrapeBeyond
1
Simetri di sekitar bin 0 juga akan memberikan simetri di sekitar N / 2, bahkan jika N / 2 bukan bilangan bulat.
hotpaw2
1
Saya menemukan fungsi yang menerapkan modulasi yang benar di Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ahmed Fasih
1
apakah ini berlaku untuk sinyal yang kompleks?
Leo