PDA

Просмотр полной версии : Микширование звука



Sinus
13.08.2009, 18:09
Наверное это больше сюда, нежели в музыку.

Начну сразу, без лирических вступлений - занимаясь улучшениями эмуля, постоянно хочу улучшить звук.
И есть тут одна проблемка - называется она постоянно включённый порт бипера. Причём это проблема не только большинства эмулей, но и, например, моего "Байта".

Суть в том, что когда бипер включается, AY начинает играть не так как раньше (обычно тише).

На сегодняшний день я знаю 2 алгоритма микширования (все остальные которые я знаю - это вариации этих двух)

1) Z = (A + B) / 2
2) Z = A + B - A*B

где A - AY, B - Beeper и Z - результат.
В этих формулах все числа дробные от 0 до 1.

проблема первой формулы очевидна - все звуковые устройства звучат тише. при использовании второй - при включённом бипере AY не будет звучать вообще.

Чтоб было понятнее, вот иллюстрация: http://detstwo.com/pub/zemu/audio-mix.html (в эксплорере не будет работать)
Кнопки Simpe / Divide by 2 / Improved - выбирают режимы микширования (Simple - Z=A+B), кнопки 1 / 0.5 / 0 - выбирают уровень сигнала бипера.

Наиболее адекватный сигнал получается при div by 2, но при увеличении кол-ва устройств, звук начинает играть тише и тише.

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

----

А теперь представим, что в комнате стоит 2 колонки, одна исключительно на бипер, вторая - на AY.
Если "включить" бипер, то колонка щёлкнет, пойдёт звуковая волна, но далее эта "включённая" колонка уже не будет влиять на звук.

----

А как делаете вы? А как это реализовывают в железе?

Vitamin
13.08.2009, 19:32
Z=(aX+bY)/(a+b), где a = EXi, b=EYi (т.е. результат интегрирования за определенное время). В зависимости от логики поведения интегратора при появлении всплеска можно реализовать даже АРУ.
А если интегрировать не сигнал, а дельту, то можно даже шумопонижение сделать и избавиться от "постоянки" на выходе.

Sinus
13.08.2009, 20:06
а можно поподробней?
X и Y - это текущая громкость на 2х устройствах?
Xi - это от X0 до Xi ?
E - это что?

Vitamin
13.08.2009, 20:45
Вкратце, на полу-псевдокоде:



byte Buffer[DEVICES_COUNT][BUFFER_SIZE];
unsigned Position = 0;
unsigned Integrator[DEVICES_COUNT];

unsigned mixedLevel = 0;
unsigned divisor = 0;
for (int device = 0; device < DEVICES_COUNT; ++device)
{
byte level = GetDeviceLevel(device);
Integrator[device] -= Buffer[device][Position];
Integrator[device] += (Buffer[device][Position] = level);
Position = ++Position % BUFFER_SIZE;
double val = Integrator[device] / BUFFER_SIZE;
mixedLevel += level * val;
divisor += val;
}
mixedLevel /= divisor;

psb
13.08.2009, 22:03
1) Z = (A + B) / 2
самый правильный метод. ну или более обще, как витамин написал.

Если "включить" бипер, то колонка щёлкнет, пойдёт звуковая волна, но далее эта "включённая" колонка уже не будет влиять на звук.
если сделать по этой формуле, все так и будет. проблема - будет тише играть каждый источник. и у этой проблемы правильного решения нет:):)
добавляя 2ю колонку - ты расширяешь динамический диапазон, а у звуковухи он постоянен. ну и логично же, что 2 колонки будут играть громче одной?
вон по формуле витамина можно биперу назначить меньшую амплитуду, и за счет этого AY будет играть громче.


А если интегрировать не сигнал, а дельту, то можно даже шумопонижение сделать и избавиться от "постоянки" на выходе.
дифференцирование - есть фильтрация низких частот, только и всего. постоянку ты убьёшь, но заодно почикаешь и басы:)) лучше этого все-таки не делать...

Vitamin
13.08.2009, 22:53
дифференцирование - есть фильтрация низких частот, только и всего. постоянку ты убьёшь, но заодно почикаешь и басы) лучше этого все-таки не делать...
Не. Я имею в виду коэффициент передачи канала считать динамически как интеграл за последние несколько квантов. А можно как интеграл от дифференциала:)

Ewgeny7
16.08.2009, 12:44
динамически как интеграл за последние несколько квантов. А можно как интеграл от дифференциала
"Фига се, сходил за хлебушком..." (С) где-то :v2_jawdr::v2_wacko:

psb
16.08.2009, 19:22
тут главное, чтобы коэф. не менялся слишком быстро.

Sinus
17.08.2009, 15:24
я въехал. оказалось что я забыл школьное определение интеграла, и это ввело меня в смущение :)

если брать за коеффициент просто интегрирование уровня звука, то это не спасёт от постоянно включенного бипера.
буду пробовать интегрировать разность уровней за определённый период.

---------- Post added at 14:24 ---------- Previous post was at 14:21 ----------


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

