Jump to content

    

Помогите разобраться с цифровым микрофоном на плате STM32F4Discovery

Здравствуйте! Необходимо понять как работает цифровой микрофон MP45DT02, а точнее получить с него нормальные PCM данные.

Из мануала к плате STM32F4Discovery выясняем что микрофон подрублен к I2S2

image.png.4b910e0a811003c4fe277b5a3a5d6131.png

Из мануала AN5027 выясняем следующие вещи

image.thumb.png.a3ce80aa474a21ea06da4d2302009e7f.png

И настраиваем I2S следующим образом.

image.png.45c4561a2fc38605d9b62b989c9daef3.png

 

Дальше нужно использовать будет библиотеку чтобы преобразовать PDM данные в PCM , сама работа библиотеки описана вот здесь UM2372 руки пока у меня до нее не дотянулись, но при первом просмотре мне не понятно следующее:
на 11 странице данного мануала есть вот такая замечательная табличка и рисуночек  

image.png.1d3c778f5ab08244b1f6a37c42d001b4.pngimage.png.8c42e58defc5f4b45956d98ac9195b6f.png

 

1. Что такое Decimation factor ? 

2. откуда берется PDM clock frequency 

3. если мы выбрали В I2S 16 кГц аудиоданные, то чему будет равно PDM clock frequency ? И почему берется только 16 бит из 32 битного фрейма, если подключен только 1 микрофон разве не должно быть выбрано 16 бит из 16 битного фрейма?

image.png

Share this post


Link to post
Share on other sites

1. Отношение PDM clock frequency к PCM sample rate

2. Генерируется STM32 как BCLK

3. Зависит от выбранного Decimation factor. Где берется 16 бит?

Share this post


Link to post
Share on other sites
56 minutes ago, aaarrr said:

Где берется 16 бит?

На второй картинке выложенной мной, взятой из   AN5027  из примера настройки I2S  при моно подключении цифрового микрофона

Тогда я совсем запутался. При настройке тактирования I2S Clock 153.6 МГц и выставленной опцией I2S Audio Frequency 16 кГц . Мне с частотой 16 кГц в буфер будет прилетать PDM сигнал размером 16 бит?

 

Я до этого настраивал микрофон через DFSDM там как то по понятнее все было и Example нормальный был

Share this post


Link to post
Share on other sites
1 hour ago, Mysteo said:

Тогда я совсем запутался. При настройке тактирования I2S Clock 153.6 МГц и выставленной опцией I2S Audio Frequency 16 кГц . Мне с частотой 16 кГц в буфер будет прилетать PDM сигнал размером 16 бит?

PDM сигнал будет прилетать в Decimation factor раз чаще, 16кГц получатся после фильтрации. Вам нужно настроить битовый клок на одну из частот PDM из таблички (сначала проверить, что микрофон тоже её поддерживает), принимать данные без разрывов (т.е. на каждом такте задвигать бит) и скармливать их ST'шной библиотеке. Как-то так.

Share this post


Link to post
Share on other sites

Вбил настройки из этого скрина, Смотрю щупом I2S2_CLK реально 1.024 МГц. 
 

16 hours ago, Mysteo said:

image.png.45c4561a2fc38605d9b62b989c9daef3.png

Только мне не нравится PDM сигнал, он же должен быть либо 0 либо 1 , а тут какое то третья состояние есть между 0 и 1... или это нормальное явление ? Но по мне ерунда какая то... 

Eg9U4YmqtCU.jpg

Share this post


Link to post
Share on other sites
31 minutes ago, Mysteo said:

 

Только мне не нравится PDM сигнал, он же должен быть либо 0 либо 1 , а тут какое то третья состояние есть между 0 и 1... или это нормальное явление ? Но по мне ерунда какая то... 

 

LR - not fitted

Share this post


Link to post
Share on other sites

4afc 

На отладочной плате LR к земле притянут.

 

И еще не подскажете как остановить работу DMA в дебагере при попадании в точку останова ?
Если периферия тактируется от какого либо таймера, я знаю способ например:
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_TIM2_STOP ;

А в данном случае не понятно что делать, а то при отладке при заполнении половины буфера и при попадании в точку остановки он еще успевает мне накидать кучу данных

 

