MATLAB:

11

Dalam MATLAB, output dari fftdan / atau ifftfungsi sering membutuhkan pemrosesan tambahan sebelum dipertimbangkan untuk analisis.

Saya telah mendengar banyak pendapat berbeda tentang apa yang benar:

  • Scaling

    Mathworks menyatakan bahwa fftdan ifftfungsi didasarkan pada persamaan berikut:

    X[k]=11n=1Nx[n]e-j2π(k-1)(n-1)N,dimana1kNx[n]=1Nk=1NX[k]e+j2π(k-1)(n-1)N,dimana1nN
  • Penskalaan menurut panjang sinyal

    Teman sebaya saya biasanya skala data dengan 1N segera setelah pemrosesanfft.
    (Kami tidak mempertimbangkanfftdatamentahsebelum penskalaan.)

    %% Lakukan fft
    X_f = fft (x, n_sample, 1) / n_sample; % fft harus dinormalisasi dengan jumlah sampel dalam data. % Konvensi ini ditetapkan oleh pengembang perangkat lunak (Mathworks).

    Apakah ini benar?

    1. Jika demikian, mengapa ifftfungsi MATLAB berharap bahwa kita belum diskalakan oleh ?1/N
    2. Apakah ada ifftfungsi MATLAB atau opsi fungsi yang tidak secara otomatis skala oleh ?1/N

    Atau, apakah ada konvensi yang lebih baik yang harus kita gunakan dalam menempatkan ? Misalnya, menempatkan di dalam daripada , atau menempatkan di kedua persamaan, bukan ?1 / N 1 / 1/N1/Nfftifft 1/N1/N1/N

  • Penskalaan menurut periode pengambilan sampel

    Saya telah mendengar bahwa fungsi fftdan ifftmengasumsikan bahwa periode sampling , dan agar fungsi tersebut benar, hal-hal berikut perlu diterapkan:TsSebuahmhallsayang=1/fsSebuahmhallsayang=1

X[k]=1TsSebuahmhallsayangn=1Nx[n]e-j2π(k-1)(n-1)N,dimana1kNx[n]=TsSebuahmhallsayangNk=1NX[k]e+j2π(k-1)(n-1)N,dimana1nN