не не не дэвид блейн :) тут другая проблема.
если и бипер звучит и ay звучит, то, конечно, они будут играть громче.
а вот если на бипер повесить высокий уровень постоянно, то он вообще звучать не будет, и при 2х колонках никак не влияет на звук.
а вот при цифровом микшировании, влияет.
но, как я писал выше, выход найден.

psb
17.08.2009, 16:42
не не не дэвид блейн
ха!:)))
вообще-то физику не обманешь:) тебе опять-таки кажется, что ничего не происходит. хотя на самом деле конечно и не происходит из-за того, что колонка не может воспроизводить сколь-угодно низкие звуки (как и создавать постоянное давление на ухо). но если взять идеальную колонку и окружение, то влияние на ухо все-таки будет.
авто-регулирование коэф. усиления - это конечно частичный выход из ситуации, но не супер. компрессия - тоже выход, но тоже совсем не супер для музыки. если работа твоего АРУ будет не заметна на слух - отлично:)

---------- Post added at 18:42 ---------- Previous post was at 18:40 ----------

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

Vitamin
17.08.2009, 16:48
вообще-то физику не обманешь тебе опять-таки кажется, что ничего не происходит. хотя на самом деле конечно и не происходит из-за того, что колонка не может воспроизводить сколь-угодно низкие звуки (как и создавать постоянное давление на ухо). но если взять идеальную колонку и окружение, то влияние на ухо все-таки будет.
Да не, все гораздо проде- конденсатор на входе усилителя отрезает постоянку...

Sinus
17.08.2009, 16:53
Да не, все гораздо проде- конденсатор на входе усилителя отрезает постоянку...

если я правильно помню, то там что-то типа:



sygnal -----||----- output


только это надо в программном виде :)

psb
17.08.2009, 18:33
Да не, все гораздо проде- конденсатор на входе усилителя отрезает постоянку...
возможно:)

Vitamin
17.08.2009, 20:58
только это надо в программном виде
Ога. Ну а поскольку мутить преобразователь с передаточной функцией конденсатора достаточно большой емкости (чтоб звуковые частоты не зарезал) геморрно, можно просто заюзать интегратор для генерации "земли" (выше я предлагал этот интегратор юзать как передаточный коэффициент микшера)- выходной сигнал с источника брать как разницу между входным сигналом и выходом интегратора.

Если надо, могу подкинуть расчет полосового фильтра:)

Barmaley_m
17.08.2009, 22:29
Единственно верный способ смешивания звука по нескольким каналам - это сложение.

Out = In1 + In2 + ... + InN

Где Out - выходной сигнал, In1, In2 ... InN - входные сигналы соответственно.

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

Более реалистичные коэффициенты ослабления выбирают исходя из статистических свойств входных сигналов. Для решаемой задачи я считаю целесообразным подобрать коэффициент экспериментально. Нужно запустить на эмуляторе несколько типичных музыкальных композиций и измерить наблюдаемый пиковый уровень звукового сигнала на выходе микшера. Коэффициент ослабления подобрать так, чтобы этот измеренный уровень использовал весь динамический диапазон, с некоторым запасом (5-10%).

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

Тем более считаю неправильным вариант АРУ, в котором сигналы смешиваются в разных пропорциях. Подобная реализация приведет к тому, что каналы AY будут иметь переменную громкость друг относительно друга, что приведет к значительным искажениям в оригинальном звучании музыки.

Что касается подавления постоянной составляющей на выходе, то эта задача решается очень просто - рекурсивный фильтр высоких частот 1го порядка. Между прочим, он работает совершенно аналогично "конденсатору большой емкости". Формула его такая:

y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1]

Где y[i] - сигнал на выходе фильтра, x[i] - сигнал на его входе.

Вот значения коэффициентов для частоты среза фильтра 15Гц:

b0 = 0.99893257128508961
b1 = -0.99893257128508961
a1 = -0.99786514257017933

Постоянную составляющую этот фильтр подавляет полностью. На частоте 15Гц имеет ослабление -3дБ. На 30Гц - -1дБ, а все, что выше - проходит фильтр практически без изменений.

psb
17.08.2009, 23:53
Вот значения коэффициентов для частоты среза фильтра 15Гц:
осталось добавить частоту дискретизации;)

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

Barmaley_m
18.08.2009, 14:09
осталось добавить частоту дискретизации;)
Да, ты прав, забыл указать! Частота дискретизации - 44100Гц.

Если применять эти коэффициенты с другой частотой дискретизации, то частота среза будет смещена пропорционально отношению новой частоты дискретизации к 44100Гц.

Sinus
18.08.2009, 15:54
Формулы (как получить эти коэффициенты зная частоту среза и частоту дискретизации) в студию :)
Ещё хочу почитать чего-нибудь по этим фильтрам, лучше если есть в инете где-нибудь, но и название книжки пойдёт.

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

Vitamin
18.08.2009, 16:31
Расчитывать готовые фильтры в сторонних прогах- неблагодарное дело. Их нужно считать для всех комбинаций частот и порядков. Лучше уж в рантайме считать при применении параметров. Делается очень быстро.

Barmaley_m
18.08.2009, 22:35
Формулы (как получить эти коэффициенты зная частоту среза и частоту дискретизации) в студию :)

Вот тебе формула, как получить АЧХ и ФЧХ приведенного выше фильтра, зная его коэффициенты:

H(z) = (b0 + b1*z) / (1 + a1*z)

H(z) называется передаточной функцией фильтра. Это функция комплексного переменного z, принимающая также комплексные значения. Чтобы получить АЧХ по мощности, нужно найти квадрат модуля H(z), а чтобы получить ФЧХ - нужно найти аргумент H(z).

Переменная z зависит от интересующей частоты следующим образом:

z = exp(j*w*T),

где j - мнимая единица,
w = 2*pi*f - циклическая частота, которая равна обычной частоте f, умноженной на 2*pi,
T = 1/fs - период дискретизации, который равен обратной величине от частоты дискретизации.

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

Обычно цифровые фильтры синтезируются на основе аналоговых прототипов, которые имеют передаточную функцию вида:

H(s) = (b0 + b1*s) / (1 + a1*s)

Где s = j*w - произведение циклической частоты на мнимую единицу.

Как видно, эта формула намного проще, в ней нет комплексных экспонент, и уравнения на ее основе решаются напрямую (в случае фильтра первого порядка) или рядом точных методов (в случае фильтров высоких порядков).

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

Реализовывать методы синтеза фильтров в каждой программе, использующей фильтры, нецелесообразно. Особенно если менять параметры этих фильтров по ходу работы программы не требуется. Есть пакеты для синтеза фильтров, например к Matlab идет Signal Processing Toolbox, которая содержит мощное приложение fdatool, которым я, собственно, и рассчитал приведенный в предыдущем посте фильтр.

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


Ещё хочу почитать чего-нибудь по этим фильтрам, лучше если есть в инете где-нибудь, но и название книжки пойдёт.
Рекомендую книгу на английском языке: D. Schlichthaerle "Digital filters: basics and design". Очень доходчиво написано, по сравнению с другими источниками.

psb
19.08.2009, 13:12
Расчитывать готовые фильтры в сторонних прогах- неблагодарное дело.
ну уж конечно:) лучше самому написать кусок матлаба;))) если уметь пользоваться последним, то синтез и проверка любых фильтров станет простым делом.

Vitamin
19.08.2009, 13:35
лучше самому написать кусок матлаба
Расчет FIR-фильтра на С++ занимает сотню строк


если уметь пользоваться последним, то синтез и проверка любых фильтров станет простым делом.
Да кто спорит, что матлаб это круто? Вопрос в том, что надо будет генерить фильтры под все возможные сочетания частот и порядков. Остается решить, что будет менее накладным)

Barmaley_m
19.08.2009, 14:08
Расчет FIR-фильтра на С++ занимает сотню строк
Вот именно в этом случае самый большой риск того, что алгоритм не сойдется, либо будет работать слишком долго, либо потребует слишком много памяти, либо, по результатам пробных расчетов фильтра, человек захочет изменить начальные параметры.

Я имею в виду алгоритм Ремеза (Parks-McClellan), который выдает на выходе оптимальные фильтры. Во многих программах применяются более простые методы расчета, такие как окно Кайзера. Но при использовании таких методов фильтр получается на 20-30% длиннее, что пропорционально увеличивает нагрузку на процессор при обработке фильтром данных.

Вопрос в том, что надо будет генерить фильтры под все возможные сочетания частот и порядков.
Если речь идет об эмуляторе AY, то достаточно иметь одну-две частоты дискретизации: 44100Гц и 48000Гц. Другие частоты использовать нет никакого смысла, потому что это приведет только к ухудшению качества звука.

То же самое относится к "сочетанию порядков". Во многих случаях фильтр решает вполне определенную задачу, такую, как подавление постоянной составляющей. Его порядок известен заранее - первый порядок. Аналогично и частота среза. Нет смысла ее менять по ходу работы или давать пользователю возможность настройки. Потому что любая такая настройка приведет лишь к ухудшению качества звука.

Vitamin
19.08.2009, 14:35
Вот именно в этом случае самый большой риск того, что алгоритм не сойдется, либо будет работать слишком долго, либо потребует слишком много памяти, либо, по результатам пробных расчетов фильтра, человек захочет изменить начальные параметры.

Я имею в виду алгоритм Ремеза (Parks-McClellan), который выдает на выходе оптимальные фильтры. Во многих программах применяются более простые методы расчета, такие как окно Кайзера. Но при использовании таких методов фильтр получается на 20-30% длиннее, что пропорционально увеличивает нагрузку на процессор при обработке фильтром данных.
Заюзал КИХ с окном Кайзера. Именно при его расчете возможно несхождение (сужу по алгоритму). Насколько я понял, окно - это просто постобработка коэффициентов. Без нее результат тоже получается достаточно приемлимым.


То же самое относится к "сочетанию порядков". Во многих случаях фильтр решает вполне определенную задачу, такую, как подавление постоянной составляющей.
А еще- срезание верхушки спектра.


