Mengapa besaran dinormalisasi selama sintesis (IDFT), bukan analisis (DFT)?

17

Dalam sebagian besar contoh dan kode FFT yang saya lihat, output (frekuensi frekuensi) dari operasi DFT maju diskalakan oleh N - yaitu bukannya memberi Anda besarnya setiap nampan frekuensi, itu memberi Anda N kali lipat besarnya.

Secara operasional, ini hanya karena DFT dihitung dengan mengambil produk dalam dari sinyal dengan masing-masing sinus dasar (yaitu korelasi yang tidak dinormalisasi). Namun, itu tidak menjawab pertanyaan filosofis mengapa kita tidak membagi N sebelum mengembalikan hasilnya?

Alih-alih, sebagian besar algoritma membaginya dengan N saat melakukan sintesis ulang.

Ini tampaknya kontra-intuitif bagi saya, dan (kecuali saya kehilangan sesuatu) itu membuat semua penjelasan DFT sangat membingungkan.

Dalam setiap skenario yang saya dapat impikan, besarnya sebenarnya (bukan besarnya * N) adalah nilai yang saya butuhkan dari operasi DFT, dan besarnya dinormalisasi adalah nilai yang ingin saya masukkan ke dalam operasi IDFT.

Mengapa DFT tidak didefinisikan sebagai DFT / N, dan IDFT didefinisikan sebagai jumlah sederhana dari sinusoid berkekuatan normal?

bryhoyt
sumber
2
Jujur saya pikir ini adalah salah satu pertanyaan paling keren yang pernah diajukan di sini.
Telepon

Jawaban:

9

Apakah Anda skala output DFT Anda, maju atau terbalik, tidak ada hubungannya dengan konvensi atau apa yang nyaman secara matematis. Ini ada hubungannya dengan input ke DFT. Izinkan saya menunjukkan beberapa contoh di mana penskalaan diperlukan atau tidak diperlukan untuk transformasi maju dan terbalik.

Harus menskalakan transformasi maju sebesar 1 / N.

Untuk memulainya, harus jelas bahwa untuk menganalisis gelombang sinus sederhana, panjang transformasi harus tidak relevan, secara matematis. Misalkan N = 1024, Frek = 100 dan sinyal Anda adalah:

f (n) = cos (Frek * 2 * Pi * n / N)

Jika Anda mengambil DFT 1024 poin dari f (n), Anda akan menemukan bahwa bin [100] = 512. Tapi ini bukan nilai yang berarti sampai Anda skala dengan N. 512/1024 = 1/2 dan tentu saja, 1/2 lainnya berada dalam spektrum negatif dalam bin [924].

Jika Anda menggandakan panjang DFT, N = 2048, nilai output akan menjadi dua kali lipat dari DFT 1024 poin, yang lagi-lagi, membuat hasil tidak berarti kecuali kami skala dengan 1 / N. Panjang DFT seharusnya tidak menjadi faktor dalam analisis semacam ini. Jadi dalam contoh ini, Anda harus skala skala DFT dengan 1 / N.

Tidak boleh menskalakan transformasi maju.

Sekarang anggaplah Anda memiliki respons impuls filter FIR 32 ketuk dan ingin mengetahui respons frekuensinya. Untuk kenyamanan, kita akan mengasumsikan filter low pass dengan gain 1. Kita tahu bahwa untuk filter ini, komponen DC dari DFT harus 1. Dan harus jelas bahwa ini akan menjadi kasus tidak peduli ukurannya. DFT karena komponen DC hanyalah jumlah dari nilai input (yaitu jumlah dari koefisien FIR).

Jadi, untuk input ini, DFT tidak diskalakan dengan 1 / N untuk mendapatkan jawaban yang bermakna. Inilah sebabnya mengapa Anda dapat memberikan respons impuls sebanyak yang Anda inginkan tanpa memengaruhi hasil transformasi.

Apa perbedaan mendasar antara kedua contoh ini?

Jawabannya sederhana. Dalam kasus pertama, kami menyediakan energi untuk setiap sampel input. Dengan kata lain, gelombang sinus hadir untuk semua 1024 sampel, jadi kami perlu skala output DFT dengan 1/1024.

Dalam contoh kedua, menurut definisi, kami hanya memasok energi untuk 1 sampel (dorongan pada n = 0). Butuh 32 sampel agar impuls bekerja melalui filter 32 tap, tetapi penundaan ini tidak relevan. Karena kami menyediakan energi untuk 1 sampel, kami skala output DFT dengan 1. Jika impuls didefinisikan dengan 2 unit energi, bukan 1, kami akan skala output dengan 1/2.

