Показать сообщение отдельно
Старый 04.02.2017, 07:09   #6
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: MCP4725: максимальный сэмплрейт

Я смог воспроизвести звук с частотой дискретизации 32000 герц. Думаю, получилось бы и больше (желанные 44100), да вот незадача, когда на ардуине стоит резонатор на 20МГц, то микросхема UART отказывается нормально работать на необходимой скорости (нужно передавать на скорости не менее samplerate * 2 * 10 бод). Подключать внешний UART адаптер на другой микухе было влом, ваять воспроизведение музыки с флешки тоже, поэтому я решил экспериментировать на обычной ардуине на 16МГц.

Сделал скрипт на node.js, которому на вход даю любой аудиофайл, скрипт его конвертирует через ffmpeg в raw файл (просто бинарник с сэмплами, почти как WAV, только без заголовков), после этого обнуляет последние четыре бита каждого сэмпла, снова при помощи ffmpeg конвертирует в файл WAV, чтобы можно было послушать результат на компе (WAV не поддерживает 12-битный звук, таким образом я его эмулирую).

Далее скрипт переходит к воспроизведению через UART. Пригодилась библиотека nanotimer, позволяющая создавать таймауты с точными таймингами. Буфер с сэмплами пакуется в придуманный на скорую руку формат, а именно: сэмпл отправляется двумя последовательными байтами, старшие шесть битов сэмпла в первом байте, а младшие шесть битов во втором. У первого байта старшие два бита всегда устанавливаются в 10, а у второго в 00. Вот так:

[1 0 H H H H H H]
[
0 0 L L L L L L
Для чего это нужно: чтобы ардуина могла синхронизовать данные по приёму и отличить старший байт от младшего. Представьте, что вы выключили скрипт на компе, когда в UART улетел старший байт. А потом вы снова запускаете скрипт и опять первым летит старший байт. Ардуина во внутреннем буфере собъётся и начнёт воспроизводить исковерканные сэмплы. Никому не пожелаю этого услышать. Особенно внезапно, когда колонки стоят на большой громкости и подвоха не ждёшь. В общем теперь ардуина по старшему биту каждого байта может понимать его предназначение.

Да будет звук

На компе полученный файл через плеер звучит прилично. Несмотря на пониженные сэмплрейт и разрядность, слышны высокие частоты, таких шумов как при воспроизведении восьмибитного звука нет. Но это эталон, на который мне нужно равняться. А что же там с моей убийцей реалтека? Всё плохо. Звук говно. Есть шумы, и это не похоже на помехи. Кроме того, высоких частот не слышно совсем, звук глухой. Когда после этого запускаю эту же самую песню на компе, кажется, что я только что вылез из воды и слышал всё до этого со дна бассейна. Судя по всему чип MCP4725 не успевает так быстро менять напряжение на своём выходе, это всё объясняет. А ведь это даже не 44100 герц было.

Пойду и дальше воспроизводить 16-битный звук при помощи двух ШИМ выходов AVR. Несмотря на требуемую настройку по согласованию выходов, результат получается шикарным. А этот кусок говна можно использовать только для... А хрен его знает, даже на ум не приходит. Разве только синус на 50 герц генерировать.

Если кто-то добьётся лучших результатов (мало ли, вдруг я что-то делаю не так), милости прошу в тему, обсудим.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Phantom за это полезное сообщение:
mr.DIMAS (04.02.2017), St_AnGer (04.02.2017)