FFT ile Ses Analizi

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

SB7

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?
-SB7

SpeedyX

Anladığım kadarıyla yaşadığın sorunun adı spectral leakage. Öncelikle bir test kaynağı kullanarak FFT çıktısını bir displayde çizdirip durumu teyyid etmen gerekiyor.

SB7

#2
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

Sizce bu veriler tutarlı mı?
-SB7

SpeedyX

Böyle bir görsel elde edip bakman gerekiyor.
Her sütun birer frekans, her satır ise ilgili frekansın magnitude değeri



Örneğin bu resimde spectral leakage var gibi görünüyor. Anlamanın en kolay yolu sweep sinyal ile gözlemlemek.

SB7

#4
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
-SB7

taydin

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.
Timur Aydın (mekatronik.org)

SB7

@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?
-SB7

taydin

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.
Timur Aydın (mekatronik.org)

SB7

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.
-SB7

SpeedyX

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ı.

taydin

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.
Timur Aydın (mekatronik.org)

Monad

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.

(Resim gizlendi görmek için tıklayın.)

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.

SB7

@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?
-SB7

taydin

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 :)
Timur Aydın (mekatronik.org)

OptimusPrime

@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
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 ||