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 ?
Gelen datalari DACdan cikacak sekile getir ve DAc cikisini dinle. Yada verilerin grafigini ciz.
Sacmalik varsa hemen belli olur.
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.
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.
@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
Kulaklik cikisindan ses almayacaksin. Dac cikisina minik bir amplifikator baglaman yeterli.
https://www.picproje.org/index.php/topic,35896.15.html DAC konusuna bakabilirsin.
@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ı ?
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 ?
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?
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
Dijital sinyalde de parazit olur, shield li ethernet, rs 232 , usb kaloları var. Bence çözerse düşük değerli kapasite de çözer.
USB kablodaki D+ ve D- hatlarının analog olduğu kanaatindeyim
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.
Data ve clock değil o.
Ethernet kablosundaki gibi diferansiyel çalışıyor
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
kapasite eklemek sorunumu çözmedi besleme hattına 220 ile ve 1000uF ile deneme yaptım. Elimde shieldli kablo olmadığı için alüminyum folyo ile sardım gnd ye bağladım etkisi olmadı.
Sensörün vdd gnd ve sd pinlerine dokunup biraz bastırdığımda parazit kesiliyor lehimlerini elden geçirdim.
sd pini 100k ile pulldown yapılmış pcbsinde fakat datasheet de ki şemada stereo bağlantıda 100k bağlantısını gösteriyor
madem kablon ekranlı değil
testini yaparken kablolar çok kısa olsun, hemen mcu'nun yanında gibi
bu mikrofon omnidirectional yapıda imiş, yani her yonden gelen seslere açık
üzerine küçük bir konik yapıp ses alma alanını daralt, bu konik mümkünse sünger gibi gürültü üretmeyecek şeylerden olsun
mesela bir süngerin ortasına bir delik açarak gibi
testleri yaparken cihaz/karta dokunma sürtme olmasın
bunun için de kartı yine bir sünger üzerinde konumlandır
koblolara falan el sürtmesin
bu ve bunun gibi önlemleri aldıktan sonra yazılımının doğruluğunu test et,
aldığın sesi bir hoparlöre veriyor isen hoparlör mümkün olduğunca çok çok uzakta olsun,
ses olabildiğince kısık olsun, geri dönüş yapar.
Kabloları kısaltınca sorunum kalmadı teşekkür ederim ilgilenen herkese.