Как преобразовать PCM в PWM?
Я новичок и разрабатываю собственную библиотеку для волнового проигрывателя. пока у меня установлена SD-карта, подключены OLED и поворотный энкодер. Я успешно прочитал фрагмент волны и его данные (16 бит и 44,1 кГц). Мой вопрос в том, что данные в волновом файле - это PCM, и я хочу воспроизвести его с использованием 16-битного PWM, и как мне преобразовать PCM в PWM?
@Sankalp, 👍0
Обсуждение2 ответа
Не существует такого понятия, как файл PCM. PCM совершенно ошибочно используется для описания несжатого цифрового аудиофайла. На самом деле это означает «файл, содержащий данные, которые могут быть переданы непосредственно на устройство PCM без какого-либо промежуточного преобразования».
То, что у вас есть в WAV-файле "PCM", - это просто необработанные данные образца. После вашего заголовка (обычно 44 байта) у вас есть только 16-битные значения, представляющие ваши точки выборки, с двумя каналами, чередующимися один за другим.
Поскольку PCM представляет собой линейное представление звука, ожидаемые данные выборки представляют собой простое линейное представление звука (в отличие от µLaw или A-law) и без сжатия (например, MP3 или FLAC). И это точно такие же данные, которые ожидает PWM, поскольку это тоже простой линейный выход.
Однако все это не имеет значения, потому что Arduino просто недостаточно мощен, чтобы воспроизвести ваш файл. Может быть, меньший (8 кГц, моно, 8 бит) будет воспроизводиться, но не ваш. Цифры просто не складываются.
Доступен пример PCMAudio, но он работает только со звуком, встроенным в вашу программу.
Также доступна библиотека TMRpcm, которая воспроизводится с SD-карты, но ограничена 8-битным моно, хотя может предположительно сделать частоту дискретизации до 32 кГц (хотя я бы не хотел пытаться делать что-то еще на этой частоте).
Вам лучше использовать систему, более ориентированную на аудио. Лучшим решением будет система с подключенным чипом I2S CODEC.
Спасибо за ранний ответ. Ну, я подумал, можем ли мы использовать 16-битный ШИМ для вывода звука с прерыванием таймера 44 кГц. И чтобы компенсировать низкую емкость памяти Arduino, мы можем использовать двойную буферизацию с SD-карты. ИЛИ Добавление внешней 16-битной микросхемы ЦАП уменьшит сложность, потому что тогда, возможно, мне не придется беспокоиться о ШИМ? (Я не уверен в этой части.), @Sankalp
Смотрите мой ответ ниже. PCM, безусловно, можно преобразовать в PWM и воспроизвести на большинстве микроконтроллеров., @Dominic Cerisano
Для этого следует использовать микроконтроллер с генераторами ШИМ.
Проблема с PWM заключается в том, что максимальное разрешение довольно низкое (10 бит), поэтому вы фактически ограничены 8-битным PCM.
- Используйте DSP-редактор, например Audacity, для экспорта беззнакового 8-битного WAV-файла с частотой 16 кГц.
- Импортируйте WAV-файл как массив беззнаковых символов.
- Установите частоту ШИМ на резонансную частоту динамика (например, 31 250 Гц).
- Установите таймер ШИМ на частоту 16 кГц и установите рабочий цикл ШИМ на следующее значение массива.
Я использую частоту дискретизации 16 кГц, потому что:
- Уменьшенный объем памяти.
- Меньше прерываний таймера
- Ограниченное разрешение ШИМ, кажется, не выигрывает от частот выше 16 кГц.
- Я использую пьезодинамики, подключенные напрямую к контактам ШИМ в Н-мосте.
- Отдельный модуль усилителя может выиграть от более высокой частоты дискретизации.
**Комментарии были [перемещены в чат]( https://chat.stackexchange.com/rooms/145086/discussion-on-answer-by-dominic-cerisano-how-do-you-convert-pcm-to-pwm ); пожалуйста, не продолжайте обсуждение здесь.** Перед публикацией комментария под этим, пожалуйста, ознакомьтесь с [назначениями комментариев](/help/привилегии/комментарий). Комментарии, которые не требуют пояснений или предложений по улучшению, обычно относятся к [ответу](/help/how-to-answer), [мета] или [чату]. Комментарии, продолжающие обсуждение, могут быть удалены., @Juraj
- Вопрос таймера: фазовая корректировка ШИМ на определенной частоте
- Настройка вывода на непрерывный выходной сигнал
- Установите частоту ШИМ на 25 кГц.
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Генерация частоты ШИМ выше 125 кГц с помощью Arduino Uno
- Увеличить разрядность PWM
http://playground.arduino.cc/Code/PCMAudio, @Ignacio Vazquez-Abrams
Arduino не является аудиоплеером. У него не будет достаточно вычислительной мощности и/или памяти для работы с SD-картой, обновления OLED-дисплея и воспроизведения звука. Используйте специализированное оборудование и достойный ЦАП для воспроизведения звука., @tttapa
Или пойти по дешевому пути и использовать фильтр LC. В этом видео есть хорошая информация как о ЦАПах (в стиле R2R), так и о ЦАПах с ШИМ + фильтром: https://www.youtube.com/watch?v=Y2OPnrgb0pY Какая у вас акустическая система? Возможно, вам понадобится еще один операционный усилитель или аудиоусилитель., @Maximilian Gerhardt
tttapa, я видел много руководств в Интернете. Может быть, если я удалю OLED-дисплей, он сможет запустить его, но мне просто любопытно, и я хочу дойти до конца, даже если результат не тот, который мне нужен., @Sankalp
Максимилиан Герхардт, LC-фильтр имеет смысл после того, как я сгенерировал ШИМ-сигнал. Вся моя проблема в том, что я не умею этого делать. Я просто не знаю, что такое интерфейс между файлом PCM WAVE и PWM., @Sankalp