fft faz spektrumuyla şaşırttı!


9

Çok basit bir MATLAB deneyi:

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

Ve işte çıktı: resim açıklamasını buraya girin

Şimdi, yukarıdaki kod snippet'inde küçük bir değişiklik yaptı; zaman süresini aşağıdaki gibi sadece 1 numune azaltarak:

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

Ve faz spektrumu tamamen deliriyor:

resim açıklamasını buraya girin

Sorular:

  1. İlk grafikte, bu örnekte 200'ün pozitif frekansına karşılık gelen bin 700'de sıfır faz görmeyi umuyordum. Durum böyle görünmüyor. İkincisi, grafik 1'deki grafiğin doğrusal kısımlarını anlamıyorum. Sayısal gürültü denilen potansiyel nedeniyle var olabilecek faz bileşenlerini takdir ediyorum, ama o zaman bu gürültü fazda nasıl 'doğrusal' olabilir?

  2. İkinci komploda, neden sadece bir numunenin çıkarılması faz grafiğinde bu kadar ciddi bir etki yaratsın ki?

  3. Burada temelde yanlış bir şey mi yapıyorum?

Yanıtlar:


18

Yanlış bir şey yapmıyorsunuz, ancak görmeyi beklediğiniz şeyleri de dikkatle düşünmüyorsunuz, bu yüzden sonuçta şaşırıyorsunuz. Soru 1 için, varsayımınız yakın, ama aslında geriye doğru bir şeyler var; bu ikincinizi rahatsız eden sayısal gürültüdür, birincinizi değil.

Resimler yardımcı olabilir. İlk deneme için büyüklük ve fazın şemaları:

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

resim açıklamasını buraya girin

resim açıklamasını buraya girin

İkincisi:

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]

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Peki burada neler oluyor? İkincisi açıklamak en kolayı. Birincisi, ikincisinin FFT'si, büyüklük spektrumunda görünen iki tepe hariç her yerde sıfır genliğe sahiptir; bu, 1000 veri noktası kullanan FFT'nin tanımının formun frekanslarını döndürdüğü için takip ederk/1000 için 0k999ve dolayısıyla sinyaliniz tam olarak bir frekans bölmesine düşer . Sonuç olarak, diğer 998 noktada sinyaliniz tamamen kayan nokta hataları nedeniyle makine gürültüsünden kaynaklanır ve bu nedenle faz spektrumunuz saçmalıktır, çünkü tam anlamıyla sahte sayıların fazıdır.

Bununla birlikte, birincisi için, FFT'nin tanımı formun frekanslarını kapsar k/1001 için 0k1000sinyal frekansınız 200/1000biçiminde olmayan k/1001. Sonuç olarak, sinyaliniz spektral sızıntı ile genişletilir ve neredeyse her yerde sıfırdan farklı olacaktır. Faz planının fiziksel formu hakkında yorum yapmayacağım, ancak kapalı bir analitik formu kabul ettiğini söyleyeceğim.

Genel olarak, sadece faz açısı grafiklerinin bilgi iletmek için gerçekten kötü bir fikir olduğunu düşünüyorum, tam da bu nedenle; Birincisi, düşük genlikli çöp veya gerçek sinyal fazına bakıp bakmadığınızı söyleyemezsiniz ve ikincisi, çeviri değişmez değildir ve basit girişler için tamamen şaşırtıcı grafikler elde etmek kolaydır. Çok daha iyi, eğer hala faz bilgisi taşıyan bir şey arıyorsanız, faz ve genlik bilgisini aynı anda aynı şekilde tasvir eden bir grafiktir, örneğin fazın renk tonu olarak kodlandığı ve büyüklüğün parlaklık olarak kodlandığı bir grafik gibi.

EK: Mathematica'dan önceki paragrafta belirttiğim ilkeyi gösteren birkaç resim:

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]

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Üç görüntü de aynı giriş sinyalinin 2D Fourier dönüşümleridir (bir 11x11 1'lerin uzunluğuna sıfırlarla doldurulmuş kare 500x500), ancak girişler 5, 4 ve 0 ve 200 veri noktası ile döngüsel olarak döndürülmüştür. Büyüklük spektrumları (piksel parlaklığı ile kodlanmış) aynıdır, ancak faz spektrumları tamamen farklıdır! Faz kodlaması, 1 kırmızı ile eşleşecek şekilde yapılır,ben yeşil ile eşleşir, -1 camgöbeği ile eşleştirir ve -benmor eşler. Faz spektrumlarının kaydırmaz değişmez olduğunu ve dolayısıyla insanın görsel anlayışına uygun olmadığını söylediğimde bunu kastediyorum. Örneğin, 200 veri noktasının döngüsel kaymasıyla, fazda neler olduğunu söylemek tamamen imkansızdır, çünkü sadece statik gibi görünür, ancak giriş sinyali diğer giriş durumlarından daha karmaşık değildir.


0

Bir sinyalin veya FFT uzunluğunun frekansını, sinyalin FFT diyaframında tam olarak periyodik ve tam olarak periyodik olmayan bir şekilde değişmesi ve bu sinyal değişikliği için pik büyüklük bölmesinin fazını görmek istemiyorsanız, başlangıç ​​yerine FFT açıklığı varsa sinyalin başlangıç ​​fazını merkeze referans verebilir (oluşturulan bir sin (t) için, FFT dizisinin ortasına t = 0 koyun).


-1

Gauss Dalgaları sitesi , faz ve rastgele benzeri davranışı hakkındaki kısmı ayrıntılı olarak açıklar: DumpsterDoofus'un dediği gibi sadece bir kayan nokta hatası meselesi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.