Страница 1 из 2
Как смешать 2 цифровых звука?
Добавлено: Чт мар 11, 2010 17:57:45
Engineer_Keen
Уважаемые Коты, что-то я туплю
Есть МК, память и ЦАП, все это общается через SPI. Устройство - генератор цифрового звука
Каждые 87мкс МК выдает в ЦАП два байта - это типа звук (8 бит, 11500Гц), и считывает следующий байт из памяти (1 байт инструкция, 3 байта адрес, 1 байт - считывается из памяти). Таким образом получаем байт, который передается в ЦАП в через следующие 87мкс.
Собственно в чем затык: если выводить просто один звук, то нет проблем, а если например надо выводить 1 звук (допустим дизель - зацикленный), и параллельно ему еще один (допустим - гудок), то тут я и туплю...
Как эти 2 звука смешать? Если тупо сложить 2 байта каждого звука, то получится фигня (будет переполнение). Можно ограничить сверху и снизу, но тогда будут искажения. Если взять среднее арифметическое, то это по-моему тоже не правильно.
А если надо смешать 3 звука

(знаю что это МК уже не потянет, но теоретически как?)
Может я в чем-то ошибаюсь? Подскажите пожалуйста

Добавлено: Чт мар 11, 2010 18:22:17
Smirnov
я считаю что нужно считать среднее арефметическое с знаком если ацп дают знак. Или среднее арефметическое нулевого уровня постоянной составляющей, если считать среднее арефметическое просто от нулевого значения байта или слова когда все биты нулевые то это помоему лажей будет, особено если нулевой уровень не по середине а где то в иной области.
Добавлено: Чт мар 11, 2010 18:31:29
Engineer_Keen
Ну я предполагаю что нулевой уровень находится где-то как раз в середине...
Ладно, в любом случае, как реальные детали куплю буду разные варианты проверять.
Добавлено: Чт мар 11, 2010 18:45:05
Callous
Необходимо просуммировать и отбросить младшие биты....по другому никак....я когда то так на плисе с помощью цифровых фильтров делал эквалайзер

Добавлено: Пт мар 12, 2010 08:47:22
Scuby_Du
очень просто-сложить. этот вариант самый правильный. другое дело что у вас возникнет резонанс(и в реальном мире возникает при сложении звуков) на пиках и все переполнится.
так что либо уменьшайте громкость звуков-так получите меньше искажений, либо делайте плавный лимиттер-искажения звука будут только на пиках
Добавлено: Пт мар 12, 2010 09:48:52
Engineer_Keen
Всем спасибо за советы, буду складывать@ограничивать. Проверил в wavelab, он также делает

Re: Как смешать 2 цифровых звука?
Добавлено: Вт июн 15, 2010 16:28:03
Engineer_Keen
Если кому интересно...
Появилась возможность продолжить старый проект
В общем сделал так (среднее арифметическое):
Код: Выделить всё
...
CLC
ADC звук1,звук2
ROR звук1
OUT OCR0A,звук1
...
Никаких искажений, все звучит красиво (насколько это возможно для 8бит@11кГц)
Кстати ШИМ выдает звук ничуть не хуже ЦАП, жаль я раньше так не сделал