Share this post


Link to post
Share on other sites

Отпаял этот резистор ничего не изменилось.... с микрофоном что ли что-то ?

Share this post


Link to post
Share on other sites
16 minutes ago, Mysteo said:

Отпаял этот резистор ничего не изменилось.... с микрофоном что ли что-то ?

Микрофон выставляет данные только на пол периода по фронту или по срезу в зависимости от того куда LR подключен.

Остальные пол периода выход в третьем состоянии, но уровень обычно не меняется... если пинцетом не трогать...

Может у вас вход STM не вход?

Share this post


Link to post
Share on other sites

Скачал готовую программу в Hex

картина не поменялась, микрофон работает нормально, звук через USB выводится в ПК

Share this post


Link to post
Share on other sites
2 hours ago, Mysteo said:

Только мне не нравится PDM сигнал, он же должен быть либо 0 либо 1 , а тут какое то третья состояние есть между 0 и 1... или это нормальное явление ?

Нормально, смотрите в DS на микрофон - там нарисовано. 0/1 и 3е состояние вперемешку.

 

Собственно _4afc_ вам уже сказал

Share this post


Link to post
Share on other sites

Да я уже тоже понял что это нормально. 
Сейчас буду разбираться как DMA настроить нормально ну и саму либу PDM2PCM ковырять. 
С тактированием вопрос решенный. 

 

Я правильно понимаю , что если подам на вход фильтра при 64 децимации и тактировании 1024 кГц 64 бита , то на выходе получу 16битное PCM значение соответствующее частоте дискретизации 16кГц ?

Share this post


Link to post
Share on other sites

Блин как остановить передачу данных при попадании в брейкпоинт , а то не понятно правильно я настроил DMA и прерывания или нет. 

Видно, я что-то не так настроил DMA....

При PDM Clock Frequency 1.024 kHz у меня каждые 16кГц только 16 бит в DMA успевает накопиться. А должно вроде как 64 бита появляться

Share this post


Link to post
Share on other sites

Получилось, только звук какой то ужасный.

 

void MX_PDM2PCM_Init(void)
{
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

   /** 
  */
  PDM1_filter_handler.bit_order = PDM_FILTER_BIT_ORDER_LSB;
  PDM1_filter_handler.endianness = PDM_FILTER_ENDIANNESS_BE;
  PDM1_filter_handler.high_pass_tap = 2104533974;
  PDM1_filter_handler.in_ptr_channels = 1;
  PDM1_filter_handler.out_ptr_channels = 1; 
  PDM_Filter_Init(&PDM1_filter_handler);

  PDM1_filter_config.decimation_factor = PDM_FILTER_DEC_FACTOR_64;
  PDM1_filter_config.output_samples_number = 1;
  PDM1_filter_config.mic_gain = 0; 
  PDM_Filter_setConfig(&PDM1_filter_handler, &PDM1_filter_config);

  /* USER CODE BEGIN 3 */
  /* USER CODE END 3 */

}

 

Вот мои настройки PDM фильтра. 

А вот звук который получается, много шума и слишком большое усиление, хотя я более чем в метра от микрофона был.

При прослушке сделайте пожалуйста заранее колонки по тише



image.png.54242c298328ee45c40168d9016adfae.png

mic.wav

 

 

Спустя десяток минут

Урааа , оказывается gain нужно вообще убирать )))) поставил - 12  и намного лучше стало, но все равно сильно чувствительно, разговариваю в 1 метре от микрофона и голос направляю в другую сторону от микрофона

image.png.d54e118c3bcb6b72b1854aa605b129f0.png

 

 

 

mic2.wav

 

 

Назрел новый вопрос :
1. Почему библиотека pdm2pcm юзает Q31 формат фильтра верхний частот , если выходные данные PCM имеют uint16 формат, можно же обойтись было Q15 форматом

Share this post


Link to post
Share on other sites

Метр от микрофона... комната ~50 кв. м прослушивалась, словно рядом находился...
Осторожнее, по нынешним временам легко незаконным изготовлением и оборотом техспецсредств оказаться занимающимся... эти цифровые микрофончики для "жучков" в т.ч. предназначаются (слуховые аппараты эт так - побочка).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now