INMP441 Mems Mikrofon Nasıl Test Edebilirim ?

Başlatan görkem, 11 Şubat 2021, 14:46:57

görkem

Merhaba Arkadaşlar,
INMP441 stm32f4 ile I2S Protokolü ile haberleşiyorum 48 Khz ile 512 adet örnek alıyorum sesiz ortamda veriler geliyor fakat gerçekten doğru verilerin geldiğini nasıl test edebilirim ?
Sessiz ortamdada sensörden veriler geliyor.
Arm ın fft kütüphanesini kullanarak spectrum oluşturmaya çalıştım 128 örnek aldım fakat çalışmıyor. Mikrofondan doğru veri alamıyorum diye düşünüyorum kodları ofise geçtiğim anda ekleyeceğim görüşleriniz nedir ?

z

Gelen datalari DACdan  cikacak sekile getir ve DAc cikisini dinle. Yada verilerin grafigini ciz.

Sacmalik varsa hemen belli olur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OG

Alıntı YapI2S Protokolü ile haberleşiyorum 48 Khz ile 512 adet örnek alıyorum sesiz ortamda veriler geliyor fakat gerçekten doğru verilerin geldiğini nasıl test edebilirim ?
Sessiz ortamdada sensörden veriler geliyor.

Sessizlik de bir değerdir, karşılığı sıfır bile olsa bir değer, I2S de değerleri seri formatta göndermenin bir usulüdür.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Sozuak

PC de belli frekansta ses üretip ortama yayıp, po sesi de dinleyerek örneklediğiniz sesin spektrumda doğru görünüp görülmediğine bakabilirsiniz.

görkem

@z stm32f4 discovery de sanırım direk dac a veriyi verdiğimizde kulaklık çıkışından bir sinyal alamıyoruz d class anfisi var o kısmı kontrol etmemiz gerekiyor. o kısım çok zamanımı alacağa benziyor.
sinyali kesdiğimde dc bileşenin fft kısmında düzgün çalıştığını stm studio ile takip edebildim bar grafikte.
512 adet örneğin fft uzunluğu 256 oluyor dc bileşende sinyal kesik iken 256 değerini elde ettim.

@OG Sessizlik evet bir değer fakat bu değer sıfıra yakın olması gerektiğini düşünüyorum ama bendeki değerlerin hiç alakası yok ortamdaki sese görede sesin sinyalini alamıyorum. I2S protokolü evet verilerin seri şekilde gönderilme şekli fakat benim problemim  eksik yaptığım bir işlem sanırım okurken.Mikrofondan  aldığım veriyi PDM ye convert etmeme gerek var mı bilemedim datasheet de öyle bir bilgi yok.Neden verileri düzgün alamıyorum hala anlamış değilim.

@Sozuak o Şekilde baktım hiç bir şekilde tepki alamıyorum frekansa göre sürekli bir gürültü varmış gibi değerler değişiyor.

Kodlarım aşağıda.



168 Mhz hızında çalışıyor işlemcim.

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_I2S_Receive(&hi2s2,(uint16_t *)buffer,512,100);

		for (i = 0; i < SAMPLES; i+=2) {
     
			Input[(uint16_t)i] = (float32_t)((buffer[i/2] - (float32_t)4294967295.0) / (float32_t)4294967295.0);
            
      Input[(uint16_t)(i+1)] = 0;
		}
		
		arm_cfft_radix4_init_f32(&S, FFT_SIZE, 0, 1);
		
		arm_cfft_radix4_f32(&S, Input);
		
		arm_cmplx_mag_f32(Input, Output, FFT_SIZE);
		
		arm_max_f32(Output, FFT_SIZE, &maxValue, &maxIndex);
		

		for(uint16_t k=0;k<FFT_SIZE/2;k++)
		{
			deger[k]=(float32_t)Output[k];
		}

  }
  /* USER CODE END 3 */
}


I2S Konfigurasyon