Если речь идет об эмуляторе AY, то достаточно иметь одну-две частоты дискретизации: 44100Гц и 48000Гц.
По-хорошему надо поддерживать те частоты, которые поддерживаются оборудованием (от 8 до 192кГц). Плюс владельцы крутых компов (и наушников) могут выставить порядок фильтра побольше дабы отрезать все ненужное.
Сужу по настройкам того же эмулятора АУ- там это все регулируется.

Sinus
19.08.2009, 14:43
D. Schlichthaerle "Digital filters: basics and design"
:eek: жесть, она $70 стоит.

---------- Post added at 13:43 ---------- Previous post was at 13:39 ----------


По-хорошему надо поддерживать те частоты, которые поддерживаются оборудованием (от 8 до 192кГц).
для AY, бипера и ковокса бессмысленно делать частоты превышающие рабочую частоту микросхемы, ибо будет идти ресэмплинг звука.
это как увеличивать текстуру 64x64 до 1024x1024 с битричетырепятилинейнокуб ической фильтрацией - вроде и качество должно стать лучше, а всё равно мыло получается :)

Vitamin
19.08.2009, 14:56
для AY, бипера и ковокса бессмысленно делать частоты превышающие рабочую частоту микросхемы, ибо будет идти ресэмплинг звука.
Для AY частота генерируемых сигналов равна несущей, деленной на 8. Что на практике получается 1750/8 ~ 218кГц. Для ковокса- сэмплы 8кГц максимум идут. Давайте урежем весь звук до 8кГц- один хрен выше не передается! А для бипера максимальные частоты тоже лежат в диапазоне сотен кГц (спросите GriV'a ;) )

psb
19.08.2009, 16:00
ну-ну-ну, разогнались;)
особенно про ковокс, ага;) на бипере сотни кГц, а ковокс такой тормоз... ;)))

Vitamin
19.08.2009, 16:31
особенно про ковокс, ага на бипере сотни кГц, а ковокс такой тормоз... ))
Покажи мне программы или наработки, использующие ковокс на полную. Если найдешь- я тем более буду прав по поводу верхней границы частоты:)

psb
19.08.2009, 17:13
в каком-то ZX-Format, где была схема про ковокс, была и прога для теста, которая играла на частоте около 22кГц. это раз. а два - это куча разного софта, которому ничего не мешает играть одиночные сэмплы хоть на 44 кгц. а три - это мой нерелиженный плеер аудио с винта, играющий 8бит 44100кГц стерео.

Vitamin
19.08.2009, 17:37
в каком-то ZX-Format, где была схема про ковокс, была и прога для теста, которая играла на частоте около 22кГц. это раз. а два - это куча разного софта, которому ничего не мешает играть одиночные сэмплы хоть на 44 кгц. а три - это мой нерелиженный плеер аудио с винта, играющий 8бит 44100кГц стерео.
Ну так тем более- не надо ограничивать воспроизведение звука на пц частотам в 44.1 и 48кГц, о чем я и говорил выше.

Barmaley_m
19.08.2009, 17:58
Заюзал КИХ с окном Кайзера. Именно при его расчете возможно несхождение (сужу по алгоритму).
Нет, окно Кайзера как раз всегда сходится. Во всяком случае, с его помощью гораздо легче создать фильтр высокого порядка (~10000) по сравнению с методом Ремеза.

Но повторяю: фильтр, сгенерированный методом окна Кайзера будет на 20-30% длиннее, чем фильтр с такими же характеристиками, сгенерированный методом Ремеза. А это - лишняя нагрузка на проц при обработке сигнала таким фильтром.

Ситуации бывают разные, но легко представить такую, когда 20% разница в скорости является более важной, чем возможность генерировать фильтр "на лету".

Насколько я понял, окно - это просто постобработка коэффициентов. Без нее результат тоже получается достаточно приемлимым.
Гы-гы, это смотря для каких целей ;) "без окна" - это значит "с прямоугольным окном" - такой фильтр будет иметь в полосе подавления лепестки с амплитудой до -22дБ, да и на границе полосы пропускания тоже будут большие выбросы. "Явление Гиббса" называется. Именно для контроля этих эффектов используются окна.


По-хорошему надо поддерживать те частоты, которые поддерживаются оборудованием (от 8 до 192кГц).
Во-первых, объясни, зачем это нужно? Зачем кому-то может понадобиться генерировать звук на частотах дискретизации, отличных от 44100 или 48000?

Во-вторых, многие звуковые карты поддерживают только одну из вышеназванных частот. Например, Creative SB128 поддерживает только 44100. Можно из винды запустить какой-нибудь сигнал и на частоте 48000, но при этом он будет звучать в сильно искаженном виде. Можешь проверить свою звуковую карточку, сгенерив в звуковом редакторе и послушав частоты в районе 8-15кГц.

С другой стороны, у меня на материнке ASUS P4B533 была встроенная звуковуха, которая наоборот, давала чистый звук на частоте 48000Гц, а на 44100Гц наоборот, искаженный.

Также высокий уровень искажений наблюдается на всех звуковых картах потребительского уровня при воспроизведении звука на частотах дискретизации 22050, 11025, 8000Гц. Плохо подавляются зеркальные компоненты.

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

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

Сужу по настройкам того же эмулятора АУ- там это все регулируется.
Кое-что там регулируется, но какой в этом смысл? Часто ли ты регулируешь эти настройки? И главное - чего ты пытаешься добиться, изменяя их? Качество улучшить?

psb
19.08.2009, 18:01
проблема в том, что так и так придется резать, если делать все правильно. а у поголовного большинства как раз 44100. реже - 48000. больше - еще реже. так что порезав для 44100 не сильно потеряешь.
ну и так или иначе, но частоты дискретизации-таки фиксированные. ничто не мешает сделать пусть и 10 наборов коэффициентов.

Barmaley_m
19.08.2009, 18:09
:eek: жесть, она $70 стоит.
Да, дороговато, но она того стоит, поверь. Я сначала ее в библиотеке читал, несколько месяцев, а потом понял, что надо ее купить. Где-то года полтора читал, пока въехал.

Кроме того, в Google Books ее можно онлайн почитать (правда, не полностью).

Зарубежная научная литература вообще дорого стоит, $70 - это еще очень божеская цена. Я все зарился на еще одну интересную книжку N.J. Fliege - "Multirate digital signal processing" (тоже в библиотеке ее читал), но она вообще стоит под $200, так что пока не решусь никак :)

Vitamin
19.08.2009, 18:21
Нет, окно Кайзера как раз всегда сходится. Во всяком случае, с его помощью гораздо легче создать фильтр высокого порядка (~10000) по сравнению с методом Ремеза.
Ну мне такие порядки не нужны. Максимум- 100


Но повторяю: фильтр, сгенерированный методом окна Кайзера будет на 20-30% длиннее, чем фильтр с такими же характеристиками, сгенерированный методом Ремеза. А это - лишняя нагрузка на проц при обработке сигнала таким фильтром.

Ситуации бывают разные, но легко представить такую, когда 20% разница в скорости является более важной, чем возможность генерировать фильтр "на лету".
А тип фильтра (КИХ/БИХ) влияет на набор применяемых методов и трудоемкость расчета/выполнения?


"Явление Гиббса" называется
Слышал сию фамилию при описании алгоритма JPEG:)


Во-первых, объясни, зачем это нужно? Зачем кому-то может понадобиться генерировать звук на частотах дискретизации, отличных от 44100 или 48000?
Предусмотреть весь спектр оборудования у конечного пользователя (а также его предпочтения и проч) невозможно.
Например, при воспроизведении звука через встроенные в ноут хреноватые колонки достаточно 22кГц, тогда как для нормальных наушников 48 нормально.


С другой стороны, у меня на материнке ASUS P4B533 была встроенная звуковуха, которая наоборот, давала чистый звук на частоте 48000Гц, а на 44100Гц наоборот, искаженный.
А это разве не зависит от того, что частота 44100 вообще не кратна степеням двойки ни разу? Плюс еще зависит от внутренней частоты звуковухи...


Что ты конкретно имеешь в виду? Что ненужное нужно резать, почему только на крутых наушниках, и зачем для этого фильтры высокого порядка?
Сравнительно высокого. В моем случае КИХ с порядком <10 практически не оказывает влияния на звук, тогда как >30 уже ощутимо меняет.

Barmaley_m
19.08.2009, 19:17
Ну мне такие порядки не нужны. Максимум- 100
Ну, с такими порядками фактор сходимости и ресурсоемкости при расчете фильтра перестает играть существенную роль, хотя остаются факторы баланса параметров и компромиссов при постановке задачи расчета фильтра. В простых случаях эти параметры можно рассчитывать исходя из каких-то критериев, но в сложных случаях (а также с целью избежать программирования еще и этих критериев) заранее рассчитанный фильтр остается предпочтительным вариантом.

Все зависит от конкретной задачи. Я в принципе не отрицал преимущества расчета фильтров "на лету", просто хотел показать, что это не всегда предпочтительный вариант.

А тип фильтра (КИХ/БИХ) влияет на набор применяемых методов и трудоемкость расчета/выполнения?
Определяющим образом!

У КИХ (FIR) и БИХ (IIR) фильтров разные области применения. Например, если подавлять с помощью КИХ-фильтра постоянную составляющую, то для этого потребуется фильтр высокого порядка - сотен этак пять, а может и еще больше. В то время как с этим справляется рассмотренный нами БИХ-фильтр 1го порядка.

С другой стороны, ресэмплинг - это область применения практически исключительно КИХ-фильтров.

Слышал сию фамилию при описании алгоритма JPEG:)
Все эти вещи в наши дни легко ищутся и находятся в Википедии.

Предусмотреть весь спектр оборудования у конечного пользователя (а также его предпочтения и проч) невозможно.
Для этого существуют драйвера и операционная система.

Известно, что на частоте дискретизации 44100 или 48000Гц можно синтезировать звук с ЦД-качеством. Следовательно, более высокие частоты дискретизации использовать нет смысла. Более низкие частоты имело бы смысл использовать, если бы комп был очень медленным - но сегодняшние компы с обработкой звука справляются обычно без особых затруднений на лету. Поэтому понижать fs тоже нет смысла. С целью поддержки воспроизведения CD (44100) и DVD (48000) все современные звуковые карты поддерживают хотя бы одну из указанных выше частот без существенных искажений.

Любое отклонение от указанных двух частот чревато существенным ухудшением качества звука, а пользы не может дать практически никакой.

Например, при воспроизведении звука через встроенные в ноут хреноватые колонки достаточно 22кГц, тогда как для нормальных наушников 48 нормально.
44.1 или 48 - это вопрос аппаратной поддержки (определяется экспериментально). Разности в качестве звука между ними нет никакой. Использовать 22.5кГц имело бы смысл только в случае тормознутого компа, а так ничто не мешает играть и на ноуте звук на 44.1.


А это разве не зависит от того, что частота 44100 вообще не кратна степеням двойки ни разу?
Эта частота является стандартом для системы Compact Disc. Ее выбор был обусловлен рядом факторов (читать в Википедии), но для нас это не имеет большого значения. Есть стандартная частота, и если нет серьезных причин отклоняться от нее, то ее надо использовать.

48кГц - это тоже произвольно выбранная стандартная частота, сначала применявшаяся на цифровых магнитных лентах (DAT), а потом и на DVD. Критерии ее выбора тоже для нас не важны, а важно лишь то, что она является стандартом.

Плюс еще зависит от внутренней частоты звуковухи...
Да, тут ты прав. Звуковухи не всегда точно реализуют эту частоту. Например, Creative SB16 / AWE32 / AWE64 - одни из первых звуковух, на которых на PC впервые появилось CD-качество звука - реализовывали частоту 44100 с существенным отклонением. Но это никому обычно не мешает. Программа просит 44100 - звуковуха дает какую-то другую неизвестную частоту, близкую к заданной. Программа всегда должна быть к этому готова.


Сравнительно высокого. В моем случае КИХ с порядком <10 практически не оказывает влияния на звук, тогда как >30 уже ощутимо меняет.
Ты так и не ответил, с какой целью и что режется у тебя в звуке.

psb
19.08.2009, 20:29
А это разве не зависит от того, что частота 44100 вообще не кратна степеням двойки ни разу?
но зато... 5^2 * 6^2 * 7^2 !!!

Vitamin
19.08.2009, 20:36
Все зависит от конкретной задачи. Я в принципе не отрицал преимущества расчета фильтров "на лету", просто хотел показать, что это не всегда предпочтительный вариант.
Ну в моем случае было несколько факторов:
1) полная независимость от аппаратуры и поддерживаемых ею режимов
2) банальное отсутствие матлаба (а также знаний его использования), но наличие примера расчета в коде)


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


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

