Mysteo 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Понял я почему такое сильное усиление получалось. Я в 16 битовом потоке младший байт за старший принимал, а старший за младший. Не понятно как вообще разборчивая речь получалась. Поправил , теперь все встало на свои места mic3.wav Обнаружил новый глюк в даташите на PDM2PCM либу сказано: типо если не хотите использовать фильтр высокичх частот то вбивайте значение 0. Я попробовал вбить 0 и на выходе у меня все время единичный сигнал. Получался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Или тут 0 подразумевается значение не 0x00? А какой то определенный коэффициент ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба В Q0.31 ноль так и будет нулем. Загрузите 0x7FFFFFFF, раз при нуле не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Да я тоже подумал что 0 так и есть 0, но как посмотрел в либе там ождиается uint32_t , поэтому с обычным нулем и не работает. typedef struct{ uint16_t bit_order; uint16_t endianness; uint32_t high_pass_tap; uint16_t in_ptr_channels; uint16_t out_ptr_channels; uint32_t pInternalMemory[PDM2PCM_INTERNAL_MEMORY_SIZE]; }PDM_Filter_Handler_t; Что-то я как всегда сразу сам не догадался посмотреть. Обычно привык, что из коробки всегда все нормально заводилось CMSIS DSP например. Действительно с 0x7FFFFFFF все хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба 1 hour ago, Mysteo said: ождиается uint32_t , поэтому с обычным нулем и не работает ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Ну в библиотеке тип данных указан uint32_t , а в user manual сказано Q31 поэтому и не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Ноль uint32_t инчем не отличается от нуля Q0.31. Не поэтому не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба 20 минут назад, Mysteo сказал: Ну в библиотеке тип данных указан uint32_t , а в user manual сказано Q31 поэтому и не работает. И что? Здесь нет противоречия. Q0.31 - это формат содержимого uint32_t. Хотя логичней было бы конечно использовать не uint32, а int32. Так как Q0.31 - судя по контексту описания предполгается знаковым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба 1 hour ago, jcxz said: Хотя логичней было бы конечно использовать не uint32, а int32 Вот именно это я и хотел донести ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 20 ноября, 2019 Опубликовано 20 ноября, 2019 · Жалоба Ребята почему то случаются пощелкивания .... пока не понимаю из-за чего. Ошибок в передачи данных быть не может. В тишине и при разговоре никаикх пощелкиваний нет. Но когда записываю какой либо синусоидальный сигнал частые щелчки возникают, внезависимости от уровня громкости источника звука и расстояния динамика до микрофона. Вот две записи: speech - я записал сначала немножко тишину потом все ближе и ближе разговаривал к микрофону, вплоть до дистанции 5 см. tone - запись где я синусоидальный звук через динамик воспроизводил и записывал микрофоном, дистанция более 1.5 м. Громкость разную пробовал. Дайте наводку, что может быть не так. speech.wav tone.wav Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 20 ноября, 2019 Опубликовано 20 ноября, 2019 · Жалоба Скачал готовую программу USB микрофона для данной платы, на ней никаких таких проблем не возникает.... блин неуж то где то в передачи данных проблема. Но почему при записи речи и тишины щелчков не слышно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 22 ноября, 2019 Опубликовано 22 ноября, 2019 · Жалоба В общем это передача данных нарушена была.... Видать при голосе частоты все время разные ... и не заметно, а при передачи синуса если хотя бы 1 значение вылетает из синусоиды то щелчок получается. Попробовал сначала накопить аудио в RAM , а потом передать. Щелчков никаких не было . В общем можно сказать что освоил наконец-то PDM с горем пополам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zoolu 0 4 февраля, 2020 Опубликовано 4 февраля, 2020 (изменено) · Жалоба Добрый день! Бьюсь уже наверное неделю с этим PDM2PCM.. Звук есть но сильно искаженный. Компьютерный какой-то... Я инициализирую буфер размерностью 2*DEC_FACTOR. В колбэке DMA запонения половины буфера запускаю фильтр и скармливаю ему готовую половину буфера void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s){ PDM_Filter(&((uint8_t*)(pdm_mic_data))[0], (uint16_t*)&(pcm_mic_data[0]), &PDM1_filter_handler); } Затем в колбэке окончания заполнения буфера докармливаю фильтру вторую часть буфера и затем уже готовый буфер преобразую из знакового типа (фильтр же на выходе дает мне знаковые значения? Для меня это не очевидно) в беззнаковый и перекладываю на воспроизведение в ШИМ. void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s){ uint8_t sign; uint8_t j = 0; PDM_Filter(&((uint8_t*)(pdm_mic_data))[PDM_BUFF_SIZE/2], (uint16_t*)&(pcm_mic_data[PCM_OUT_SIZE]), &PDM1_filter_handler); for (uint8_t i = buf_ptr * PCM_OUT_SIZE; i < (buf_ptr * PCM_OUT_SIZE) + PCM_OUT_SIZE; i++){ if (pcm_mic_data[j] > 0) sign = 1; else sign = 0; PWM_buf[i] = ABS(pcm_mic_data[j]) >> 6; if (sign) PWM_buf[i] = 0x200 + PWM_buf[i]; else PWM_buf[i] = 0x200 - PWM_buf[i]; j++; } } Подскажите пожалуйста что я делаю не так?... P.S. Сигнал WS подключен к микрофону LR Изменено 4 февраля, 2020 пользователем zoolu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 4 февраля, 2020 Опубликовано 4 февраля, 2020 · Жалоба А куда вы выводите звук, чтобы проверить искаженный он или нет? И вы потом выводите PCM звук или то что получаете в вашей функции PWM Buf? Проверьте еще частоту тактирования микрофона , при ваших настройках она должна быть 2МГц , ослилографом желательно посмотрите, а у меня как раз с ней еще проблемы при настройках через CubeMX были, а я как понимаю вы им и пользуетесь И вроде как буфер Вы не правильно инициализировали. У вас PDM FACTOR 64 бита , это значит что подав на вход фильтра 8 байт (64 бита / 8) PDM сигнала получите 1 PCM отчет. А outputSamples у вас выбрано 16 , то есть фильтр ожидает от вас 8 * 16 = 128 байт. Таким образом 128 * 2 = 256 вам нужен рабочий буфер на 256 байт. При заполнении половины буфера в 128 байт скармливаете эти значения фильтру. При заполнении другой половины буфера , снова скармливаете Плюс насколько я помню возня еще с этими HAL библиотеками была. Некорректно DMA буфер заполнялся. Так что проверьте верно ли заполняется у вас буфер В общем все от начала до конца то что я написал проверьте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zoolu 0 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба Получилось у меня в итоге вот что: #define PCM_OUT_SIZE 16 #define PDM_BUFF_SIZE 256 #define PWM_BUFF_SIZE 256 #define PCM_BUFF_SIZE 32 #define BIAS 512 void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s){ PDM_Filter(&((uint8_t*)(pdm_mic_data))[0], (uint16_t*)&(pcm_mic_data[0]), &PDM1_filter_handler);//получаем первые 16 отсчетов PCM } void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s){ uint8_t sign; uint8_t j = 0; PDM_Filter(&((uint8_t*)(pdm_mic_data))[PDM_BUFF_SIZE/2], (uint16_t*)&(pcm_mic_data[PCM_BUFF_SIZE/2]), &PDM1_filter_handler);//вторые 16 отсчетов PCM for (uint16_t i = buf_ptr * PCM_BUFF_SIZE; i < (buf_ptr * PCM_BUFF_SIZE) + PCM_BUFF_SIZE; i++){//преобразуем в 10-битный ШИМ сигнал if (pcm_mic_data[j] > 0) sign = 1; else sign = 0; PWM_buf[i] = ABS(pcm_mic_data[j]) >> 6; if (sign) PWM_buf[i] = BIAS + PWM_buf[i]; else PWM_buf[i] = BIAS - PWM_buf[i]; j++; } if (++buf_ptr > 8) buf_ptr = 0; //размер кольцевого буфера ШИМ = 8 * 32 отсчетов PCM if (buf_ptr == 4 && !PWM_buf_rdy){//При первом заполнении половины буфера ШИМ запускаем воспроизведение PWM_buf_rdy = 1; HAL_TIM_Base_Start_IT(&htim2);//таймер 2 с частотой дискретизации 16кГц подставляет новое значение в CCR1 TIM1 из буфера ШИМ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } } Частота тактирования 1Мгц - проверено осциллографом. Но искажения остались... Увидел одну аморальность- первые два отсчета в pcm_mic_data всегда "битые". Резко выбиваются из остальных. Например при отсутствии сигнала на микрофоне заполнение буфера в районе "0". Но первые два значения могут быть 500 и -1000 например... Подозреваю, что искажения связаны именно с этими значениями... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться