Sinüs dalgasının FFT sonuçları nasıl kontrol edilir?


9

FFT algoritmamın girişi olarak 1000Hz ses dosyası (sinüs dalgası) verildi. Bir dizide 8192 güç spektrumu örneğim var.

Çıktımın doğru veya yanlış olup olmadığını kontrol etmenin en iyi ve en kolay yolu nedir?

Sessiz bir ses dosyası verirsem çıktı tüm örnekler için sıfır olur. Bir sinüs dalgasında o / p 20'den (0ncı örnek) 26059811'e (743nci örnek) yükselir ve kademeli olarak 40'a düşer.

Çıktı aralığı hakkında bir fikir alırsam teknik olarak FFT'nin çalışıp çalışmadığını kanıtlayabilirim.

Herhangi bir fikir yardımcı olacaktır.

Teknik şüpheleriniz için bu bağlantıya başvurun .


1
dizinizi çizebilir misiniz? (bir elektronik tablo yazılımında olabilir mi?)

Dizide 8192 değer var. Manuel olarak çizmemi istiyorsun veya elektronik tablo bunu halledecek. MAC

2
MS Excel'de on binlerce örnek çizdim; Gnumeric veya diğeri de uygundur. Ya da gnuplot.

Açık ofisi unutmayın
Sahte İsim

@ Sahte İsim: Grafiği çizemiyorum ..

Yanıtlar:


4

8192 veya 8193 frekanslarında (0'dan Nyquist'e) büyüklüğün karesini almak için 10 pencereyi (örtüşmeyen?) Ortalama olarak spektrumu hesaplıyormuşsunuz gibi görünüyor, ancak bazı algoritmalar Nyquist frekansını 8192 bölmesinde düşürebilir).

Kontrol edilecek ilk şey, zirvenin sağ bölmede olmasıdır. Örnekleme hızının ne olduğunu söylemediniz, ancak 743 bölmesi örnekleme hızının 743/16384 katı olacaktır. Sinyal gerçekten 800 Hz ise, bu Fs'yi yaklaşık 17640 örnek / saniyeye getirir. Bu yanlış görünüyor. Test sinyaliniz muhtemelen 8000, 16000, 22050, 32000, 44100 veya 48000 gibi standart bir oranda olacaktır. Fs = 22050 için pik 800/22050 * 16384 = 594'te keskin bir şekilde olacaktır.

Kontrol edilecek diğer bir kriter, sinyaldeki toplam enerjinin hem zaman hem de frekans alanlarında yaklaşık olarak aynı olduğudur. İşte Python'da bir örnek:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Fs = 22050 örnek / saniyede örneklenen iki sinüzoidden oluşan giriş sinyali x, NFFT = 2048 örnek büyüklüğünde 10 örtüşmeyen pencereye bölünür. Psd'ye (güç spektral yoğunluğu) yapılan çağrı y spektrumunu on 16384 noktalı DFT'nin karesi alınmış büyüklüğün ortalaması olarak hesaplar (aslında x gerçek değerli olduğundan 8193 puntodur).

Hesaplanan frekans-alan enerjisi N / 16384'lük bir ölçeklendirme faktörüne sahiptir, çünkü psd fonksiyonu y'yi toplam sinyal uzunluğu yerine DFT boyutuna ölçeklendirmiştir. Bunun bir sorun olup olmadığı, sisteminizin PSD'yi normalleştirme biçimine bağlıdır. Bir başka isteğe bağlı normalleştirme, 1 / Fs ile ölçeklendirmedir. Bu, enerjiyi orijinal analog sinyale eşleştirir. Varsayılan normalleştirmeler kütüphanede iyi belgelenmelidir.


Sinüs dalga sinyalimi 1000 Hz olarak test ettim. Mine FFT doğru cevabı veriyor.Yardımınız için teşekkürler.

10

FFT çıktısının büyüklüğünü çizmeniz gerekir. Programlama dilinize aşina değilim, ama Python'da böyle bir şey kullanırsınız plot(abs(fft(a))). Sessiz bir giriş için, çıktının tümü sıfır olmalıdır. Sinüs dalgası girişi için iki sivri uç görmelisiniz:

alternatif metin

Gerçek bir sinyal için sivri uçlar soldan sağa simetrik olacaktır. Gerçek bir FFT yapıyorsanız (daha hesaplama açısından verimli), yedekli ayna görüntüsünü yok sayarak, grafiğin sol yarısını çıktı olarak alırsınız.

Frekans daha yüksekse, sivri merkeze daha yakın olacaktır. Eğer frekans yığın boyutu ile mükemmel senkronize olduğu , başak sadece bir puan genişliğinde olacak ve her şey tam olarak 0. Aksi takdirde yukarıdaki gibi bir sivrilen "etek" olacaktır olacaktır.


Şunu mu demek istediniz: genlik olarak güç tayfı değeri?

t -> zaman referansı ile?

Zaman için endişelenme. Sadece FFT'nin çalışıp çalışmadığını kontrol ediyorsanız, yapmanız gereken tek şey büyüklüğün şeklinin buna benzer olup olmadığını kontrol etmektir.
endolith

Zaten FFT'm düzgün çalışıyor diye komplo yapamıyorum. Grafiği kesinlikle boş zamanlarımda uygulamaya çalışacağım.Çok teşekkürler.

1
@clabacchio: Oh. FFT, grafiğin başında ve sonunda f = 0 ekseni olan bir çıktı üretir. Grafiğin orta noktası f = fs / 2 eksenidir. Grafiği yeniden düzenlemek için genellikle bir fftfreq veya ffthift işlevi vardır, böylece 0 frekans merkezde olur. flic.kr/p/arVeZT
Endolit

0

Verileri ve sonuçları hızlı bir şekilde kontrol etmek için Excel Analiz Araç Takımı içindeki Fourier analiz aracını kullandım.


MAC üzerinde çalışıyorum.

@Warrior - Gnumeric'i yüklemek için MacPorts veya Fink'i kullanın ( isterseniz bir Platypus sarıcısı hakkında bilgi için bu sayfaya da bakın )
Kevin Vermeer
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.