GriV
03.10.2009, 11:02
А для бипера максимальные частоты тоже лежат в диапазоне сотен кГц (спросите GriV'a )
Каюсь... 260кгц :-[


Эта частота является стандартом для системы Compact Disc
Сейчас выбор этой частоты сильно критикуют, и в общем не факт что у end-user железка которая на эти (44100 и 48000) частоты зациклена. У каждого ЦАПа вообще своя выходная характеристика, и бывает что частота 96кгц более оптимальна, а кроме того есть ещё драйвера (кривость которых тоже обсуждаема), которые умудряются передискретизировать сигнал, даваемый на "родной" частоте.

Маленько оффтопа: теорема Котельникова работает для дискретных по времени и аналоговых по амлитуде сигналов (типа магнитной ленты аналоговых аудио- и видеокассет), матаппарата для рассчёта перехода от аналогового к полностью цифровому сигналу и рассчёта степени искажений конечного цифрового сигнала вроде как и нет (или я не знаю). Банальный перенос по Т. Котельникова "ухо слышит на 22кгц - надо записывать аудио-ЦД на 44кгц и нет потерь" тут не работает, фаны аудио до сих пор слушают винилы, покупают DVD-Audio и SACD.

Barmaley_m
05.10.2009, 05:30
Сейчас выбор этой частоты сильно критикуют,
О критике я тоже слышал, только забыл, что именно не нравится в этом выборе критикующим. Может быть ты знаешь и мог бы напомнить?

И все же эта частота являются стандартом, и разрабочик любой звуковой железки с высокой вероятностью предусмотрит реализацию именно ее.

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

Вот такие вот рассуждения.

и в общем не факт что у end-user железка которая на эти (44100 и 48000) частоты зациклена.
А на что же она тогда должна быть "зациклена", учитывая, что вся практически музыка, будь то мп3 или флак/апе, идет на 44100, а все практически фильмы идут на 48000?

Гарантий, конечно, никаких нет, но см. выше про аргументацию разработчика.

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

Маленько оффтопа: теорема Котельникова работает для дискретных по времени и аналоговых по амлитуде сигналов (типа магнитной ленты аналоговых аудио- и видеокассет), матаппарата для рассчёта перехода от аналогового к полностью цифровому сигналу и рассчёта степени искажений конечного цифрового сигнала вроде как и нет (или я не знаю).
Ты имеешь в виду то, что теорема Котельникова не учитывает квантование сигнала по амплитуде?

В этом нет никаких проблем. Искажения, вызванные квантованием, обычно рассматриваются как "шум квантования". И спектром этого шума можно управлять - называется это Noise Shaping. Ценой увеличения общей энергии шума можно сконцентрировать этот шум в области высоких частот, там, где ухо его слышит хуже. Тем самым достигается увеличение динамического диапазона в области средних частот. Современные записи на компакт-дисках, как правило, так и подготавливаются. Технологии вроде Super Bit Mapping - это все из той области.

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

Банальный перенос по Т. Котельникова "ухо слышит на 22кгц - надо записывать аудио-ЦД на 44кгц и нет потерь" тут не работает, фаны аудио до сих пор слушают винилы, покупают DVD-Audio и SACD.
Частотные границы чувствительности человеческого уха - это не т. Котельникова, а скорее физиология слуха, но не в этом суть. Про фанов и их повадки я слышал, только вот аргументации убедительной от них не поступало. Если ухо не слышит выше 20кГц - то 44кГц для оцифровки должно быть достаточно, и теория это гарантирует (при условии грамотной технической реализации). Если для оцифровки 44кГц объективно недостаточно - то значит ухо слышит выше 20кГЦ, но это противоречит данным из биологии.

И вообще даже 20кГц слышат далеко не все. Я вот в юности слышал 20кГц, а сейчас едва-едва 18200 одним ухом, а вторым - и того меньше. И среди людей, которые участвовали в моих экспериментах, это один из лучших результатов. Остальные, кого измерял, и того не слышали (всего было около 8-10 человек). Обычно на 15-17кГц оканчивалась их способность слышать хоть какой-то звук, излучаемый динамиком.

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

Sayman
05.10.2009, 08:00
И среди людей, которые участвовали в моих экспериментах
а как проводился эксперимент? была написана или уже есть какая то прга, которая посылает в динакими сигналы от стольки то частот до стольки то и на вопрос "слышиш звук" да - едим дальше, нет, значит вот он предел, или как?
если прога, скинь её мне или запость тут пожалуста, мне бы тоже интересно узнать свой нынешний порог.

psb
05.10.2009, 11:59
такая прога не всегда сможет работать корректно, ибо звуковухи у всех разные. плохая карта может порождать левые гармоники. а вот обычный аналоговый генератор подойдет:) но я такие эксперименты ставил и на спектруме, на AY, хоть там и не синус.

GriV
05.10.2009, 18:37
О критике я тоже слышал, только забыл, что именно не нравится в этом выборе критикующим. Может быть ты знаешь и мог бы напомнить?
Ну тут всё вместе.
Не стоит забывать что речь идёт про одну частоту, а группа частот около некоторой базовой может создавать давление на ухо эквивалентное слышимой частоте. Я слышу 20кгц, моя железка и мои наушники позволяют их играть, но вот мой друг не слышит. Хотя честно признаюсь, тут Mike в соседней ветке выкладывал образцы 24бит и 16бит я их не различил на слух. Возможно опять же не хватает оборудования.


А на что же она тогда должна быть "зациклена", учитывая, что вся практически музыка, будь то мп3 или флак/апе, идет на 44100, а все практически фильмы идут на 48000?
Трудно не согласиться. Но отрицать наличие более продвинутых девайсов тоже нельзя. Чисто меломанские звукахи (де факто ЦАПы на плате) вообще не поддерживают смешение сигналов и их ЦАП работает только на частоте выводимого звука. Так что - да, на каждой частоте свой КНИ - но юзверь остаётся свободен в выборе.


Ты имеешь в виду то, что теорема Котельникова не учитывает квантование сигнала по амплитуде?

В этом нет никаких проблем. Искажения, вызванные квантованием, обычно рассматриваются как "шум квантования". И спектром этого шума можно управлять - называется это Noise Shaping. Ценой увеличения общей энергии шума можно сконцентрировать этот шум в области высоких частот, там, где ухо его слышит хуже. Тем самым достигается увеличение динамического диапазона в области средних частот. Современные записи на компакт-дисках, как правило, так и подготавливаются. Технологии вроде Super Bit Mapping - это все из той области.
Да именно шумы квантования имею в виду. А та методика которую ты назвал работает именно для квантованного по времени_И_амплитуде сигнала или только по амплитуде?


Про фанов и их повадки я слышал, только вот аргументации убедительной от них не поступало. Если ухо не слышит выше 20кГц - то 44кГц для оцифровки должно быть достаточно, и теория это гарантирует
Да я вообще был упёртый фанат цифрового звука и искренне полагал до определённых пор, что именно 44100/16 является исчерпывающим форматом.
Но потом мне принесли диск другой частоты/разрядности (DVD-audio), и я понял что звук действительно другой. Я это услышал.
Я с тобой согласен насчёт убедительной аргументации. У меня знакомый фанат один есть хорошего звука, так вот он упёрся на такой мысли: что аппаратный CD-Audio проигрыватель играет звук, лучше чем если этот же CD, сграбить на жёсткий диск. Говорит на слух различит разницу %) это наверное общая проблема фанатов :-) Или тут ещё одну статью читал - что человеки-эксперты были приглашены куда то там, им показали типа крутой ресивер они так восхищались звуком... эксперты... а оказалось что под крутой ресивер был замаскирован купленый за 100уёв транзисторник... Вот так то.