Re:
Добавлено: Вс июн 27, 2010 14:11:07
Engineer_Keen
_noise писал(а):В чём глубокий смысл выполнения двух действий { CLC, ADC } вместо одного ADD ?
Огрызки от попытки смешания 4х звуков, конечно можно заменить на ADD
_noise писал(а):
А ROR вместо LSR ?
...и старший бит от результата сложения магически исчезает... Можно конечно заранее записать звуки в 2 раза тише, чтобы результат заведомо уложился в 8 бит, но меня это не устраивает.
_noise писал(а):
"Индусский код" подумалось.
Ну да, может быть... Учтите, что я с AVR знаком всего пол-года, да и программировать меня никто не учил. Хотя после того, как программа полностью работоспособна, я стараюсь ее оптимизировать.
Re: Как смешать 2 цифровых звука?
Добавлено: Чт дек 13, 2012 09:22:48
Engineer_Keen
Итак... С момента когда, когда я смешал 2 звука и остался этим доволен прошла пара лет, теперь я возвращаюсь к этой задаче. С тех пор алгоритмы оптимизировались, требования возросли, но правильного алгоритма я пока не придумал. Теперь задача смешать 4 звука.
Исходные данные: 4 последовательности семплов по 8 бит@10500 Гц, в любой момент времени может воспроизводится любое количество звуков (1-4), остальные семплы будут =0 (0х80)
Что было проверено:
1) Среднее арифметическое S=(S1+S2+S3+S4)/4 - не катит совсем, все вместе звуки более менее слышатся, но если например играет только один, то его громкость в 4 раза меньше да и разрешение 4 бита вместо 8
2) Среднее арифметическое с учетом не воспроизводящихся звуков S=(S1+...+Sn)/n - гораздо лучше, но при включении/выключении одного из звуков сильно заметно изменение громкости уже воспроизводящихся звуков
3) Сложение с ограничением S=S1+S2+S3+S4, S>255 -> S=255, S<0 -> S=0, если звук один, все отлично, если 2 - появляются искажения, если 4 - искажения просто адовые
Я уверен что простая арифметика (+-*/) тут уже не катит...
Попытки найти в интернете выводят на похожие темы, но в 95% случаев выползают советы сделать именно среднее арифметическое или сложение с ограничением
Чую что можно как-то использовать децибелы (как написано
тут), но не могу сообразить как это выразить в коде

Ща попробую сделать S=84*LOG(S1+S2+S3+S4), интересно что получится... Хотя не, тоже хрень получится
PS:Думаю имеет смысл перетащить тему в МК и ПЛИС.
Re: Как смешать 2 цифровых звука?
Добавлено: Чт дек 13, 2012 11:52:38
BorisSPB
К сожалению, по этой теме у меня нет никакого практического опыта, но всегда было интересно как смешать несколько источников звука в цифровом виде. Вот интересная статья
Mixing digital audio. Автор решает похожую задачу.
Конечно очень логично что чем меньше один сигнал по сравнению с другими, тем меньшее влияние он оказывает на результат, в конечном счете совсем слабые сигналы можно вообще выбрасывать. А если применять среднее арифметическое, то получается что все сигналы равноправны и тихий сигнал может погасить сильный. Это как все равно говорящий шепотом может заглушить орущего

Re: Как смешать 2 цифровых звука?
Добавлено: Чт дек 13, 2012 12:05:49
Engineer_Keen
О, спасибо, очень интересная ссылка, и там все-таки используется довольно простая арифметика! Надо попробовать...
Выглядит довольно просто: Z=S1+S2-S1*S2...Wait, OH-SHI~!!!11 в 24-й тиньке же аппаратного умножения нет! А жаль, придется на мегу переходить...
Re: Как смешать 2 цифровых звука?
Добавлено: Чт дек 13, 2012 16:29:46
Alexeyslav
Можно попробовать суммировать только те звуки, которые отличаются от нуля. если играет один звук - выводить его напрямую, если два - среднее из двух и т.д.
есть еще один способ - подавать на выход максимальное значение из тех что поданы на вход. или сумму из максимального+минимального.
Собственно, в природе звуки именно складываются друг с другом и никаких средних - если звук превышает порог восприятия он просто обрезается.
Как работают аналоговые микшеры - они тоже суммируют амплитуды, и понятно что два звука будут громче чем каждый из них.
Как небольшой обход проблемы можно использовать суммирование в 16-битном виде, а при превышении 8-бит делить результат на 2 пока не влезет в 8 бит.
Re: Как смешать 2 цифровых звука?
Добавлено: Чт дек 13, 2012 17:29:14
ploop
) Сложение с ограничением S=S1+S2+S3+S4, S>255 -> S=255, S<0 -> S=0, если звук один, все отлично, если 2 - появляются искажения, если 4 - искажения просто адовые
Суммировать надо с учётом знака.
Re: Как смешать 2 цифровых звука?
Добавлено: Чт дек 13, 2012 18:22:44
Engineer_Keen
Alexeyslav писал(а):Можно попробовать суммировать только те звуки, которые отличаются от нуля. если играет один звук - выводить его напрямую, если два - среднее из двух и т.д.
Пробовал (см. пункт2).
Alexeyslav писал(а):Как работают аналоговые микшеры - они тоже суммируют амплитуды, и понятно что два звука будут громче чем каждый из них.
Да, громче, но два звука одинаковой амплитуды будут не в 2 раза громче одного, в этом то и загвоздка.
ploop писал(а):Суммировать надо с учётом знака.
Ну конечно с учетом знака, а то вообще фигня получится, это я упрощенно написал

