Как смешать 2 цифровых звука?

Обсуждаем цифровые устройства...
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Уважаемые Коты, что-то я туплю :)))
Есть МК, память и ЦАП, все это общается через SPI. Устройство - генератор цифрового звука 8)

Каждые 87мкс МК выдает в ЦАП два байта - это типа звук (8 бит, 11500Гц), и считывает следующий байт из памяти (1 байт инструкция, 3 байта адрес, 1 байт - считывается из памяти). Таким образом получаем байт, который передается в ЦАП в через следующие 87мкс.

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

Как эти 2 звука смешать? Если тупо сложить 2 байта каждого звука, то получится фигня (будет переполнение). Можно ограничить сверху и снизу, но тогда будут искажения. Если взять среднее арифметическое, то это по-моему тоже не правильно.
А если надо смешать 3 звука :shock: (знаю что это МК уже не потянет, но теоретически как?)

Может я в чем-то ошибаюсь? Подскажите пожалуйста :oops:
Реклама
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб фев 27, 2010 11:58:50
Откуда: Горец: Уральские горы

Сообщение Smirnov »

я считаю что нужно считать среднее арефметическое с знаком если ацп дают знак. Или среднее арефметическое нулевого уровня постоянной составляющей, если считать среднее арефметическое просто от нулевого значения байта или слова когда все биты нулевые то это помоему лажей будет, особено если нулевой уровень не по середине а где то в иной области.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ну я предполагаю что нулевой уровень находится где-то как раз в середине...

Ладно, в любом случае, как реальные детали куплю буду разные варианты проверять.
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Вс апр 20, 2008 16:54:13
Откуда: Украина, Чернигов

Сообщение Callous »

Необходимо просуммировать и отбросить младшие биты....по другому никак....я когда то так на плисе с помощью цифровых фильтров делал эквалайзер 8)
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 344
Зарегистрирован: Ср май 13, 2009 20:36:44

Сообщение Scuby_Du »

очень просто-сложить. этот вариант самый правильный. другое дело что у вас возникнет резонанс(и в реальном мире возникает при сложении звуков) на пиках и все переполнится.
так что либо уменьшайте громкость звуков-так получите меньше искажений, либо делайте плавный лимиттер-искажения звука будут только на пиках
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Всем спасибо за советы, буду складывать@ограничивать. Проверил в wavelab, он также делает :))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Если кому интересно...
Появилась возможность продолжить старый проект :)
В общем сделал так (среднее арифметическое):

Код: Выделить всё

...
CLC
ADC звук1,звук2 
ROR звук1
OUT OCR0A,звук1
...
Никаких искажений, все звучит красиво (насколько это возможно для 8бит@11кГц)

Кстати ШИМ выдает звук ничуть не хуже ЦАП, жаль я раньше так не сделал :oops:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва
Re:

Сообщение Engineer_Keen »

_noise писал(а):В чём глубокий смысл выполнения двух действий { CLC, ADC } вместо одного ADD ?
Огрызки от попытки смешания 4х звуков, конечно можно заменить на ADD
_noise писал(а): А ROR вместо LSR ?
...и старший бит от результата сложения магически исчезает... Можно конечно заранее записать звуки в 2 раза тише, чтобы результат заведомо уложился в 8 бит, но меня это не устраивает.
_noise писал(а): "Индусский код" подумалось.
Ну да, может быть... Учтите, что я с AVR знаком всего пол-года, да и программировать меня никто не учил. Хотя после того, как программа полностью работоспособна, я стараюсь ее оптимизировать.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Итак... С момента когда, когда я смешал 2 звука и остался этим доволен прошла пара лет, теперь я возвращаюсь к этой задаче. С тех пор алгоритмы оптимизировались, требования возросли, но правильного алгоритма я пока не придумал. Теперь задача смешать 4 звука.
Исходные данные: 4 последовательности семплов по 8 бит@10500 Гц, в любой момент времени может воспроизводится любое количество звуков (1-4), остальные семплы будут =0 (0х80)

Что было проверено:
1) Среднее арифметическое S=(S1+S2+S3+S4)/4 - не катит совсем, все вместе звуки более менее слышатся, но если например играет только один, то его громкость в 4 раза меньше да и разрешение 4 бита вместо 8 :kill:
2) Среднее арифметическое с учетом не воспроизводящихся звуков S=(S1+...+Sn)/n - гораздо лучше, но при включении/выключении одного из звуков сильно заметно изменение громкости уже воспроизводящихся звуков :kill:
3) Сложение с ограничением S=S1+S2+S3+S4, S>255 -> S=255, S<0 -> S=0, если звук один, все отлично, если 2 - появляются искажения, если 4 - искажения просто адовые :kill:

Я уверен что простая арифметика (+-*/) тут уже не катит...

Попытки найти в интернете выводят на похожие темы, но в 95% случаев выползают советы сделать именно среднее арифметическое или сложение с ограничением :facepalm:

Чую что можно как-то использовать децибелы (как написано тут), но не могу сообразить как это выразить в коде :dont_know:
Ща попробую сделать S=84*LOG(S1+S2+S3+S4), интересно что получится... Хотя не, тоже хрень получится :oops:
PS:Думаю имеет смысл перетащить тему в МК и ПЛИС.
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

К сожалению, по этой теме у меня нет никакого практического опыта, но всегда было интересно как смешать несколько источников звука в цифровом виде. Вот интересная статья Mixing digital audio. Автор решает похожую задачу.
Конечно очень логично что чем меньше один сигнал по сравнению с другими, тем меньшее влияние он оказывает на результат, в конечном счете совсем слабые сигналы можно вообще выбрасывать. А если применять среднее арифметическое, то получается что все сигналы равноправны и тихий сигнал может погасить сильный. Это как все равно говорящий шепотом может заглушить орущего :)
Последний раз редактировалось BorisSPB Чт дек 13, 2012 12:09:18, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

О, спасибо, очень интересная ссылка, и там все-таки используется довольно простая арифметика! Надо попробовать...

Выглядит довольно просто: Z=S1+S2-S1*S2...Wait, OH-SHI~!!!11 в 24-й тиньке же аппаратного умножения нет! А жаль, придется на мегу переходить...
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Можно попробовать суммировать только те звуки, которые отличаются от нуля. если играет один звук - выводить его напрямую, если два - среднее из двух и т.д.

есть еще один способ - подавать на выход максимальное значение из тех что поданы на вход. или сумму из максимального+минимального.
Собственно, в природе звуки именно складываются друг с другом и никаких средних - если звук превышает порог восприятия он просто обрезается.

Как работают аналоговые микшеры - они тоже суммируют амплитуды, и понятно что два звука будут громче чем каждый из них.

Как небольшой обход проблемы можно использовать суммирование в 16-битном виде, а при превышении 8-бит делить результат на 2 пока не влезет в 8 бит.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

) Сложение с ограничением S=S1+S2+S3+S4, S>255 -> S=255, S<0 -> S=0, если звук один, все отлично, если 2 - появляются искажения, если 4 - искажения просто адовые
Суммировать надо с учётом знака.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Alexeyslav писал(а):Можно попробовать суммировать только те звуки, которые отличаются от нуля. если играет один звук - выводить его напрямую, если два - среднее из двух и т.д.
Пробовал (см. пункт2).
Alexeyslav писал(а):Как работают аналоговые микшеры - они тоже суммируют амплитуды, и понятно что два звука будут громче чем каждый из них.
Да, громче, но два звука одинаковой амплитуды будут не в 2 раза громче одного, в этом то и загвоздка.
ploop писал(а):Суммировать надо с учётом знака.
Ну конечно с учетом знака, а то вообще фигня получится, это я упрощенно написал :))
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Вообще-то в 2 раза громче и никак не иначе. Это человеческий слух нелинейный, но если взять осциллограф, то увидишь что звуки именно суммируются. Просто в природе порог дальше которого звуки ограничиваются(255 при 8 битах) возникает при гораздо больших величинах чем мы тут пытаемся оперировать. Надо суммировать 4 8-битных звука? используй 10-битный ЦАП... это именно так и работает, никуда не денешься.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

То что сложить это самое простое и логичное это понятно, но в данном случае не подходит, по крайней мере для 8 битной ШИМ (никакого АЦП ставить нельзя - габариты и скорость на пределе). Если только использовать 16битный таймер в режиме 10бит FastPWM, но он зараза уже занят, а на 8-битном сидит куча других функций помимо звука... Эх, придется все капитально переделывать :solder:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Подождите переделывать, может что-нибудь родим :)

Например, после суммы, если результат приближается к максимуму, сделать разность с небольшим числом (например результат, делённый на 4, или 8 ), получив эдакий "компрессор".
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

ploop писал(а):Подождите переделывать, может что-нибудь родим :)
Вот на это я и надеюсь :) Благо время не поджимает, т.к. девайс делается исключительно в качестве хобби, однако из-за этого и времени на эксперименты не сильно много...
ploop писал(а):Например, после суммы, если результат приближается к максимуму, сделать разность с небольшим числом (например результат, делённый на 4, или 8), получив эдакий "компрессор".
Проверю...
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

Микшер должен получить результат какой происходит при смешении звуковых волн в воздухе. Поэтому простого суммирования быть не может. Если бы звуковое давление просто суммировалось, то хор должен был бы производить звук сравнимый с реактивным самолетом, а звук нескольких самолетов вообще бы разрывал в клочья.
Скорее всего надо просто брать наибольший результат из имеющихся, а остальные отбрасывать.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Не, вот это точно не верно, менее громкий звук тоже должно быть слышно.

Проверял тут разные варианты, пока одна фигня получается, да еще задолбало то, что в WAV файле минус это все что меньше 128, а а контроллере минус - в доп.коде, из-за этого постоянно путаница :facepalm:
Ответить

Вернуться в «Цифровая техника»