реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Сложение цифрового звука, на хмеге
zombi
сообщение Sep 7 2011, 09:17
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Как правильно сложить несколько цифровых звуков в один?
К примеру имеем два 8-ми битных потока (00H-low 80H-middle FFH-high).
Достаточно ли просто сложить их как два 8-ми битных числа и выдать в 9-ти битный DAC?
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 7 2011, 10:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Да
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 7 2011, 13:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(XVR @ Sep 7 2011, 13:51) *
Да

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

Но меня терзают смутные сомнения biggrin.gif
000H+000H= 000H ок
080H+080H=100H ок
0FFH+0FFH= 1FEH младшего бита не хватает wacko.gif
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 7 2011, 14:23
Сообщение #4


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(zombi @ Sep 7 2011, 22:59) *
...
0FFH+0FFH= 1FEH младшего бита не хватает :wacko:

При складывании двух 8 битных потоков не должен сам собой получиться результат 9 бит.
Попробуйте среднее арифметическое: (A+B)/2; (A+B+C)/3; (A1+A2+A3+...+AN)/N.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 7 2011, 14:47
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zombi @ Sep 7 2011, 16:59) *
0FFH+0FFH= 1FEH младшего бита не хватает wacko.gif

Ну и холера с ним! Если, к примеру, перемножать FF и FF, то не хватает уже целой кучи чисел до FFFF.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 7 2011, 19:23
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(ae_ @ Sep 7 2011, 17:23) *
Попробуйте среднее арифметическое: (A+cool.gif/2; (A+B+C)/3; (A1+A2+A3+...+AN)/N.

Но при этом каждый из звуков станет тише в два раза wacko.gif
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Sep 8 2011, 00:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



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

"Вам шашечки или ехать?" ©
После DACа наверно стоит усилитель? Добавьте усиление ровно в два раза!
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 8 2011, 01:07
Сообщение #8


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



2 zombi
Тогда рассматривайте сигнал со знаком, не как 0…255, а как -128…0…+127.
Уже без сложения видно, что относительно нуля +max и -max не совпадают.
Если их складывать, то эта разница будет только увеличиваться:
-128+(-128)=-256
0+0=0
127+127=254
wiki: Дополнительный_код
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 8 2011, 06:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Думал, думал но ничего лучше чем :
Цитата(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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 8 2011, 07:03
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 8 2011, 12:52
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



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

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


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

Если вывести в ЦАП все 9 бит (получившихся в результате сложения двух байт) то громкость каждого звука не изменится.
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 8 2011, 13:47
Сообщение #12


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



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

Берём сигнал L, который изменяется 0…255 и сигнал R, который всегда равен 128 (=0, для наглядности).
Складываем их, получаем выходной сигнал 128…383, который подаём на 9-бит цап (0…511).
Получаем на выходе макс. 50% заполнение 9-бит ШИМ, при этом исходный сигнал L имел размах 100% 8-бит ШИМ.
Как ни складывай, но в суммарном сигнале, если его нормировать, т.е. привести к полной шкале, каждый из складываемых сигналов будет ослаблен.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 8 2011, 14:40
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



"нормировать", "привести" Согласен, все в этом мире относительно biggrin.gif
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 8 2011, 15:34
Сообщение #14


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Нормировать и привести - без кавычек. Хор всегда громче, чем отдельные голоса в его составе.
Либо один сигнал=100%, тогда сумма двух сигналов=200%
Либо сумма=100%(нормирование), тогда один сигнал=50%
В обоих случаях сигнал лишь половина от суммы.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 8 2011, 16:26
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(ae_ @ Sep 8 2011, 18:34) *
Хор всегда громче, чем отдельные голоса в его составе.


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

Вы в п#4 предлагаете среднее арифметическое на что я Вам отвечаю в п#6.
И затем я не пойму Вы в п#12 возражаете или согласны?
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 9 2011, 01:17
Сообщение #16


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(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.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 9 2011, 05:49
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(ae_ @ Sep 9 2011, 04:17) *
Складываейте, как и собирались в 1 посте, всё правильно, но сигналы ослабляются вдвое, как и при (L+R)/2.

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

Спасибо всем за помощь!
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 9 2011, 09:35
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



А немного "в сторону вопрос" - если надо не складываь, а вычитать сигналы, что будет (или что надо делать) с разрядностью?
Например - пропустить сигнал через ФНЧ, затем вычесть его из исходного, т.е.. получив согласованный ФВЧ ?
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 9 2011, 12:15
Сообщение #19


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



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

То же самое. Разность, как и сумма, для двух 8-бит сигналов без потери качества будет 9-бит.
255-0 = 255
0-255 = -255
диапазон значений max-min 255-(-255)=510.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 10 2011, 14:12
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(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)

Где я ошибся?
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 11 2011, 03:08
Сообщение #21


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



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

Сложение и вычитание - обратимые операции, и в обоих случаях результат может выходить за разрядность исходных данных.
В том, что разность IN-LPF(IN) получается большей разрядности, "цифра" не причём, это и в реальной схеме так:
Прикрепленное изображение

схема - RC цепочка, вверху входной сигнал, в середине - напряжение на конденсаторе (ФНЧ), внизу - на резисторе (ФВЧ).
амплитуда на резисторе превышает входной сигнал вдвое. ФВЧ=ВХОД-ФНЧ, всё сходится :)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01579 секунд с 7
ELECTRONIX ©2004-2016