Dijital Mikrofon nasıl çalışır? Ses nasıl dijitalize edilir?

Başlatan Mucit23, 08 Haziran 2017, 22:56:36

Mucit23

Selamlar

Bu mikrofon çipleri ile çalışmak istiyorum. Elimdeki ST32F4 Disco kartında hazır dijital mikrofon varken doğrudan yazılıma odaklanabilirim sanırım. Kartın üzerinde MP45DT02 diye bir çip var.

Bu çiplerle haberleşmek için anladığım kadarıyla I2S donanımları kullanılıyor. Ses datası seri olarak geliyor ama dijital olarak nasıl saklanıyor veya dijital formda nasıl bulunuyor anlayamadım. Ayrıca bir PDM filtre konusu var. STM32F4 için yazılmış std lib içerisindeki örnek uygulamaya baktım. Anladığım kadarıyla mikofondan okunan datalar birde pdm filtreden geçiriliyor. Bunun mantığı nedir?

GreeN

Merhaba @Mucit23 ,

Konu ile ilgili bir calisma yapabidin mi? Yardima ihtiyacim var .
Terörü Lanetliyoruz.

Mucit23

Bi ara ilgilenmiştim ama bende olayı tam olarak anlayamadım. Yarıda bırakmıştım. Amacım FFT alırken Analog mikrofon ile ses sinyali almak yerine kit üzerindeki dijital mikrofonu kullanıp sesi örneklemekti. Ama pdm filtre vs işin içine girince çıkamadım işin içinden

GreeN

 ST32F4 Discovery uzerinde hazir mikrofon varken degerlendirmek istedim.  SD karta kaydettigim sesler gurultuden baska birsey degil su an. Yardim edecek biri cikarsa  diye bir baslangic yapmak istiyorum ;

ornegin ;
Microfonumuz MP45DT02 ve pdm kodlar uretiyor , iletisim icin i2s kullaniyoruz. (pulse desity modilation)
ses frekansi 16.000 Hz. 16bit
pdm filtre icin pdm orneklerini tutacak dizi boyutu 128*16000/16000=128 (basitce bu sekilde hesaplaniyor sanirim (128*ses frekansi/ 16000))
pdm filtreden sonra sesimiz artik pcm oluyor. Yani bir wav dosyasi olusturabilecek veriler elimizde.
pcm ses orneklerini tutacak dizi boyutu ses frekansi /1000= 16000/1000 = 16 (stm32f kart uzerinde mono mikrofon var. stereo icin boyut 2 kati oluyor.)

Bu giris bilgilerinin ardindan 1. sorun su ki ben burada problem olduguu dusunuyorum , i2s kurulumunu dogru yaptigimdan emin degilim.


hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_16K*2;
i2s frekansi ses frekansimizin en az iki kati olmali (Nyquist)
hi2s2.Init.Standard = I2S_STANDARD_LSB;
Sanirim Microsoft bir cok dosya formatinda oldugu gibi ses dosyalarinda da little endian kullaniyor. onun icin 16 bit ornekler dosyaya bu formatta yazilmali. misal 0x3F25   dosyaya 25 3F olarak yaziliyor.
  hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;
pdm ses datamiz  16bit.
hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
RX modunda calisacagiz.
hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
Eger islemcimiz 168 mhz calisma frekansina M=8 , N=336 ve P=2 ile elde edildi ise i2s clock ayarinda N=192 ve R=6 secilerek clock source 32Mhz yapimali (bu frekans sadece 16k, 32k ve katlari icin , 22.050 ,44100 .... icin farkli frekans secilmeli)


hi2s2.Instance = SPI2;
  hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
  hi2s2.Init.Standard = I2S_STANDARD_LSB;
  hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;
  hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
  hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_16K*2;
  hi2s2.Init.CPOL = I2S_CPOL_HIGH;
  hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
  hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;


i2s bu ayarlar ile calistirip dma her 128 ornekten sonra bir kesme olusturuyor. Buraya kadar bir sikinti yoksa PDM_FILTER oncesindeyiz. Buraya kadar bir sikinti var mi?
Terörü Lanetliyoruz.

GreeN



En azindan dogru yolda olup olmadigimi anlamak icin filtre cikisini bir dizide biriktirip 'reel fft' ye tabi tuttum. Sonuc cok guzel , simdi bir ses dosyasi nasil olusturulur ?


Terörü Lanetliyoruz.