16bit/48kHz WAV на Atmega644P

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: 16bit/48kHz WAV на Atmega644P

Сообщение oleg110592 »

Два ЦАПа в паре, одному слать первые 8 бит, второму - вторые.

Нет, такое не практикуется.

Ну почему же - у Чена в его waw player http://elm-chan.org/works/sd8p/report.html два 8-ми битных шима смешиваются и получается 16 битный звук. См. схему Mono(Hi-Res).
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

два 8-ми битных шима


Человек спрашивал про встроенные R-2R ЦАПы.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
alexg-nn
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн дек 09, 2013 14:06:21
Откуда: Н.Новгород

Re: 16bit/48kHz WAV на Atmega644P

Сообщение alexg-nn »

YS писал(а):Как вы себе это представляете?

Ну, я так вот, чисто "с кандачка" это представлял, как описал товарищ uk8amk
Не думал только, что это будет такой сложностью. В моём представлении главный вопрос был в синхронности запуска преобразований на обоих ЦАПах. Но, очевидно, этот способ не годится.

oleg110592 писал(а):у Чена в его waw player

Я вот что-то покурил-покурил код его примера (main.c) и ни разу не понял, как там так хитро происходит разделение на два ШИМа. Магия функции rump для меня осталась загадкой.

----------

Вообще, карты на стол, вот такой динамик мне достался из колонок SVEN 210 (1Вт, 8Ом):

Изображение

Задача моя получить звучание хотя бы на уровне самих колонок. А они, к слову, не так уж и плохо звучат для своей стоимости. Хотя усилок там простенький (не помню микросхему, правда).
Но вот от компа играют вполне себе. Все же ролики, которые я видел в интернете, с поделками вида "звук/музыка на AVR" всегда звучали как вражеское радио/рация/кейген. Половина из них вообще сняты на телефон, поэтому судить о качестве звучания нельзя.