---------- Post added at 18:37 ---------- Previous post was at 18:36 ----------


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

Barmaley_m
05.10.2009, 23:47
а как проводился эксперимент?
Был генератор Hameg Low distortion generator HM8037, усилитель Yamaha AX-396 и ВЧ-динамик Peerless 811815 (WA10/8).

На генераторе ставилась сначала относительно низкая частота вроде 15кГц, чтобы человек знал примерно, к чему надо прислушиваться. Мог вертеть в руках динамик, вращать головой как хотел. Частота постепенно повышалась, я регулировал, а испытуемый сообщал об ощущениях. Ближе к границе его слышимости повышали уровень сигнала, а на самом пороге щелкали кнопочкой аттенюатора 20дБ. Без аттенюатора человек едва-едва слышал звук, а с аттенюатором - уже нет. Проводились также серии испытаний, когда после нескольких щелчков кнопкой человек не знал, есть ли звук, и он сообщал мне свое мнение, а я проверял. В районе порога слышимости частота регулировалась плавно, с шагом где-то в сотню герц. Мы как бы приближались к тому, чтобы найти точный порог.

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

Кстати говоря, способность слышать звук сильно зависела от положения динамика относительно уха. В районе порога слышимости, чтобы услышать звук, динамик нужно было ориентировать строго определенным образом. Также, возможно, на результаты влияли стенки помещения (они не были звукопоглощающими). Но все же (по разным косвенным признакам) я считаю, что допущенные погрешности были незначительными с качественной точки зрения, то есть примерно с точностью +-200Гц мы пороги у людей определяли.

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

Насчет программы синтеза синусов - согласен с psb, ее работа будет зависеть от звуковой карточки. Некоторые звуковые карточки уже начиная с 10кГц дают существенные искажения, либо они дают такие искажения в случае, если работают на "неродной" частоте. Короче, я предупредил. Желательно хотя бы осциллографом проконтролировать качество звука на выходе. Вот программа:

http://www.geocities.com/barmaley_m/singenerator.zip

Barmaley_m
06.10.2009, 06:45
Но отрицать наличие более продвинутых девайсов тоже нельзя. Чисто меломанские звукахи (де факто ЦАПы на плате) вообще не поддерживают смешение сигналов и их ЦАП работает только на частоте выводимого звука.
Ну, тогда я тоже не вижу проблем в том, чтобы в программе ограничиться реализацией 44100 или 48000Гц. Если карточка может воспроизводить на любой частоте с хорошим качеством - то тем более она будет хорошо работать на стандартной частоте.

Да именно шумы квантования имею в виду. А та методика которую ты назвал работает именно для квантованного по времени_И_амплитуде сигнала или только по амплитуде?
Она в первую очередь работает для квантованного в обоих смыслах сигнала (т.е. полностью цифрового), но наверное ее можно обобщить и на непрерывный во времени сигнал.

Но потом мне принесли диск другой частоты/разрядности (DVD-audio), и я понял что звук действительно другой. Я это услышал.
А ты с чем сравнивал? Правильно было бы сравнивать с той же записью, сграбленной и качественно преобразованной в формат CD-Audio.

так вот он упёрся на такой мысли: что аппаратный CD-Audio проигрыватель играет звук, лучше чем если этот же CD, сграбить на жёсткий диск. Говорит на слух различит разницу %)
Очень возможно в случае, если у него звуковая карточка дает качество сигнала на выходе хуже, чем ЦД-плеер. Кроме того, в виндовс есть гадский драйвер kmixer.sys, который тоже иногда без спроса вмешивается в звук.

Слушать музыку с компьютера плохо еще и тем, что компьютер шумит вентилятором и винчестером. Давняя проблема, которой нет решения. А слушать музыку с выключенным компьютером... Как-то нет времени в последнее время :)

Слух, как и зрение, стареет если им не пользоваться или пользоваться не так.
Тут уж кому как повезет. Бетховен вон аккуратно пользовался, а печальный исход нам всем известен.

TSL
28.02.2015, 00:58
Единственно верный способ смешивания звука по нескольким каналам - это сложение.
Совершенно верно.

Проверил на эту тему OpenMPT (http://openmpt.org/). В нем громкость отдельного канала не зависит от количества каналов в модуле.
Тестовый модуль, сэмпл - синус 100Гц длиной 4 периода:
http://i.snag.gy/9b1SB.jpg
Результат микширования:
http://i.snag.gy/gS8FG.jpg
Видно, что результат микширования всех каналов ослаблен примерно на 12дБ, но при "удачном" стечении обстоятельств происходит клиппирование. Настойка понижения громкости называется Sample vol. и дефолтно равна 48 из 255.

Взял годный 32-канальный модуль и отрендерил в вавку. На общем плане видно, что клиппирование еще как:
http://i.snag.gy/9VHoy.jpg
Если увеличить, то все не так уж плохо:
http://i.snag.gy/Bp8jK.jpg
http://i.snag.gy/p4Xkc.jpg
http://i.snag.gy/vSj0H.jpg