Picproje Elektronik Sitesi

DİJİTAL & ANALOG ELEKTRONİK => Ses Frekansı => Konuyu başlatan: SB7 - 23 Kasım 2019, 23:17:41

Başlık: FFT ile Ses Analizi
Gönderen: SB7 - 23 Kasım 2019, 23:17:41
Merhabalar.
Stm32f103c8 mcu kartı kullanarak fft ile ses analizi yapmaya çalışıyorum. ADC den aldığım dataları fft rutinlerinden geçirip 16 point spektrum analizör yaptım. Amacım gelen sesin 1 kHz , 10kHz veya farklı bir frekansta olup olmadığını anlayabilmek. Bunu anlamak için belirli frekans bandındaki genlik değerinin diğer frekanstaki genlik değerlerinden büyük olup olmadığını kontrol etmeye çalışıyorum ancak veriler istediğim gibi değil. Birbirlerine çok yakın bu yüzden karar vermek oldukça zorlaşıyor.
Bu projeyle bir robotu kontrol etmeyi hedefliyorum. O yüzden robota istemediğim bir hareket komutu göndermek hiç işime gelmez.
Sizce nasıl bir yol izlemeliyim?
Sesi başka bir stm32 kartıyla %50 pwm oluşturup istediğim frekansta hoparlöre vererek elde etmeyi planlıyorum. Ancak mikrofon girişinden diğer sesler de etkiyecek ve bnim yakalamak istediğim frekansta sesler varmış gibi anlaşılacak. Bunu nasıl önleyebilirim?