Re: Как смешать 2 цифровых звука?
Добавлено: Пт дек 14, 2012 01:41:58
Alexeyslav
Вообще-то в 2 раза громче и никак не иначе. Это человеческий слух нелинейный, но если взять осциллограф, то увидишь что звуки именно суммируются. Просто в природе порог дальше которого звуки ограничиваются(255 при 8 битах) возникает при гораздо больших величинах чем мы тут пытаемся оперировать. Надо суммировать 4 8-битных звука? используй 10-битный ЦАП... это именно так и работает, никуда не денешься.
Re: Как смешать 2 цифровых звука?
Добавлено: Пт дек 14, 2012 07:35:13
Engineer_Keen
То что сложить это самое простое и логичное это понятно, но в данном случае не подходит, по крайней мере для 8 битной ШИМ (никакого АЦП ставить нельзя - габариты и скорость на пределе). Если только использовать 16битный таймер в режиме 10бит FastPWM, но он зараза уже занят, а на 8-битном сидит куча других функций помимо звука... Эх, придется все капитально переделывать

Re: Как смешать 2 цифровых звука?
Добавлено: Пт дек 14, 2012 07:53:50
ploop
Подождите переделывать, может что-нибудь родим
Например, после суммы, если результат приближается к максимуму, сделать разность с небольшим числом (например результат, делённый на 4, или 8 ), получив эдакий "компрессор".
Re: Как смешать 2 цифровых звука?
Добавлено: Пт дек 14, 2012 07:58:32
Engineer_Keen
ploop писал(а):Подождите переделывать, может что-нибудь родим

Вот на это я и надеюсь

Благо время не поджимает, т.к. девайс делается исключительно в качестве хобби, однако из-за этого и времени на эксперименты не сильно много...
ploop писал(а):Например, после суммы, если результат приближается к максимуму, сделать разность с небольшим числом (например результат, делённый на 4, или

, получив эдакий "компрессор".
Проверю...
Re: Как смешать 2 цифровых звука?
Добавлено: Пт дек 14, 2012 12:44:15
BorisSPB
Микшер должен получить результат какой происходит при смешении звуковых волн в воздухе. Поэтому простого суммирования быть не может. Если бы звуковое давление просто суммировалось, то хор должен был бы производить звук сравнимый с реактивным самолетом, а звук нескольких самолетов вообще бы разрывал в клочья.
Скорее всего надо просто брать наибольший результат из имеющихся, а остальные отбрасывать.
Re: Как смешать 2 цифровых звука?
Добавлено: Пт дек 14, 2012 12:50:04
Engineer_Keen
Не, вот это точно не верно, менее громкий звук тоже должно быть слышно.
Проверял тут разные варианты, пока одна фигня получается, да еще задолбало то, что в WAV файле минус это все что меньше 128, а а контроллере минус - в доп.коде, из-за этого постоянно путаница
