Mysteo 0 Posted November 13, 2019 · Report post Здравствуйте! Необходимо понять как работает цифровой микрофон MP45DT02, а точнее получить с него нормальные PCM данные. Из мануала к плате STM32F4Discovery выясняем что микрофон подрублен к I2S2 Из мануала AN5027 выясняем следующие вещи И настраиваем I2S следующим образом. Дальше нужно использовать будет библиотеку чтобы преобразовать PDM данные в PCM , сама работа библиотеки описана вот здесь UM2372 руки пока у меня до нее не дотянулись, но при первом просмотре мне не понятно следующее: на 11 странице данного мануала есть вот такая замечательная табличка и рисуночек 1. Что такое Decimation factor ? 2. откуда берется PDM clock frequency 3. если мы выбрали В I2S 16 кГц аудиоданные, то чему будет равно PDM clock frequency ? И почему берется только 16 бит из 32 битного фрейма, если подключен только 1 микрофон разве не должно быть выбрано 16 бит из 16 битного фрейма? Quote Ответить с цитированием Share this post Link to post Share on other sites
aaarrr 0 Posted November 13, 2019 · Report post 1. Отношение PDM clock frequency к PCM sample rate 2. Генерируется STM32 как BCLK 3. Зависит от выбранного Decimation factor. Где берется 16 бит? Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 13, 2019 · Report post 56 minutes ago, aaarrr said: Где берется 16 бит? На второй картинке выложенной мной, взятой из AN5027 из примера настройки I2S при моно подключении цифрового микрофона Тогда я совсем запутался. При настройке тактирования I2S Clock 153.6 МГц и выставленной опцией I2S Audio Frequency 16 кГц . Мне с частотой 16 кГц в буфер будет прилетать PDM сигнал размером 16 бит? Я до этого настраивал микрофон через DFSDM там как то по понятнее все было и Example нормальный был Quote Ответить с цитированием Share this post Link to post Share on other sites
aaarrr 0 Posted November 13, 2019 · Report post 1 hour ago, Mysteo said: Тогда я совсем запутался. При настройке тактирования I2S Clock 153.6 МГц и выставленной опцией I2S Audio Frequency 16 кГц . Мне с частотой 16 кГц в буфер будет прилетать PDM сигнал размером 16 бит? PDM сигнал будет прилетать в Decimation factor раз чаще, 16кГц получатся после фильтрации. Вам нужно настроить битовый клок на одну из частот PDM из таблички (сначала проверить, что микрофон тоже её поддерживает), принимать данные без разрывов (т.е. на каждом такте задвигать бит) и скармливать их ST'шной библиотеке. Как-то так. Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 14, 2019 · Report post Вбил настройки из этого скрина, Смотрю щупом I2S2_CLK реально 1.024 МГц. 16 hours ago, Mysteo said: Только мне не нравится PDM сигнал, он же должен быть либо 0 либо 1 , а тут какое то третья состояние есть между 0 и 1... или это нормальное явление ? Но по мне ерунда какая то... Quote Ответить с цитированием Share this post Link to post Share on other sites
_4afc_ 0 Posted November 14, 2019 · Report post 31 minutes ago, Mysteo said: Только мне не нравится PDM сигнал, он же должен быть либо 0 либо 1 , а тут какое то третья состояние есть между 0 и 1... или это нормальное явление ? Но по мне ерунда какая то... LR - not fitted Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 14, 2019 · Report post 4afc На отладочной плате LR к земле притянут. И еще не подскажете как остановить работу DMA в дебагере при попадании в точку останова ? Если периферия тактируется от какого либо таймера, я знаю способ например: DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_TIM2_STOP ; А в данном случае не понятно что делать, а то при отладке при заполнении половины буфера и при попадании в точку остановки он еще успевает мне накидать кучу данных Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 14, 2019 · Report post Отпаял этот резистор ничего не изменилось.... с микрофоном что ли что-то ? Quote Ответить с цитированием Share this post Link to post Share on other sites
_4afc_ 0 Posted November 14, 2019 · Report post 16 minutes ago, Mysteo said: Отпаял этот резистор ничего не изменилось.... с микрофоном что ли что-то ? Микрофон выставляет данные только на пол периода по фронту или по срезу в зависимости от того куда LR подключен. Остальные пол периода выход в третьем состоянии, но уровень обычно не меняется... если пинцетом не трогать... Может у вас вход STM не вход? Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 14, 2019 · Report post Скачал готовую программу в Hex картина не поменялась, микрофон работает нормально, звук через USB выводится в ПК Quote Ответить с цитированием Share this post Link to post Share on other sites
xvr 0 Posted November 14, 2019 · Report post 2 hours ago, Mysteo said: Только мне не нравится PDM сигнал, он же должен быть либо 0 либо 1 , а тут какое то третья состояние есть между 0 и 1... или это нормальное явление ? Нормально, смотрите в DS на микрофон - там нарисовано. 0/1 и 3е состояние вперемешку. Собственно _4afc_ вам уже сказал Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 14, 2019 · Report post Да я уже тоже понял что это нормально. Сейчас буду разбираться как DMA настроить нормально ну и саму либу PDM2PCM ковырять. С тактированием вопрос решенный. Я правильно понимаю , что если подам на вход фильтра при 64 децимации и тактировании 1024 кГц 64 бита , то на выходе получу 16битное PCM значение соответствующее частоте дискретизации 16кГц ? Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 14, 2019 · Report post Блин как остановить передачу данных при попадании в брейкпоинт , а то не понятно правильно я настроил DMA и прерывания или нет. Видно, я что-то не так настроил DMA.... При PDM Clock Frequency 1.024 kHz у меня каждые 16кГц только 16 бит в DMA успевает накопиться. А должно вроде как 64 бита появляться Quote Ответить с цитированием Share this post Link to post Share on other sites
Mysteo 0 Posted November 18, 2019 · Report post Получилось, только звук какой то ужасный. 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 фильтра. А вот звук который получается, много шума и слишком большое усиление, хотя я более чем в метра от микрофона был. При прослушке сделайте пожалуйста заранее колонки по тише mic.wav Спустя десяток минут Урааа , оказывается gain нужно вообще убирать )))) поставил - 12 и намного лучше стало, но все равно сильно чувствительно, разговариваю в 1 метре от микрофона и голос направляю в другую сторону от микрофона mic2.wav Назрел новый вопрос : 1. Почему библиотека pdm2pcm юзает Q31 формат фильтра верхний частот , если выходные данные PCM имеют uint16 формат, можно же обойтись было Q15 форматом Quote Ответить с цитированием Share this post Link to post Share on other sites
Obam 0 Posted November 18, 2019 · Report post Метр от микрофона... комната ~50 кв. м прослушивалась, словно рядом находился... Осторожнее, по нынешним временам легко незаконным изготовлением и оборотом техспецсредств оказаться занимающимся... эти цифровые микрофончики для "жучков" в т.ч. предназначаются (слуховые аппараты эт так - побочка). Quote Ответить с цитированием Share this post Link to post Share on other sites