Я бы рад попробовать все варианты (с ШИМ AVR, с встроенным ЦАПом Cortex'a, с внешним ЦАПом на 16 бит) и выбрать лучший. Но все микрухи в корпусах SOIC и иже с ним, макетировать это вообще нереально. Да и заказывать надо это дело - не рядом лежит. Поэтому хотелось ещё "на берегу" выбрать вариант с оптимальным звучанием. Даже цена тут не так важна - решения все примерно одного порядка по стоимости.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

Вообще, карты на стол


Тогда расскажите заодно, зачем вам там звук. Т.е., это будет оповещение, звуковой эффект, воспроизведение музыки, что-то еще?

Для целей оповещения и эффектов с таким динамиком заморачиваться на ЦАП вообще смысла нет. ШИМ вывод проще и дешевле, а усилитель класса D эффективнее.

Заморачиваться на внешний ЦАП имеет смысл только тогда, когда планируется проигрывание музыки, причем специально для ее прослушивания (то есть, не оповещение и не эффект).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
alexg-nn
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн дек 09, 2013 14:06:21
Откуда: Н.Новгород

Re: 16bit/48kHz WAV на Atmega644P

Сообщение alexg-nn »

А разве оповещение возможно лишь звуком "динь-дон" как на вокзале? Это устройство для жилого помещение, проигрывает или небольшой отрывок музыкальной композиции, ну, скажем, минуту. Или голосовое уведомление. Но при этом голос не должен казаться скрипучим и срезанным по частоте/тону.

Вообще, любой плеер музыки справится с уведомлением, но не любой уведомитель справится с проигрыванием музыкального трека.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

Это устройство для жилого помещение, проигрывает или небольшой отрывок музыкальной композиции, ну, скажем, минуту. Или голосовое уведомление.


Понятно. Как по мне, 16 кГц/8 бит - ваш выбор, как и мой.

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

Я ради прикола тестировал на музыке (например). Никаких скрипов и прочего, совершенно. Для такого динамика - вполне адекватно.

Разумеется, к заливаемому звуку я применял компрессию и нормализацию.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: 16bit/48kHz WAV на Atmega644P

Сообщение oleg110592 »

Человек спрашивал про встроенные R-2R ЦАПы

а какая разница - можно и цапы суммировать http://72.3.161.91/?rID=38989
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

Интересно услышать, что в итоге у автора получилось. Оправдал ли надежды ЦАП PT8211? Я подумываю сделать что-то вроде дверного звонка, но восьмибитный звук меня не устраивает, когда воспроизводимая музыка имеет широкий динамический диапазон, то на тихих звуках вылазят очень противные вещи, которые отчётливо слышно. Решил погуглить недорогие цапы, наткнулся на PT8211, прикинул, что смогу его подцепить к AVR. Погуглив уже конкретно про него, попал на эту тему. Варианта для себя пока вижу два: попытаться увеличить разрядность при помощи двух PWM каналов, либо внешний цап.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

Шестнадцать бит и внешний ЦАП для дверного звонка - это круто.

когда воспроизводимая музыка имеет широкий динамический диапазон, то на тихих звуках вылазят очень противные вещи, которые отчётливо слышно.


В этом случае проще прогнать музыку через компрессор (4:1 или даже 8:1) - после этого все проблемы исчезают. Тем более это полезно потому, что звонок должен быть громким, без больших перепадов среднего звукового давления.

По опыту говорю, что 8 бит/16 кГц на маленьких 0.5 Вт динамиках после соответствующей предобработки (шумоподавление + компрессия) звучит на удивление прилично.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
L.O.D
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Re: 16bit/48kHz WAV на Atmega644P

Сообщение L.O.D »

YS писал(а):прогнать музыку через компрессор (4:1 или даже 8:1) - после этого все проблемы исчезают.
А разве это не приводит к уменьшению действующей "битности" фонограммы?
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

А я не хочу исключительно громкий звонок. Я такого пугаюсь. :shock: Хочу нарастающую громкость. 16-и битный звук на самом деле и не нужен, но 8-и бит тоже маловато. Хочется поднять разрешение хотя бы немного. Попробую для начала два PWM канала, всё равно ЦАПов под рукой пока нет.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

А разве это не приводит к уменьшению действующей "битности" фонограммы?


Разумеется. Мы, собственно, к этому и стремимся - ужать шестнадцатибитный звук до динамического диапазона восьмибитного, после чего снизить разрядность до восьми бит, не потеряв информации.

16-и битный звук на самом деле и не нужен, но 8-и бит тоже маловато.


Возьмите STM32F10x, в них бывает по 2 шт. двенадцатибитных ЦАПов.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
L.O.D
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Re: 16bit/48kHz WAV на Atmega644P

Сообщение L.O.D »

YS писал(а):Мы, собственно, к этому и стремимся - ужать шестнадцатибитный звук до динамического диапазона восьмибитного
А, так компрессия применяется к 16-битному? Просто, Phantom Art писал, что файл изначально 8-битный, вероятно, Вы этого не заметили. А с 16-битным все понятно.
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

Файлы (mp3, lossless) буду конвертировать в удобный формат для контроллера. С STM связываться не хочу пока, в ближайшее время в планах разобраться с ESP для других проектов. Знаю, что постепенно надо изучать что-то новое, но пока что AVR удовлетворяла всем моим творческим фантазиям. Думаю и с этим проектом обойдусь одной AVR, возможно даже без ЦАПа.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

Просто, Phantom Art писал, что файл изначально 8-битный, вероятно, Вы этого не заметили.


Гм, да, не заметил. Ну так тогда и увеличение разрядности ЦАП не поможет, просто сам файл имеет низкое качество.

Но, повторюсь, верно сформированный восьмибитный файл звучит на удивление прилично.

Файлы (mp3, lossless) буду конвертировать в удобный формат для контроллера.


Собственно, как делал я: открывал mp3-файл, компрессировал его по самое нехочу, после чего экспортировал как 8-bit 16 kHz PCM WAV и заливал во внешнюю FLASH-память, подключенную к МК, даже не отрезая заголовок - он очень короткий и при воспроизведении его не слышно.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

Я не хочу компрессировать звук, я хочу честный динамический диапазон, субъективно 10-12 бит должно хватить, чтобы я был доволен.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: 16bit/48kHz WAV на Atmega644P

Сообщение YS »

Дело ваше, но у меня есть твердое ощущение, что проблема, которую вы стараетесь решить, лежит вовсе не в этой плоскости.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

Если будут удачные результаты экспериментов, то выложу тут сэмплы, запишу звук через линейный вход внешней звуковой карты (саундбластер) для сравнения.
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

Итак, я попробовал воспроизводить 16-ти битный звук при помощи двух ШИМ выходов ATmega8.

Собирал всё на макетке, той, что белая пластиковая с дырочками. Подход, который я использовал, описан в этой статье: Построение ЦАП разрешением выше 12 бит на примере STM32 (не реклама). Последовательно с одним из резисторов воткнул переменный, чтобы можно было регулировать соотношение. Полученный сигнал пробовал загонять на вход активных колонок и в линейный вход звуковой карты. Для линейного входа пришлось добавить ещё один переменный резистор, чтобы отрегулировать максимальную амплитуду до уровня, не приводящего к перегрузке. Причём всё это работает даже без фильтра НЧ. Понятия не имею как правильно его рассчитать, учитывая такую связку сопротивлений и не зная внутреннего сопротивления звуковой карты, внутреннего сопротивления портов микроконтроллера. Пробовал подключать параллельно выходу конденсатор на 0.1 мкФ (из звука на слух сразу пропадают высокие частоты) и на 0.01 мкФ (звук на слух не изменяется или изменяется незначительно). По хорошему, наверно, нужно запилить повторитель на операционнике, чтобы выкинуть из уравнения хотя бы сопротивление звуковой карты (или колонок). У меня мало опыта в аналоговых вещах. Пока будет так, как есть. Тем более, что звук на удивление хорош.

Да, звук хорош! По сравнению с 8-ми битным ШИМ-ом сразу заметны детали и нет раздражающего шипения. Самое интересное, при вращении первого переменного резистора, качество звука на слух почти не изменяется. Видимо его значение влияет только на последние N бит, которые не вносят в аудиозапись сильно слышимых характерных искажений. Безусловно, если заменить его на другой номинал, то можно добиться и более слышимых изменений. Но я проводил эксперименты из того, что было под рукой.

Звук формировал на компьютере и отправлял на микроконтроллер по UART. Пока не пробовал использовать SD карту. Но ранее без проблем воспроизводил восьмибитный звук с SD карты на ATtiny85 и ATmega8. Карту использовал без ФС, чтобы упростить написание прошивки. Надеюсь, хватит ресурсов и для 16-ти битного звука, и не придётся при этом обращаться к ассемблеру.

Программная часть на компьютере была написана на JavaScript (Node.js). Соединение осуществлялось при помощи библиотеки SerialPort. Изначально я пытался прокинуть весь воспроизводимый звук со звуковой карты в UART. Для захвата звука в Node.js тоже есть библиотека, называется node-core-audio. Я уже успешно использовал всю эту связку перед Новым Годом, чтобы сделать светомузыку из RGB гирлянды. Но в данном случае нужно было передавать более внушительный поток данных, да ещё и с выдержанными таймингами, а в JavaScript с этим проблемы. Можно было реализовать это на каком-нибудь питоне или Си, но с питоном я не знаком, а на Си под винду почти не писал. А вот с Node.js и JavaScript в целом знаком неплохо. В общем, сделать захват и чтобы это корректно звучало у меня пока не вышло, поэтому я решил упростить задачу.

Я решил брать аудиофайлы, преобразовывать в нужный PCM формат (wav без заголовков) и отдавать порциями в UART (всё тем же JavaScript). Конвертировать любые аудио и видео в нужный формат можно при помощи популярной утилиты ffmpeg. Я имел с ней дело неоднократно, поэтому разобраться с подходящей командой заняло пять минут. Добавил вызов этой команды прямо в JavaScript.

Так как со строгими таймингами в JavaScript туго, да и частота как ни крути будет отличаться на компьютере и микроконтроллере, было решено ввести небольшую синхронизацию. Программа ждёт поступление по UART байта от микроконтроллера. Не важно значение байта, важен сам факт его приёма. После этого программа незамедлительно (насколько это возможно в JavaScript) отправляет порцию данных и ждёт следующего "сигнала". Вот и всё, такой вот рабочий цикл. Размер порции данных должен быть равен половине внутреннего кольцевого буфера в микроконтроллере.

Забегая вперёд, хочу сказать, что всё это заработало как надо только при размере буфера не менее 800 байт (не хило, учитывая, что на борту микроконтроллера всего 1024 байта оперативы). Причём, как мне кажется, проблема на стороне JavaScript, а не микроконтроллера (всякими протеусами не пользуюсь, всё отлаживаю сразу в железе, только хардкор!), потому что в контроллере отправить и принять байт через UART - это быстро и естественно. А вот в JavaScript лучше осуществлять трансфер данных порциями. И чем порция больше, тем быстрее будет реальная скорость передачи данных. Если, например, передавать по одному байту, то количество исполняемого оверхед кода для такой, казалось бы простой, операции возрастает неимоверно. В принципе, теперь, когда я отладил работу с файлами, возможно, получится реализовать изначальную задумку и с захватом звука на компе. Может попробую позже.

Программа в микроконтроллере выполняется в двух прерываниях: прерывание по приёму байта по UART и прерывание по Compare Match таймера для изменения регистров ШИМ, чтобы вывести очередной семпл. В main() только настраиваются все необходимые регистры и разрешаются прерывания. Для оптимизации внутри прерывания по приёму байта по UART нет никаких проверок по выходу за границы буфера. То есть весь код прерывания выглядит так: *(buffer++) = UDR; Это означает, что можно положить программу просто отправив с компьютера в UART подряд слишком много данных. Но на деле этого никогда не происходит, благодаря синхронизации, описанной выше. Для экспериментов и так сойдёт. Вся остальная работа происходит во втором прерывании, его код содержит около десяти строк. Это прерывание вызывается в два раза реже, чем то, поэтому я и вынес в него всю логику. Почему так? Потому что звук вывожу 16-ти битный, а это два байта на семпл, значит принять по UART нужно в два раза больше байт, чем нужно вывести семплов.

Поскольку я использую микроконтроллер, не имеющий на борту сверхскоростной ШИМ (как в ATtiny85), мне кажется, логичнее всего использовать такую частоту дискретизации звука (sample rate), чтобы частота ШИМ была кратной ей. Таким образом на каждый семпл будет отводиться всегда одинаковое количество импульсов ШИМ, что должно благоприятно сказаться на качестве звука. Я пробовал выводить семплы со скоростью равной частоте ШИМ, но микроконтроллер не успевает работать с такой скоростью. Поэтому я в экспериментах использовал скорость, равную частоте ШИМ, делённой на 2 (получается 2 импульса на каждый семпл). Это оптимальнй вариант, потому что делать семпл рейт ниже этого значения, сказывается на качестве звучания в худшую сторону, так как срезаются высокие частоты. Можно не привязываться к частоте ШИМ и подобрать такой параметр регистра, чтобы семпл рейт был близок к стандартным 44100, но мне субъективно показалось, что звучание хуже, если не соблюдать кратность с частотой ШИМ. Тем более, что на данный момент, ресемплинг аудиофайлов делается автоматически скриптом на компьютере и задать можно абсолютно любой семпл рейт.

По спецификации на ATmega8 стабильная работа обещается при частоте тактирования не выше 16 МГц. Тем не менее, я успешно на практике реализовывал стабильно работающие устройства с резонаторами на 20, 18.43 и 24 МГц. Под фразой "стабильно работающие устройства" я не подразумеваю системы навигации ракет, а лишь небольшие единичные поделки, но тем не менее. В описываемом эксперименте я применял резонаторы на 16, 20, 24 и вытащенный с ненужного модема 25 МГц. Работает почти стабильно на всех. Только на двух последних иногда слышны артефакты в виде единичных шипящих щелчков. Судя по всему, это происходит из-за того, что при передаче данных по UART теряется байт и поэтому сбивается вся посылка размером в половину буфера. Возможно дело не в высокой частоте так таковой, а в качестве соединений на макетной плате. Когда ко мне приедут с Китая ардуины, где всё спаяно как следует, попробую припаять туда резонаторы на разные частоты.

В каждом случае UART настраивался для работы на максимальной скорости. Попытки задать делитель не увенчались успехом, почему-то не было стабильного соединения. Возможно, дело в софте, используемом на компьютере или с моим USB -> UART адаптером. Почему-то работают либо общепринятые варианты скоростей вроде 9600 бод (что слишком медленно и не подходит под задачу), либо максимально возможная (UBRR = 0; UCSRA |= 1 << U2X;). Отмечу, что на максимальной скорости стабильно работало от всех резонаторов, даже от 25 МГц (ну не считая вышеописанных щелчков). В принципе, работает на максимуме и ладно, мне только лучше. Максимальный бодрейт UART в AVR можно вычислить, поделив тактовую частоту микроконтроллера на 8. А чтобы получить скорость в байтах в секундах, нужно дополнительно ещё поделить на 10 (1 байт = 10 бод). Следовательно для вычисления скорости в Б/с нужно делить тактовую частоту на 80.

Так как стоит задача выводить 16-и битный звук, то каждый семпл кодируется 2-мя байтами. Поэтому можно вычислить битрейт путём умножения семпл рейта на 2. Битрейт для удобства буду указывать в байтах в секунду (не в битах!). При выборе семпл рейта нужно не забывать, что если битрейт будет выше скорости UART, то шарманка не запоёт, а закрехтит, потому что данные физически не будут успевать передаваться.

Таким образом я имел на борту следующие варианты конфигурации:

При тактировании резонатором на 16 МГц

PWM: 16 МГц / 256 = 62 500 Гц
SampleRate: PWM / 2 = 31 250 Гц
Bitrate: SampleRate * 2 = 62 500 Б/с
UART: 16 МГц / 80 = 200 000 Б/с

При тактировании резонатором на 20 МГц

PWM: 20 МГц / 256 = 78 125 Гц
SampleRate: PWM / 2 = 39 062.5 Гц
Bitrate: SampleRate * 2 = 78 125 Б/с
UART: 20 МГц / 80 = 250 000 Б/с

При тактировании резонатором на 24 МГц

PWM: 24 МГц / 256 = 93 750 Гц
SampleRate: PWM / 2 = 46 875 Гц
Bitrate: SampleRate * 2 = 93 750 Б/с
UART: 24 МГц / 80 = 300 000 Б/с

При тактировании резонатором на 25 МГц

PWM: 25 МГц / 256 = 97 656.25 Гц
SampleRate: PWM / 2 = 48 828.125 Гц
Bitrate: SampleRate * 2 = 97 656.25 Б/с
UART: 25 МГц / 80 = 312 500 Б/с

Все дробные значения округлял как учили в школе. На слух скорость воспроизведения изменяется не нисколько не значительно.

Как видно, при использовании резонаторов на 24 и 25 МГц частота дискретизации выше стандартных 44100 и следовательно можно воспроизводить аудио файлы без потери качества, нужно только их предварительно пересемплировать. При этом размер файлов вырастет незначительно. При использовании резонатора на 20 МГц частота дискретизации чуть больше 39 кГц, на слух звучит так же прилично, как и предыдущие варианты, и это не удивительно, потому что эта частота дискретизации позволяет воспроизводить частоты почти до 20 кГц, а такие высокие звуки способен услышать не каждый, тем более на рядовой акустической системе. А вот при использовании резонатора на 16 МГц уже заметно, что не хватает верхов в звучании. Оно и понятно, частота дискретизации всего 31 кГц. В этом случае можно подредачить исходник программы микроконтроллера и настроить на частоту дискретизации, близкую к 44100, она не будет кратной с частотой ШИМ, но по крайней мере появятся высокие частоты.

Я пока остановился на конфигурации с резонатором на 20 МГц, потому что на нём работает полностью стабильно и ресурсов микроконтроллера для текущих потребностей хватает. В будущем буду использовать ардуино с ATmega328 на борту, а она в отличие от ATmega8, может стабильно работать на частоте 20 МГц (судя по даташиту). А ещё у неё есть шесть ШИМ выходов, а значит можно запилить даже стерео звук! Но прошивку для микроконтроллера придётся оптимизировать. Вряд ли получится, но мечтать не вредно!

P.S. Выкладываю обещанную запись. В архиве три wav файла. Оригинальный, взятый с lossless образа, фрагмент. Он же, но сконвертированный в 8-ми битный, для сравнения. И он же, но воспроизведённый через мою вундер вафлю с записью через линейный порт звуковой карты. Так как моя система поддерживает только моно звук, то я сделал запись дважды, отдельно левого и отдельно правого каналов, после чего объединил полученные дорожки в стерео трек (просто, чтобы слушать приятнее было). Запись и сведение осуществлялись в программе Audacity. Отчётливо слышно шипение на 8-ми битной записи и его отсутствие на 16-ти битной. Не исключено, что искажения, артефакты и шипение вы услышите и на 16-и битной записи, всё зависит от используемого оборудования, но 8-ми битный звук однозначно плох.

Использованная конфигурация: частота микроконтроллера 20 МГц, частота дискретизации 39 кГц (это частота при воспроизведении с микроконтроллера, запись на компьютере велась в 44100).

Ссылка: Архив с демо записью

P.P.S. Аудиофилы, не качайте, оно вам не надо :music:
Phantom Art
Родился
Сообщения: 15
Зарегистрирован: Чт июл 09, 2015 21:34:36

Re: 16bit/48kHz WAV на Atmega644P

Сообщение Phantom Art »

Если выкрутить громкость на акустике на полную, то слышны какие-то цифровые помехи, причём они пропадают, стоит только выдернуть UART адаптер. Оказалось, что дело было в земляной петле, на плату заводилась масса с компа через UART адаптер и через линейный вход звуковухи. Выдернул массу UART с платы и звук чудесным образом стал кристально чистым. Помимо этого добавил в код возможность программной регулировки громкости. Если понизить громкость в 256 раз, то мы получим восьмибитный звук, но с очень слабым уровнем сигнала. Таким образом уменьшая громкость в 64, 128, 256 раз, можно убрать с воспроизводимого звука влияние самых старших бит, благодаря чему можно оценить на слух, насколько хорошо подобраны резисторы в цепи ШИМ выходов. Прослушивание проводил в наушниках и в колонках, при этом громкость на колонках и звуковой карте была выставлена на максимум. Сидел прямо возле колонки и слушал. Звучит потрясно, как на мой слух, определённо не хуже, чем с моей звуковой карты SOUND BLASTER X-FI SURROUND 5.1 PRO. А возможно даже лучше, так как звук выводится напрямую в RAW виде, минуя микшер операционной системы.

Да, питание завожу на микроконтроллер с блока питания 12V 2A, после чего оно понижается до пяти вольт при помощи ams1117, стоят конденсаторы с обоих сторон питания МК электролитический и керамический. Никаких премудростей больше нет. По деньгам всё это можно собрать за пару баксов (даже дешевле скорее всего), если с Китая заказать Arduino Nano (можно даже с ATmega168, дешевле будет) и добавить несколько резисторов. Можно сделать USB звуковуху (если доработать ПО на компе). А если получится, можно даже стерео! Идея для стартапа!
Ответить

Вернуться в «AVR»