Tidak boleh menskalakan transformasi terbalik.

Sekarang mari kita pertimbangkan DFT terbalik. Seperti halnya DFT maju, kita harus mempertimbangkan jumlah sampel yang kita berikan energi. Tentu saja, kita harus sedikit lebih berhati-hati di sini karena kita harus mengisi tempat frekuensi positif dan negatif dengan tepat. Namun, jika kita menempatkan impuls (yaitu 1) dalam dua nampan yang sesuai, maka output yang dihasilkan dari DFT terbalik akan menjadi gelombang kosinus dengan amplitudo 2 tidak peduli berapa banyak poin yang kita gunakan dalam DFT terbalik.

Jadi, seperti halnya dengan DFT maju, kami tidak mengukur output DFT terbalik jika inputnya impuls.

Harus menskalakan transformasi terbalik.

Sekarang perhatikan kasus di mana Anda tahu respons frekuensi filter low pass dan ingin melakukan DFT terbalik untuk mendapatkan respons impulsnya. Dalam hal ini, karena kami memasok energi di semua titik, kami harus skala output DFT dengan 1 / N untuk mendapatkan jawaban yang bermakna. Ini tidak terlalu jelas karena nilai input akan kompleks, tetapi jika Anda mengerjakan contoh, Anda akan melihat bahwa ini benar. Jika Anda tidak skala dengan 1 / N Anda akan memiliki nilai respons impuls puncak pada urutan N yang tidak dapat menjadi kasus jika keuntungannya adalah 1.

Keempat situasi yang baru saja saya jelaskan adalah contoh titik akhir di mana jelas bagaimana skala output DFT. Namun, ada banyak area abu-abu di antara titik akhir. Jadi mari kita pertimbangkan contoh sederhana lainnya.

Misalkan kita memiliki sinyal berikut, dengan N = 1024, Freq = 100:

f(n) = 6 * cos(1*Freq * 2*Pi * n/N)  n = 0 - 127
f(n) = 1 * cos(2*Freq * 2*Pi * n/N)  n = 128 - 895
f(n) = 6 * cos(4*Freq * 2*Pi * n/N)  n = 896 - 1023

Domain waktu

Perhatikan perbedaan amplitudo, frekuensi, dan durasi untuk ketiga komponen. Sayangnya, DFT dari sinyal ini akan menampilkan ketiga komponen pada tingkat daya yang sama, meskipun komponen ke-2 memiliki 1/36 tingkat daya dari dua komponen lainnya.

Domain Freq Tidak Dikawinkan

Fakta bahwa ketiga komponen memasok jumlah energi yang sama jelas, yang menjelaskan hasil DFT, tetapi ada poin penting yang harus dibuat di sini.

Jika kita mengetahui durasi untuk berbagai komponen frekuensi, maka kita dapat mengatur skala berbagai tempat frekuensi tersebut. Dalam hal ini, kami akan melakukan ini untuk secara akurat mengukur output DFT: bin [100] / = 128; bin [200] / = 768; bin [400] / = 128;

Yang membawa saya ke titik akhir saya; secara umum, kami tidak tahu berapa lama komponen frekuensi tertentu hadir pada input ke DFT kami, jadi kami tidak mungkin melakukan penskalaan semacam ini. Namun secara umum, kami menyediakan energi untuk setiap titik sampel, itulah sebabnya kami harus menskalakan DFT maju dengan 1 / N saat menganalisis sinyal.

Untuk memperumit masalah, kami hampir pasti akan menerapkan jendela untuk sinyal ini untuk meningkatkan resolusi spektral DFT. Karena komponen frekuensi pertama dan ketiga berada di awal dan akhir sinyal, mereka dilemahkan oleh 27 dB sedangkan komponen tengah dilemahkan dengan hanya 4 dB (jendela Hanning).

Spektrum Windowed

Agar jelas, output dari DFT dapat berupa representasi input yang buruk, diskalakan atau tidak.

Dalam kasus DFT terbalik, yang biasanya merupakan masalah matematika murni, yang bertentangan dengan analisis sinyal yang tidak diketahui, input ke DFT didefinisikan dengan jelas, sehingga Anda tahu bagaimana skala output.

