Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сложение цифрового звука
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
zombi
Как правильно сложить несколько цифровых звуков в один?
К примеру имеем два 8-ми битных потока (00H-low 80H-middle FFH-high).
Достаточно ли просто сложить их как два 8-ми битных числа и выдать в 9-ти битный DAC?
XVR
Да
zombi
Цитата(XVR @ Sep 7 2011, 13:51) *
Да

О.К. я так и думал.

Но меня терзают смутные сомнения biggrin.gif
000H+000H= 000H ок
080H+080H=100H ок
0FFH+0FFH= 1FEH младшего бита не хватает wacko.gif
ae_
Цитата(zombi @ Sep 7 2011, 22:59) *
...
0FFH+0FFH= 1FEH младшего бита не хватает :wacko:

При складывании двух 8 битных потоков не должен сам собой получиться результат 9 бит.
Попробуйте среднее арифметическое: (A+B)/2; (A+B+C)/3; (A1+A2+A3+...+AN)/N.
ViKo
Цитата(zombi @ Sep 7 2011, 16:59) *
0FFH+0FFH= 1FEH младшего бита не хватает wacko.gif

Ну и холера с ним! Если, к примеру, перемножать FF и FF, то не хватает уже целой кучи чисел до FFFF.
zombi
Цитата(ae_ @ Sep 7 2011, 17:23) *
Попробуйте среднее арифметическое: (A+cool.gif/2; (A+B+C)/3; (A1+A2+A3+...+AN)/N.

Но при этом каждый из звуков станет тише в два раза wacko.gif
Make_Pic
Цитата(zombi @ Sep 7 2011, 22:23) *
Но при этом каждый из звуков станет тише в два раза wacko.gif

"Вам шашечки или ехать?" ©
После DACа наверно стоит усилитель? Добавьте усиление ровно в два раза!
ae_
2 zombi
Тогда рассматривайте сигнал со знаком, не как 0…255, а как -128…0…+127.
Уже без сложения видно, что относительно нуля +max и -max не совпадают.
Если их складывать, то эта разница будет только увеличиваться:
-128+(-128)=-256
0+0=0
127+127=254
wiki: Дополнительный_код
zombi
Думал, думал но ничего лучше чем :
Цитата(ViKo @ Sep 7 2011, 17:47) *
Ну и холера с ним!

не придумал biggrin.gif laughing.gif


Цитата(ae_ @ Sep 8 2011, 04:07) *
Тогда рассматривайте сигнал со знаком, не как 0…255, а как -128…0…+127.

рассматривай как хочеш а результат все равно одинаковый


Цитата(Make_Pic @ Sep 8 2011, 03:00) *
"Вам шашечки или ехать?" ©
После DACа наверно стоит усилитель? Добавьте усиление ровно в два раза!

Да, но при складывании и сдвиге каждый звук станет меньше на один разряд. А если надо 16 звуков сложить cranky.gif
ViKo
При делении и отбрасывании мы теряем младший разряд, что чуть-чуть скажется на качестве звука.
Можно (и нужно, на мой взгляд) использовать все разряды, получающиеся после сложения и деления. ЦАП, наверное, не 8-битовый?
А поделить на 2 - так это просто завести на ЦАП разряды, сдвинутые на один к младшему, все 9. А хотите громче сделать, заведите все 9 без сдвига. Хотя, конечно, можно и усилением после ЦАП сделать то же самое, или выбором опорного напряжения для ЦАП. В-общем, лучше завести разряды так, чтобы на старшем разряде ЦАП был старший разряд полученной суммы.
Складывая 16 звуков, получим 4 дополнительных старших разряда. Усильте результат в 4 раза, и всех делов.

zombi
Цитата(ViKo @ Sep 8 2011, 10:03) *
Можно (и нужно, на мой взгляд) использовать все разряды, получающиеся после сложения и деления. ЦАП,

biggrin.gif biggrin.gif biggrin.gif именно это и написано в моём 1 сообщении


Цитата(ViKo @ Sep 8 2011, 10:03) *
А хотите громче сделать, заведите все 9 без сдвига.

Если вывести в ЦАП все 9 бит (получившихся в результате сложения двух байт) то громкость каждого звука не изменится.
ae_
Цитата(zombi @ Sep 8 2011, 21:52) *
Если вывести в ЦАП все 9 бит (получившихся в результате сложения двух байт) то громкость каждого звука не изменится.

Берём сигнал L, который изменяется 0…255 и сигнал R, который всегда равен 128 (=0, для наглядности).
Складываем их, получаем выходной сигнал 128…383, который подаём на 9-бит цап (0…511).
Получаем на выходе макс. 50% заполнение 9-бит ШИМ, при этом исходный сигнал L имел размах 100% 8-бит ШИМ.
Как ни складывай, но в суммарном сигнале, если его нормировать, т.е. привести к полной шкале, каждый из складываемых сигналов будет ослаблен.
zombi
"нормировать", "привести" Согласен, все в этом мире относительно biggrin.gif
ae_
Нормировать и привести - без кавычек. Хор всегда громче, чем отдельные голоса в его составе.
Либо один сигнал=100%, тогда сумма двух сигналов=200%
Либо сумма=100%(нормирование), тогда один сигнал=50%
В обоих случаях сигнал лишь половина от суммы.
zombi
Цитата(ae_ @ Sep 8 2011, 18:34) *
Хор всегда громче, чем отдельные голоса в его составе.


Согласен на все 100%.
При этом громкость каждого голоса не зависит от того в хоре он поёт или нет.

Вы в п#4 предлагаете среднее арифметическое на что я Вам отвечаю в п#6.
И затем я не пойму Вы в п#12 возражаете или согласны?
ae_
Цитата(zombi @ Sep 9 2011, 01:26) *
...При этом громкость каждого голоса не зависит от того в хоре он поёт или нет.

L+R -> 9бит ЦАП и (L+R)/2 -> 8бит ЦАП - разницы в громкости не будет никакой, сумма каналов имеет полный размах DAC, каждый из каналов - лишь половину от диапазона DAC. Во втором случае ещё и хуже качество, т.к. есть потери звуковой информации.
Я предложил использовать среднее арифметическое лишь для решения эстетической проблемы: "0FFH+0FFH= 1FEH младшего бита не хватает". Делаем хуже качество, зато цифры ровные. Ведь даже для [0…9]+[0…9]=[0…18] а не [0…19] - некрасиво.
Складываейте, как и собирались в 1 посте, всё правильно, но сигналы ослабляются вдвое, как и при (L+R)/2.
zombi
Цитата(ae_ @ Sep 9 2011, 04:17) *
Складываейте, как и собирались в 1 посте, всё правильно, но сигналы ослабляются вдвое, как и при (L+R)/2.

Да вы правы, но пусть уж лучше ослабляются чем страдает качество.

Спасибо всем за помощь!
Allregia
А немного "в сторону вопрос" - если надо не складываь, а вычитать сигналы, что будет (или что надо делать) с разрядностью?
Например - пропустить сигнал через ФНЧ, затем вычесть его из исходного, т.е.. получив согласованный ФВЧ ?
ae_
Цитата(Allregia @ Sep 9 2011, 18:35) *
А немного "в сторону вопрос" - если надо не складываь, а вычитать сигналы, что будет (или что надо делать) с разрядностью? ...

То же самое. Разность, как и сумма, для двух 8-бит сигналов без потери качества будет 9-бит.
255-0 = 255
0-255 = -255
диапазон значений max-min 255-(-255)=510.
Allregia
Цитата(ae_ @ Sep 9 2011, 14:15) *
То же самое. Разность, как и сумма, для двух 8-бит сигналов без потери качества будет 9-бит.
255-0 = 255
0-255 = -255
диапазон значений max-min 255-(-255)=510.


Т.е. что получается - допустим есть 8-битный сигнал (IN), пропускаю его через ФНЧ и вычитаю из исходного.

получаю два сигнала:
OUT1=LPF(IN)
OUT2=IN-OUT2=IN-LPF(IN)

Чтобы небыло переполнения, OUT2 должен быть 9-битным, но чтобы иметь на выходе опять 8-битный сигнал, я должен его поделить на 2, т.е. пожертвовать младшим битом.

Предположим полный размах (8бит) это 1 вольт., частота среза ФНЧ 1кгц.
Даю на вход синус полного размаха 10кгц. На выходе OUT1 практически ничего, на выходе OUT2 имею 0.5в.
Даю на вход синус полного размаха 100гц. На выходе OUT1 получаю 1в, на выходе OUT2 - почти ничего. Но, чтобы выходы были одинаковые, OUT1 я тоже должен поделить на 2, т.е. истинные выходы будут выглядеть так:
OUT1 = LPF(IN)/2
OUT2 = (IN-LPF(IN))/2

Т.е. я потерял точность (младший бит) и динамический диапазон (т.к. на выходе фактически 7 бит).
Из этого следует, что делать ФВЧ согласованный с ФНЧ (методом вычитания) в цифре нельзя и лучше применить отдельный ФВЧ:
OUT1=HPF(IN)
OUT2=LPF(IN)

Где я ошибся?
ae_
Цитата(Allregia @ Sep 10 2011, 23:12) *
...Из этого следует, что делать ФВЧ согласованный с ФНЧ (методом вычитания) в цифре нельзя и лучше применить отдельный ФВЧ:

Сложение и вычитание - обратимые операции, и в обоих случаях результат может выходить за разрядность исходных данных.
В том, что разность IN-LPF(IN) получается большей разрядности, "цифра" не причём, это и в реальной схеме так:
Нажмите для просмотра прикрепленного файла
схема - RC цепочка, вверху входной сигнал, в середине - напряжение на конденсаторе (ФНЧ), внизу - на резисторе (ФВЧ).
амплитуда на резисторе превышает входной сигнал вдвое. ФВЧ=ВХОД-ФНЧ, всё сходится :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.