Перейти к содержанию
    

Помогите разобраться с цифровым микрофоном на плате 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, aaarrr said:

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Mysteo said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

16 hours ago, Mysteo said:

image.png.45c4561a2fc38605d9b62b989c9daef3.png

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

Eg9U4YmqtCU.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, Mysteo said:

 

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

 

LR - not fitted

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4afc 

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

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, Mysteo said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Mysteo said:

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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 форматом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...