Saat menganalisis sinyal dengan penganalisis spektrum, analog atau FFT, masalahnya serupa. Anda tidak tahu kekuatan sinyal yang ditampilkan kecuali Anda juga tahu siklus tugasnya. Tetapi bahkan kemudian, windowing, span, sweep rate, filtering, tipe detektor, dan faktor-faktor lain semuanya bekerja untuk menyia-nyiakan hasil.

Pada akhirnya, Anda harus sangat berhati-hati ketika berpindah antara domain waktu dan frekuensi. Pertanyaan yang Anda tanyakan tentang penskalaan adalah penting, jadi saya harap saya telah menjelaskan bahwa Anda harus memahami input ke DFT untuk mengetahui bagaimana mengukur skala output. Jika input tidak didefinisikan dengan jelas, output DFT harus dianggap dengan banyak skeptis, apakah Anda skala atau tidak.

user5108_Dan
sumber
Saya telah memilih jawaban ini untuk kelengkapan dan banyak informasi terperinci, tetapi lihat juga jawaban sempurna Phonon untuk gambaran umum yang intuitif.
bryhoyt
9

Saya dapat memikirkan beberapa alasan yang melibatkan masalah presisi komputasi, tetapi itu mungkin tidak akan adil karena secara matematis kita mendefinisikannya dengan cara yang sama apa pun yang terjadi, dan matematika tidak mengenal masalah presisi.

Inilah pendapat saya. Mari kita berpikir secara konseptual tentang apa arti DFT dalam arti pemrosesan sinyal, bukan hanya sebagai transformasi semata. Dalam hal ini, menurut saya menerapkan DFT pada sinyal dan sistem membuat kita ingin melihat hasil yang berbeda.

Sebagai contoh, mari kita terapkan DFT pada sinyal nilai konstan 1. Mari kita juga mengira bahwa sinyal ini panjangnya terbatas dan panjangnya 16 tap. Apa yang kita inginkan dari DFT dalam kasus ini? Jelas, kami ingin memberi tahu kami berapa amplitudo masing-masing komponen frekuensi sinyal. Jelas, sinyal kami memiliki komponen tunggal frekuensi 0 dan amplitudo 1. Namun DFT memberi kami satu puncak tunggal pada nampan 0 dan tinggi 16! Dalam hal ini, frustrasi Anda dengan definisi DFT masuk akal. Kita harus mengukur koefisien analisis, bukan koefisien sintesis.

Oke, sekarang mari kita menganalisis array angka yang sama, yaitu string kita yang 16, tetapi dalam hal ini sebagai suatu sistem. Apa yang secara konseptual kita inginkan dari respons frekuensi suatu sistem? Kebanyakan orang akan mengatakan bahwa itu adalah amplitudo dari output dibandingkan dengan input, yaitu fungsi transfer. Dalam hal ini, anggaplah bahwa kita memasukkan sinyal DC amplitudo kesatuan ke dalam sistem kami dan melihat amplitudo respon kondisi-mapan. Nah, gabungkan dua sinyal 16-tap konstan bersama-sama dan Anda mendapatkan ramp sementara diikuti oleh output kondisi tunak yang merupakan sinyal amplitudo DC (lihat-ini-keluar!) 16! Dalam hal ini definisi kami tentang transformasi analisis non-skala lebih masuk akal daripada sebaliknya.

Pada akhirnya, itu semua tentang apa yang ingin Anda wakili. Ada banyak alasan untuk mempertimbangkan definisi DFT sistem-sentris ini.

1(N)

Phonon
sumber
Jawaban yang bagus, terima kasih! Saya telah memilih jawaban user5108_Dan untuk kelengkapan, tetapi jawaban Anda pasti membantu memberikan intuisi terbaik.
bryhoyt
7

Sebenarnya, 3 cara berbeda untuk menempatkan faktor skala adalah umum dalam implementasi FFT / IFFT yang berbeda dan berbeda: 1,0 maju dan 1,0 / N kembali, 1,0 / N maju dan 1,0 kembali, dan 1,0 / sqrt (N) baik maju dan mundur.

Ketiga variasi penskalaan ini semuanya memungkinkan perjalanan pulang-pergi IFFT (FFT (x)), menggunakan fungsi generik unscaled sin () dan cos () untuk faktor-faktor twiddle, menjadi transformasi identitas.

Perhatikan bahwa menjaga besarnya sinusoidal pada FFT maju tidak menghemat energi total (seperti dalam teorema Parseval). Pilih yang Anda inginkan.

hotpaw2
sumber