Jump to content

    

zoolu

Участник
  • Content Count

    7
  • Joined

  • Last visited

Community Reputation

0 Обычный

Recent Profile Visitors

194 profile views
  1. Да нет, я бы не сказал. Чтобы вывести частоту ШИМ далеко за звуковую, приходится снижать его разрядность. Я в итоге имею при частоте МК 84Мгц 10-ти битный ШИМ с частотой 82кГц. И 10-битный ШИМ лучше чем 8-битный ЦАП))) Если есть возможность использовать 12-бит ЦАП, то это самый лучший вариант.
  2. Микрофон-манипулятор для громкоговорящей установки. Следующий этап развития- прикручивание библиотеки AEC))) А ШИМ да, через RC цепочку и на УНЧ.
  3. Ох ёмоё!!! Спасибо огромное! Перепутать байты и биты..... Все заработало просто отлично!
  4. Я окончательно запутался.... Тактирую микрофон частотой 1Мгц. Забираю с него данные по 16 бит. Получается 1 полуслово я получаю с частотой 64кГц. При децимейшн факторе 64 мне в фильтр нужно скормить 32 полуслова. Соответственно я их приму с частотой 2кГц. Где обещанная частота дискретизации 16кГц? Что я делаю не так?
  5. Получилось у меня в итоге вот что: #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 например... Подозреваю, что искажения связаны именно с этими значениями...
  6. Добрый день! Бьюсь уже наверное неделю с этим 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
  7. Случилась такая же проблема... Не могли бы вы помочь с прошивкой?