bingung oleh spektrum fase fft!

9

Eksperimen MATLAB yang sangat sederhana:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  

Dan inilah hasilnya: masukkan deskripsi gambar di sini

Sekarang, buat perubahan kecil pada cuplikan kode di atas; mengurangi durasi waktu hanya dengan 1 sampel, sebagai berikut:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 

Dan spektrum fase menjadi sangat gila:

masukkan deskripsi gambar di sini

Pertanyaan:

  1. Pada plot pertama, saya berharap untuk melihat fase nol pada bin 700 yang sesuai dengan frekuensi positif 200 dalam contoh ini. Sepertinya bukan itu masalahnya. Kedua, saya tidak mengerti bagian linear dari grafik dalam plot 1. Saya menghargai komponen fase yang berpotensi ada karena apa yang disebut noise numerik, tetapi kemudian bagaimana noise itu bisa begitu 'linier' dalam fase?

  2. Pada plot kedua, mengapa menghapus hanya satu sampel akan memiliki dampak drastis pada plot fase?

  3. Apakah saya melakukan sesuatu yang secara fundamental salah di sini?

pengguna4673
sumber

Jawaban:

18

Anda tidak melakukan kesalahan, tetapi Anda juga tidak berpikir hati-hati tentang apa yang seharusnya Anda lihat, itulah sebabnya Anda terkejut dengan hasilnya. Untuk pertanyaan 1, dugaan Anda dekat, tetapi Anda benar-benar memiliki banyak hal; itu suara numerik yang mengganggu yang kedua, bukan yang pertama.

Gambar dapat membantu. Berikut ini plot besarnya dan fase untuk percobaan pertama:

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Dan yang kedua:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

k/10000k999

k/10010k1000200/1000k/1001

Secara umum, saya pikir grafik sudut fasa saja adalah ide yang sangat buruk untuk menyampaikan informasi, justru karena alasan ini; pertama, Anda tidak tahu apakah Anda melihat fase sampah amplitudo rendah atau sinyal aktual, dan kedua, itu bukan terjemahan-invarian, dan mudah untuk mendapatkan grafik yang membingungkan untuk input sederhana. Jauh lebih baik, jika Anda masih mencari sesuatu yang menyampaikan informasi fase, adalah grafik yang secara simultan menggambarkan informasi fase dan amplitudo dalam cara visual yang sama, seperti plot di mana fase dikodekan sebagai rona dan besarnya dikodekan sebagai kecerahan.

TAMBAHKAN: Berikut adalah beberapa gambar dari Mathematica yang menggambarkan prinsip yang saya nyatakan dalam paragraf sebelumnya:

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

11×11500×500saya-1-sayapeta menjadi ungu. Inilah yang saya maksud ketika saya mengatakan bahwa spektrum fase adalah non-shift invarian, dan dengan demikian tidak dapat diterima oleh pemahaman visual manusia. Misalnya, dengan pergeseran siklik 200 titik data, sama sekali tidak mungkin untuk mengetahui apa yang terjadi dalam fase, karena itu hanya terlihat seperti statis, tetapi sinyal input tidak lebih rumit daripada kasus input lainnya.

DumpsterDoofus
sumber
0

Jika Anda ingin memvariasikan frekuensi sinyal atau panjang FFT sehingga sinyalnya bervariasi antara tepat periodik dan tidak tepat periodik di apertur FFT, dan tidak ingin melihat fase nampan magnitudo puncak untuk perubahan sinyal itu, seseorang dapat mereferensikan fase awal sinyal ke pusat jika apertur FFT bukan awal (untuk dosa yang dihasilkan (t), letakkan t = 0 di tengah array FFT).

hotpaw2
sumber
-1

Situs Gaussian Waves merinci bagian tentang fase dan perilaku seperti acak: hanya masalah kesalahan floating-point seperti kata DumpsterDoofus

Gim
sumber