FFT ile Ses Analizi

Başlatan SB7, 23 Kasım 2019, 23:17:41

Mucit23

FFT alırken ben okuduğum ADC değerlerini +-1 aralığına dönüştürüp FFT fonksiyonuna veriyordum. Aslında güzel sonuçlar alıyordum ama ben windowing işlemi yapmıyordum. Bunun faydası nedir?

SpeedyX

@Mucit23 rectangular cutoff distortion dan kaçınmak için window uygulanır. Uygulanmazsa spectral leakage  oluşur, güç spektrumu biraz "smeared" görünür. Bu konuda ilk mesajlarda bahsetmiştim.

OptimusPrime

@Mucit23
Sende matlab vardir  :)

Sinwt girisi icin T periodunda fft al. Sonra bunu birde 3T/2 icin yap. Bak neler oluyor.  :D  Sonra aynisini birde pencereleyerek yap  ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Mucit23

#33
@OptimusPrime evet matlab var dediğini Bi deniyeyim ::ok

@SpeedyX

Diyelim 32 point fft alıyoruz. FFT için örnek sayımız 64 olmak zorunda. Ve Nyquist frekansında örneklenmiş olmalı. Temel bilgilerim bunlar.

for (int n = -m; n < m; n++)
    w[m + n] = 0.5f + 0.5f * cos(n * r);

Benim ham verilerim yine +-1 aralığında değiştiğini düşünelim. Windowing için yukarıda yapılan işlemde adcden alınan ham verileri üzerinde yukarıda elde ettiğimiz değerlerle çarpıp gönderiyoruz anladığım kadarıyla. Yukarıdaki hesapta "r" nedir?

Burada da çeşitli pencereleme fonksiyonları verilmiş.
https://liquidsdr.org/doc/windowing/

Tam kafamda oturtamadım olayı




SpeedyX

m = block_size / 2;
r = pi / (m + 1);
for (int n = -m; n < m; n++)
   w[m + n] = 0.5f + 0.5f * Math.cos(n * r);
w --> block_size boyutunda dizi : window için üretilen değerleri tutuyor ve bir defa hesaplamak yeterli

SB7

İyi akşamlar. İşlerden dolayı projeyle ilgilenemedim bir süredir.
@SpeedyX hocam

Alıntı yapılan: SpeedyX - 17 Aralık 2019, 14:37:49
m = block_size / 2;
r = pi / (m + 1);
for (int n = -m; n < m; n++)
   w[m + n] = 0.5f + 0.5f * Math.cos(n * r);
w --> block_size boyutunda dizi : window için üretilen değerleri tutuyor ve bir defa hesaplamak yeterli

bu algoritmayı aynen projeme eklemeyi düşünüyorum ancak biraz açıklama yapmanızı isteyeceğim.
Baştan başlamam gerekecek
1)block_size dediğimiz şey barların istediğimiz genliği mi olacak? Öyleyse ne seçmem gerekiyor?
2)w değerini bir defa hesaplamanız yeterli demişsiniz hesaplama yöntemi nasıl olacak örnek bir hesap var mı?
3. sorum bu algoritmanın çalışma şekli ancak ilk 2 sorumun cevabını alınca deneyerek cevap alacağımı düşünüyorum.
-SB7