Son olarak sizin yapmamı önerebileceğiniz bir tasarım şekli var mıdır. Fft ile ses analizini başka türlü nasıl yapabilirim?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SpeedyX - 24 Kasım 2019, 00:53:54
Anladığım kadarıyla yaşadığın sorunun adı spectral leakage. Öncelikle bir test kaynağı (https://www.youtube.com/watch?v=qNf9nzvnd1k) kullanarak FFT çıktısını bir displayde çizdirip durumu teyyid etmen gerekiyor.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 24 Kasım 2019, 19:16:41
Hocam cevabınız için teşekkürler. Şuan ADC ye 3.3V DC verip fft sonuçlarını uarttan pc ye gönderdim. Bir com test programıyla aldığım veriler bu şekilde.

(https://ibb.co/s5jfNtB)

https://ibb.co/s5jfNtB

Sizce bu veriler tutarlı mı?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SpeedyX - 24 Kasım 2019, 19:22:56
Böyle bir görsel elde edip bakman gerekiyor.
Her sütun birer frekans, her satır ise ilgili frekansın magnitude değeri

(https://external-content.duckduckgo.com/iu/?u=http%3A%2F%2Fi.ebayimg.com%2Ft%2FBLUE-32-32-screen-Audio-LED-Level-Meter-display-Spectrum-Analyzer-for-amp-%2F00%2Fs%2FNTg3WDc4OA%3D%3D%2Fz%2FJKgAAOxyCSRSD4qx%2F%24T2eC16d%2C!)0E9s37HlEpBSD4qwftzg~~60_3.JPG)

Örneğin bu resimde spectral leakage var gibi görünüyor. Anlamanın en kolay yolu sweep sinyal ile gözlemlemek.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 24 Kasım 2019, 19:30:38
Hocam ekran yerine sürekli gelen bir datayı exel de grafiğe döktüm çabuk ilerlemek adına . DC gerilimde bu veriler tutarlı mı sizce?

(https://ibb.co/FxyMG9B)

https://ibb.co/FxyMG9B
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: taydin - 24 Kasım 2019, 19:56:05
DC gerilim verirsen spektrumun 0 Hz noktası civarında enerji olur diğer frekanslarda enerji çok az olur (arka plan gürültüsü). En iyi test temiz bir sinüs sinyali vermek. Böyle yaparsan o sinüsün frekansında enerji olması lazım diğer frekanslarda olmaması lazım.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 24 Kasım 2019, 20:00:56
@taydin hocam 0. bileşenin dc bileşen olduğunu biliyorum. O yüzden onu filtreledim. Merak ettiğim diğer frekans bileşenlerinin genliğinin böyle olması normal mi?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: taydin - 24 Kasım 2019, 20:14:42
Sesle denersen, ses sürekli olarak frekans bileşenleri değişen dinamik birşeydir. Saniyede binlerce FFT almadıktan sonra, anlık spektrum bileşenlerini gösteren sonuç alamazsın ve böyle sıvazlanmış bir sonuç alırsın.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 24 Kasım 2019, 20:48:16
Hocam bana mantıksız gibi geliyor. Online ses generatör sitelerinden belirli sesler üretip mikrofon modülleri ile deneme yaptm biraz önce.  Sabit frekansta da mantıksız değerler aldm. Galiba fft algoritmam iyi değil.  Başka bir fft algoritması kullanmayı deneyeceğim.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SpeedyX - 24 Kasım 2019, 20:50:03
Excelde gösterim işe yarar fakat sweep sinyal ile izlemen gerekir yada sinyal jeneratörü ile (veya başka işlemciyle) sabit frekanslı sinüs üreterek bakmalısın. Nyquist limitine de uygun bir sinyal olmalı.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: taydin - 25 Kasım 2019, 00:32:51
Alıntı yapılan: SB7 - 24 Kasım 2019, 20:48:16Hocam bana mantıksız gibi geliyor. Online ses generatör sitelerinden belirli sesler üretip mikrofon modülleri ile deneme yaptm biraz önce.  Sabit frekansta da mantıksız değerler aldm. Galiba fft algoritmam iyi değil.  Başka bir fft algoritması kullanmayı deneyeceğim.

Matlab varsa öncelikle matlab ile algoritmayı oturt. Matlab yoksa uygun fiyata "Home versiyon" alınabiliyor. Bir kere matlab'de algoritma çalıştı mı, artık aynı algoritmayı nihai sistemde sorunsuz uygularsın.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: Monad - 25 Kasım 2019, 03:32:23
Alıntı yapılan: SB7 - 24 Kasım 2019, 19:16:41Hocam cevabınız için teşekkürler. Şuan ADC ye 3.3V DC verip fft sonuçlarını uarttan pc ye gönderdim. Bir com test programıyla aldığım veriler bu şekilde.

(https://ibb.co/s5jfNtB)

https://ibb.co/s5jfNtB

Sizce bu veriler tutarlı mı?


3.3V dc değilde 0V veriyor olmayasınız? Stm32f103c8 adc'si zaten max 3.3v'a göre ayarlı. Bir pot kullanarak dc 3.3v verip potu çevirerek adc ölçümlerini alıp uart ile gönderiyorsanız muhtemelen pot ters yönde çevrili durumda yani adc pinine 0v'a yakın bir değer veriyorsunuzdur ve adc değeriniz bu kadar küçük ve 0'a yakın çıkıyordur.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 25 Kasım 2019, 11:26:27
@SpeedyX @taydin dediğinizi yapmayı denedim. Ancak matlab uart haberleşmesini sağlayamadm bi türlü. Bu akşam tekrar uğraşmayı deneyeceğim.
@Monad dediğiniz şeyi bnde düşündüm ancak potu en saga en sola orta sabitleyip denemeler yaptm sorun orda değil. 
Başka bir fft algoritması kullanıp denemeler yaptım şuan istediğim sekilde değerler almaya başladm sabit dc de 16 pointte 0 verileri alyorum . Ses girişi yaparak da denemeler yaptım sesi kesince 0 diger durumlarda herbir frekansta farklı genlik değerleri elde ettim. Ancak yine de matlabda denemeler yapmam gerekiyor. Matlab com haberlesmesi ile ilgili elinizde örnek bir kod parcası mevcut mudur?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: taydin - 25 Kasım 2019, 15:54:21
Alıntı yapılan: SB7 - 25 Kasım 2019, 11:26:27dediğinizi yapmayı denedim. Ancak matlab uart haberleşmesini sağlayamadm bi türlü. Bu akşam tekrar uğraşmayı deneyeceğim.

Matlab'de UART haberleşmesi ile hiç uğraşmaya gerek yok. Nihai projede çalışan hardware'de matlab olmayacağına göre bunun hiçbir faydası da yok.

Matlab'de konsept'in doğru olduğunu göreceksin, amaç o. Yazdığın programa hazırladığın veri paketini vereceksin (gerçek sistemde bu veri paketi ADC den gelecek) ve programın ürettiği çıktıyı plot edip inceleyeceksin. Doğru çalıştığına kanaat getirince de matlab programındaki algoritmayı senin MCU'ya aktaracaksın.

Matlab'de örneğin ses kartından ses alıp üzerinde analiz etme opsiyonları var. Veya data acquisition kartlarından bir sürü kanaldan veri toplama falan. Belki birilerine fayda sağlıyordur, veya belki matlab eğitimi verilirken faydalı oluyordur, ama bir projeyi yaparken bunlarla uğraşmak bence vakit kaybı. Matlab altında bu hardware'leri doğru çalıştırsan bile gerçek hardware'de aynı şekilde çalışacağının bir garantisi yok. O yüzden matlab'e sadece işin matematiğini yaptıracaksın :)
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 25 Kasım 2019, 18:24:46
@SB7

FFT duzgun calismiyor gibi gorunuyordu ama halletmissin sanki. Bu arada hem 1kHz hemde 10kHz ye ayni anda bakamazsin. Bunlar 2nin katlari degiller. En iyi ihtimal 1kHz ile ayni anda 8kHz ye ve/veya 16kHz ye bakabilirsin. ::ok
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 25 Kasım 2019, 21:49:43
@taydin hocam şuan istediğim gibi çalışıyor. İstediğim algoritmayı buldum. Matlaba şuan için ihtiyaç kalmadı dediğiniz gibi.
@OptimusPrime hocam aynen şuan oldu gibi. Ancak siz söyleyince aklıma takıldı 16 noktanın genlik değeri elimde bu frekansların kaç Hertz olduğunu anlayabilirim? (Deneme yanılmayla kalibrasyon yapmak aklıma geliyor ama matematiksel olarak kaç hertz olduğu nasıl hesaplanıyor?

Şuan herşey istediğim gibi . Tek yapmam gereken başka bir stm32 kartından DAC ile farklı frekansta sinüs sinyalleri elde edip hoparlöre giriş yapmak. 4 adet buton ile farklı frekansta sinyaller sesler üretip bunların hangi frekansta ses sinyalleri olduğunu anlamak.

Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 25 Kasım 2019, 22:29:48
Madem hazir kutuphane kullaniyorsun, ayarlari bir .h dosyasinin icinde olmali. Ornekleme frekansi, kac nokta fft alindigi vs vs.

Mesela, ornekleme frekansin 16kHz olsun. Nyquist amcaya gore 8kHz en yuksek frekansin. Bu 16. kanalin frekansi. bundan sonra 15 defa daha 2 ye bolerek geri gel. Her sonuc senin bir kanalinin cevap verdigi/olctugu frekans.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 25 Kasım 2019, 23:03:43
Örnekleme frekansım 35kHz ve 16 point fft alyorum 16. Noktanın frekansı 17.5kHz dersek ilk 8 noktanın frekansı birbirine çok yakın oluyor hocam.  Özellikle de 1 2.nokta arasındaki frekans farkı 0.5 Hertz civarı sizce bu mantıklı mı?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 25 Kasım 2019, 23:08:23
Malesef, mal bu.  :D
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 25 Kasım 2019, 23:16:53
Hocam o halde 8 point fft alıp frekans farkını arttırmam daha işlevsel olacak . Çünkü amacım sesleri fft ile ayırt edebilmek. Ancak bu dediğinizi uygulamada denemeden bunu yapmak istemiyorum. Bilindik frekansta sesleri verip deneyeceğim.Uygulamaya dökünce sonucu burdan bildiririm . Herkese çok teşekkür ederim.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: elektronart - 26 Kasım 2019, 10:57:04
bir STM için biraz fazla yükleniyorsun gibi. Eğer ses tanıma gibi bir amacın varsa kullandığın platformu bir üst basamağa taşıman iyi olur. RPi zero gibi bir modül işini kolaylaştırır. Amacın sadece ölçüm yapmak ise MSGEQ7 diye bir çip var. Biraz pahalı ama FFT kısmını bu çip halledebilir.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 26 Kasım 2019, 19:52:25
Bnden istenen fft yi kendim hesaplatmam. Entegreli çözümleri o yüzden düşünmüyorum. Aslnda dediğiniz doğru da şuan için istediklerimi karşılıyor. Daha kapsamlı bir projede dediğiniz mcularla ilgilenebilirim. Şuan bilgim olmadığı için zaman kaybı olacak.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 26 Kasım 2019, 20:06:43
Aslinda senin proje sesden cok ton analizi gibi geldi bana. Eger oyle ise band geciren bir filtrede yazabilirsin, hic fft ile ugrasmadan.  :du:
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: mehmet - 26 Kasım 2019, 23:27:50
Denemelerinizi buradan yapabilirsiniz diye umuyorum:

https://docs.scipy.org/doc/scipy/reference/tutorial/fftpack.html
https://docs.scipy.org/doc/scipy/reference/generated/scipy.fftpack.fft.html
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 15 Aralık 2019, 21:44:51
Merhabalar.
Projeyi tamamlamak üzereyim. Şuan yaptığım çalışmaların sonucunun mantıklı olup olmadığı konusunda kararsız kaldım. Aslında aldığım genlik değerleri mantıklı sonuçlar aldığımı gösteriyor. Ancak hangi frekans bandının genliği olduğunu bulma konusunda biraz sıkıntı çekiyorum.
@OptimusPrime Hocam dediğiniz şekilde sonuçlar almayı beklerken denemeler yaptım . 1kHz, 2kHz, 4kHz ve 8kHz sinyallerin fft sonucunu inceliyorum aldığım sonuçlar böyle:
1kHZ  297 2276 7815 2229 1807 3040 1584  927  477 1009 1654  379 1801  995  840 1051
2kHz  760  999 1275 1498 6651 5409 2200 1002 1418 1943 1955 1437  598  796 1662 2907
4kHz  2938  855  718  873  132  843  491  896 1601  744 9256  789 1031  890  305  828
8kHz  2272 1322  747  442  433  791 1305 1392 1145 5235 4494 1907 1649  966 1287 1347

Hangi sütunun frekansının kaç Hertz olduğunu sizce nasıl anlayabilirim?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 16 Aralık 2019, 00:28:12
16 nokta var fs kac ise ordan bole bole geri geleceksin daha once bahsettigimiz gibi. Ama yinede kullandigin kutuphanenin aciklamalarina bir bak.  ::ok

Bu arada bu degerler bana mantikli gelmedi. Aldigin ornekleri pencerelemiyor olabilir misin?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 16 Aralık 2019, 12:18:37
Hocam kullandığım kütüphane 32 point fft alıyor. For döngüsüyle 16 noktayı uarttan yazdırıyorum. Dediğinizi yaptım ancak çok yakın oluyor. 7000 in üzerine çıkan genlik olduğunda o bandın frekansının olduğunu kabul ederek ilerlemek istedim ancak 1 kHz ile 2kHz arasnda 1 frekans bandının genliği daha ortaya çıkıyor. Sürekli ara değerler oluyor yani.

Pencerelemeden kastınız ne hocam donanımsal bir filtre mi yoksa yazılımla belirli genliğin altındaki degerleri yok sayarak mı yapmam gerekiyor bu işlemi?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: alicavuslu - 16 Aralık 2019, 14:23:00
Alıntı yapılan: SB7 - 25 Kasım 2019, 23:03:43Örnekleme frekansım 35kHz ve 16 point fft alyorum 16. Noktanın frekansı 17.5kHz dersek ilk 8 noktanın frekansı birbirine çok yakın oluyor hocam.  Özellikle de 1 2.nokta arasındaki frekans farkı 0.5 Hertz civarı sizce bu mantıklı mı?

9. Nokta 17.5 KHz frekansına denk gelir. Frekans çözünürlüğü örnekleme frekansı / FFT uzunluğu olarak bulunur. FFT binlerinin  indisleri bu değerler ile çarpılır.

İlk 8 noktadan kasıt FFT binleri ise bu değerler nasıl yakın çıkmış olabilir?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SpeedyX - 16 Aralık 2019, 19:29:43
Alıntı yapılan: SB7 - 16 Aralık 2019, 12:18:37Pencerelemeden kastınız ne hocam donanımsal bir filtre mi yoksa yazılımla belirli genliğin altındaki degerleri yok sayarak mı yapmam gerekiyor bu işlemi?
Hanning window diye arayabilirsin.

Aşağıdakine benzer bir döngüde window tablosunu oluşturup, sonra aldığın analog veriyi bu tablo ile çarptıktan sonra FFT ye vermen gerekiyor. İlk mesajımda spectral leakage diye yazmıştım.
for (int n = -m; n < m; n++)
    w[m + n] = 0.5f + 0.5f * cos(n * r);
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 17 Aralık 2019, 02:24:57
@SB7

@SpeedyX in bahsetrigi gibi hanning veya humming. Dogrudan fft alirsan basina bela olur  :)
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: Mucit23 - 17 Aralık 2019, 09:21:12
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?
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SpeedyX - 17 Aralık 2019, 10:38:59
@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.
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: OptimusPrime - 17 Aralık 2019, 10:46:32
@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  ;)
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: Mucit23 - 17 Aralık 2019, 11:29:18
@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ı



Başlık: Ynt: FFT ile Ses Analizi
Gönderen: 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
Başlık: Ynt: FFT ile Ses Analizi
Gönderen: SB7 - 25 Aralık 2019, 21:17:11
İyi akşamlar. İşlerden dolayı projeyle ilgilenemedim bir süredir.
@SpeedyX hocam

Alıntı yapılan: SpeedyX - 17 Aralık 2019, 14:37:49m = 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.