Lihat tautan:

  • Tautan 1 (lihat komentar untuk Matt Szelistowski oleh Dr Seis)
  • Tautan 2 (lihat jawaban oleh Rick Rosson vs jawaban Dr Seis)
  • Tautan 3 (lihat komentar oleh Matt (Pesan: 7/16) dan komentar oleh Poorya (14/16)
  • Tautan 4 (lihat hal 10, slide [1,1])
  • Tautan 5 (lihat hal 8 + 9) [tampaknya ia menggunakan konvensi terbalik untuk fft dan ifft].

Apakah ini benar?

Saya sangat jengkel karena saya tidak dapat menemukan persamaan DFT atau DTFT di Wikipedia yang termasuk periode pengambilan sampel.

kando
sumber
2
BTW, kando hanya menyatakan apa adanya (dengan MATLAB): tetapi saya harus mengatakan bahwa ini konvensi bawaan MATLAB untuk memasukkan DC ke bin # 1 (atau amplitudo komponen frekuensikke dalam bink+1)membuat saya gila !!
X[k]=n=1Nx[n]e-j2π(k-1)(n-1)N,dimana1kNx[n]=1Nk=1NX[k]e+j2π(k-1)(n-1)N,dimana1nN
kk+1
robert bristow-johnson

Jawaban:

6

Apakah skala FFT maju 1 / N tergantung pada hasil yang Anda inginkan untuk analisis lebih lanjut: energi (mempertahankan identitas Parseval), atau amplitudo (mengukur tinggi atau volt, dll.).

Jika Anda ingin mengukur atau menganalisis energi, maka jangan skala dengan 1 / N, dan sinusoid yang lebih panjang dengan amplitudo yang sama akan menghasilkan hasil FFT yang lebih besar, sebanding dengan energi yang lebih besar dari sinyal yang lebih lama.

Sedikit lebih umum, jika Anda ingin mengukur atau menganalisis amplitudo, maka untuk mendapatkan sinusoid yang lebih panjang (sehingga dengan lebih banyak energi total pada amplitudo yang sama persis) untuk menghasilkan hasil FFT yang sama dengan sinyal yang lebih pendek, Anda perlu mengurangi Penjumlahan FFT dengan rasio yang sebanding dengan panjangnya. Rasio dapat berupa reference_length / N, yang kadang-kadang 1 / N jika gain input sistem adalah 1,0 untuk dimensi atau unit apa pun, termasuk dimensi interval waktu, yang Anda pilih untuk digunakan dalam analisis lebih lanjut. Anda perlu menurunkan secara proporsional karena DFT adalah penjumlahan: semakin Anda meringkas item yang serupa, semakin besar hasilnya.

Begitu. Energi atau amplitudo. Yang kamu inginkan

Sekarang jika Anda menurunkan FFT maju, maka Anda tidak harus skala terbalik sehingga IFFT (FFT (x)) == x. Atau lakukan sebaliknya.

1 / sqrt (N) untuk penskalaan menurut saya adalah untuk entah ketika seseorang membutuhkan simetri formal untuk beberapa bukti, atau ketika membangun semacam pipa perangkat keras di mana latensi dan / atau jumlah unit aritmatika / gerbang untuk DFT dan untuk IDFT harus identik. Tetapi Anda tidak mendapatkan pengukuran langsung baik dari energi atau amplitudo untuk semua jenis analisis teknik.

hotpaw2
sumber
Ketika Anda mengatakan "jika Anda ingin mengukur energi, maka jangan skala dengan " ... tidakkah saya perlu skala dengan 1 / 1/N sehingga transformasinya adalah kesatuan dan menghemat energi? Atau apakah itu karena saya perlu mengatur seluruh sinyal untuk mendapatkan energi yang menghasilkan1/Nsecara efektif? Jika itu benar, bagaimanapun, apayangspektrum skala oleh1/1/N1/N benar-benar menunjukkan kepada saya kalau begitu? 1/N
LCsa
Selain itu, ketika mengatakan "demikian dengan lebih banyak energi pada amplitudo yang sama persis" ... bukankah Anda lebih suka "frekuensi"?
LCsa
7

Konvensi penskalaan yang digunakan oleh Matlab umum di DSP. Anda juga bisa menggunakan DFT kesatuan di mana DFT dan IDFT diskalakan oleh faktor . Anda juga bisa menggunakan faktor1/Nuntuk DFT dan faktor1untuk IDFT. Selama Anda konsisten, itu tidak masalah (terlepas dari pertimbangan numerik, terutama ketika menggunakan implementasi titik tetap). Jadi tidak ada konvensi "yang lebih baik", hanya ada "konvensi", dan Anda hanya perlu menyetujui yang mana yang Anda gunakan.1/N1/N1

Komentar

% fft harus dinormalisasi dengan jumlah sampel dalam data.
% Konvensi ini ditetapkan oleh pengembang perangkat lunak (Mathworks).

salah. Tidak ada yang mengatakan bahwa Anda harus menormalkan hasil FFT. Jika Anda ingin, Anda bebas untuk melakukannya.

Juga, FFT tidak menganggap apa-apa tentang periode sampling . Perhatikan bahwa DFT dapat digunakan untuk data yang sifatnya diskrit tanpa melibatkan sampel. Bergantung pada data Anda dan pada apa yang ingin Anda lakukan dengan hasilnya, Anda harus memperhitungkan T sesuai. Misalnya, jika Anda ingin menggunakan DFT (diimplementasikan oleh FFT) untuk memperkirakan transformasi Fourier waktu kontinu, Anda mendapatkan ekspresi berikut:TT

(1)X(2πkNT)Tn=0N-1x(nT)e-j2πkn/N,0k<N

di mana adalah periode pengambilan sampel, N adalah panjang DFT, x ( t ) adalah sinyal waktu kontinu, dan X ( ω ) adalah transformasi Fourier waktu kontinu. Sisi kanan ( 1 ) hanya DFT dari sampel N x ( t ) , diskalakan oleh T , di mana kita mengasumsikan bahwa bagian yang relevan dari x ( t ) berada dalam kisaran t [ 0 , N T ]TNx(t)X(ω)(1)Nx(t)Tx(t)t[0,NT]. Rincian lebih lanjut tentang menggunakan DFT untuk mendekati transformasi Fourier waktu kontinu dapat ditemukan dalam jawaban ini .

Matt L.
sumber
2
Untuk apa downvote? Tolong beri komentar anda.
Matt L.
1
Saya biasanya memilih dengan pemungutan suara rahasia, tetapi saya akan membuat pengecualian kali ini. tergantung pada apa yang dilakukan seseorang dengan DFT, tentu ada konvensi "lebih baik" daripada yang lain. (tetapi tidak ada konvensi yang lebih baik daripada yang lain dalam segala keadaan.)
robert bristow-johnson
5

terutama karena ini adalah pertanyaan tentang konvensi, saya tidak akan memperkuat konvensi konyol MATLAB dan hanya akan menjawab dengan konvensi atau konvensi yang benar dan tepat . yaitu pengindeksan MATLAB untuk DFT tidak benar dan tepat, tetapi saya cukup agnostik tentang yang mana dari tiga konvensi penskalaan umum.

juga, saya tidak membatasi atau 0 k < N , mereka dapat berupa bilangan bulat karena saya cukup fasis tentang arti mendasar dari Transformasi Fourier Diskrit: DFT dan Seri Diskrit Fourier adalah satu dan sama. DFT memetakan urutan periodik x [ n ] dengan periode N ke urutan periodik lain X [ k ] juga dengan periode N dan iDFT memetakannya kembali.0n<N0k<Nx[n]NX[k]N

jadi X [ k + N ] = X [ k ]

x[n+N]=x[n] nZ
X[k+N]=X[k] kZ

juga, lilitan melingkar dalam "domain waktu" ( ) atau "domain frekuensi" ( X [ k ] ) didefinisikan secara konsisten dengan semua konvensi:x[n]X[k]

W [ k ] X [ k ] N - 1 i =

h[n]x[n]saya=0N-1h[saya]x[n-saya]=saya=0N-1x[saya]h[n-saya]
W[k]X[k]saya=0N-1W[saya]X[k-saya]=saya=0N-1X[saya]W[k-saya]

sehingga satu-satunya keuntungan dari satu konvensi lebih dari yang lain (dengan asumsi kedua konvensi itu valid) dapat mengenai kesederhanaan ekspresi beberapa teorema.


konvensi penskalaan paling umum untuk DFT:

DFT{x[n]}X[k]n=0N-1x[n]e-j2πkn/NsayaDFT{X[k]}x[n]=1Nk=0N-1X[k]e+j2πkn/N

memiliki keunggulan kesederhanaan mengenai konvolusi melingkar dalam "domain waktu"

DFT{h[n]x[n]}=H[k]X[k]

tetapi ada faktor penskalaan yang harus Anda khawatirkan jika Anda berbelit-belit di "domain frekuensi" :

sayaDFT{W[k]X[k]}=1Nw[n]x[n]

Teorema Parseval memiliki faktor penskalaan yang perlu dikhawatirkan juga.

n=0N-1|x[n]|2=1Nk=0N-1|X[k]|2

dan teorema Dualitas:

DFT{X[n]}=Nx[-k]
sayaDFT{x[k]}=1NX[-n]

konvensi penskalaan umum lainnya untuk DFT:

sayaDFT{X[k]}x[n]k=0N-1X[k]e+j2πkn/NDFT{x[n]}X[k]=1Nn=0N-1x[n]e-j2πkn/N

ejωknej(2πk/N)nX[k]x[n]kNSEBUAH|X[k]|=|X[-k]|=|X[N-k]|=SEBUAH2

ia juga memiliki lebih banyak kesederhanaan mengenai konvolusi melingkar dalam domain frekuensi

sayaDFT{W[k]X[k]}=w[n]x[n]

tetapi ada faktor penskalaan yang harus Anda khawatirkan jika Anda terlibat dalam domain waktu :

DFT{h[n]x[n]}=1NH[k]X[k]

Teorema Parseval memiliki faktor penskalaan yang perlu dikhawatirkan juga.

1Nn=0N-1|x[n]|2=k=0N-1|X[k]|2

dan teorema Dualitas:

DFT{X[n]}=1Nx[-k]
sayaDFT{x[k]}=NX[-n]

yang kesatuan skala konvensi untuk DFT identik di skala dengan inverse dan menjaga energi di seluruh transformasi atau invers transformasi:

DFT{x[n]}X[k]1Nn=0N-1x[n]e-j2πkn/NsayaDFT{X[k]}x[n]=1Nk=0N-1X[k]e+j2πkn/N

konvolusi dalam domain waktu atau domain frekuensi memiliki faktor penskalaan yang sama untuk dikhawatirkan:

DFT{h[n]x[n]}=1NH[k]X[k]

sayaDFT{W[k]X[k]}=1Nw[n]x[n]

tetapi teorema Parseval tidak memiliki faktor penskalaan yang perlu dikhawatirkan.

n=0N-1|x[n]|2=k=0N-1|X[k]|2

teorema Dualitas juga tidak:

DFT{X[n]}=x[-k]
sayaDFT{x[k]}=X[-n]

robert bristow-johnson
sumber
Ketika berbicara tentang konvensi DFT, biasanya hanya tentang faktor penskalaan, bukan tentang masalah pengindeksan. Jika Anda berpikir bahwa saya mengacu pada pengindeksan ketika saya mengatakan bahwa itu adalah konvensi DSP yang umum, maka itu adalah kesalahpahaman. Tentu saja saya merujuk pada penskalaan; pengindeksan sama sekali tidak relevan, karena tidak ada hubungannya dengan definisi DFT (dan scaling telah).
Matt L.
itu bukan "masalah" ketika, di MATLAB, Anda menggunakan max(abs(X))fungsi untuk menemukan di mana puncak spektral berada dan Anda lupa untuk mengurangi 1dari indeks yang dikembalikan dan Anda akan melakukan matematika di atasnya. ini masalah. dan yang menyedihkan pada saat itu. asal pengindeksan banyak berkaitan dengan " definisi DFT" seperti halnya penskalaan. itu ada hubungannya dengan pembukuan apa yang diperlukan atau tidak.
robert bristow-johnson
bisa saja saya, tapi kali ini tidak :) Tapi tetap saja, saya tidak setuju dengan pentingnya Anda lampirkan pada pengindeksan, tapi saya menghargai itu pribadi Sekali lagi, jangan downvote karena saya menghargai waktu yang Anda berikan pada jawabannya.
Matt L.