static void MX_I2S2_Init(void)
{

  /* USER CODE BEGIN I2S2_Init 0 */

  /* USER CODE END I2S2_Init 0 */

  /* USER CODE BEGIN I2S2_Init 1 */

  /* USER CODE END I2S2_Init 1 */
  hi2s2.Instance = SPI2;
  hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
  hi2s2.Init.Standard = I2S_STANDARD_MSB;
  hi2s2.Init.DataFormat = I2S_DATAFORMAT_24B;
  hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
  hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_44K;
  hi2s2.Init.CPOL = I2S_CPOL_LOW;
  hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
  hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;
  if (HAL_I2S_Init(&hi2s2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2S2_Init 2 */

  /* USER CODE END I2S2_Init 2 */

}

I2S source clock  98 Mhz de

z

Kulaklik cikisindan ses almayacaksin. Dac cikisina minik bir amplifikator baglaman yeterli.

https://www.picproje.org/index.php/topic,35896.15.html DAC konusuna bakabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

görkem

@z hocam gerek kalmadı sanırım lojik analizör ile verilere baktım benim stm den okuduğum değerler arasında dağlar kadar farkvar.

problem sensör 24 bit veri gönderiyor ve 32 bit paketler halinde geliyor fakat I2S receive fonksiyonu max 16 bitlik değer alabiliyor

diziyi 32 bit tanımlayıp  fonksiyonda 16 bitlik pointer olarak tanımlıyorum hata burdan kaynaklanıyor 24 biti nasıl okuyabilirim fikriniz var mı ?

görkem

Problemi çözdüm 16 bit okuma yapabildiği için, 32 bit için 2 kere okuma yaptığımda problem çözüldü.
Dikkatimi çeken bir durum oluştu.
Mikrofonun breadboard da standart jumper kablolarına temas ettiğim anda gürültüler son bulmakta muhtemelen jumper uzunluğu örnekleme hızından kaynaklı bir parazit durumu oluşturuyor olabilir mi ?

Sozuak

Alıntı yapılan: görkem - 13 Şubat 2021, 02:43:15Problemi çözdüm 16 bit okuma yapabildiği için, 32 bit için 2 kere okuma yaptığımda problem çözüldü.
Dikkatimi çeken bir durum oluştu.
Mikrofonun breadboard da standart jumper kablolarına temas ettiğim anda gürültüler son bulmakta muhtemelen jumper uzunluğu örnekleme hızından kaynaklı bir parazit durumu oluşturuyor olabilir mi ?

Blendajlı (shield) kablo yada burulu kablo şeklinde dener misiniz?

power20

#9
Bu dijital  mikrofon elemanı, metal, kapalı kutu olup dijital çıkış veriyor. Üzerinde ses almak için ufak delik var. Bu durumda blendajlı kablonun etkisi ne olacak? Çıkışta dijital sinyal mi bozuluyor?

Benim tahminim, besleme hattı üzerindeki parazitler etkiliyor. Dahili ADC bunları okuyor.
Parçanın besleme noktasına çok yakın olacak şekilde 47..220uF gibi büyük kapasite eklenmesi sorunu kesin çözer sanıyorum

Sozuak

Dijital sinyalde de parazit olur, shield li ethernet, rs 232 , usb kaloları var. Bence çözerse düşük değerli kapasite de çözer.

power20

USB kablodaki D+ ve D- hatlarının analog olduğu kanaatindeyim

OG

Alıntı yapılan: Kılıç - 13 Şubat 2021, 12:12:28USB kablodaki D+ ve D- hatlarının analog olduğu kanaatindeyim
Data ve Clock olarak kullanılırken digital
diğer işleri sense ederken analog (şarj, version vs)
gibi.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

power20

Data ve clock değil o.
Ethernet kablosundaki gibi diferansiyel çalışıyor

OG

ben de öyle biliyorum ama bazı yerlerda data/clock şeklinde tanımlıyorlar diye öyle yazdım

D+, D- differential yapılarda tanımlama şekli
mesela
https://www.picproje.org/index.php/topic,59991.0.html
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.