0 Members and 2 Guests are viewing this topic.
За энтузиазм уже +1 поставил.Кривая, конечно, далека от нужной. Таких изломов не должно быть. У ВЧ-фильтра она вообще получилась зеркальной.АЧХ каждого фильтра имеет форму, близкую к параболе, симметричную относительно центральной частоты.Чтоб было понятнее, набросал несколько вариантов сочетаний разных положений регуляторов.
Read more...Молодец, Александр! Жаль, плюсик пока не поставить - сутки не прошли. В твоём возрасте мне тоже казалось, что ничего невозможного на свете нет.Скрипт можно ещё немного оптимизировать, если вспомнить про циклы, писанины будет меньше. Для ВЧ-фильтра вместо 8-ми строчек это будет выглядеть так:for N:= 1 to 8 do EQ.Set('BandValue' + IntToStr(N + 10), (((State - 1499)/200 * (1 + sin(pi * N / 8 - pi/2))) + ((M - 1499)/200 * (1 + sin(pi * (8 - N) / 8 - pi/2)))));Но, остаётся одна маленькая неприятность: пользователь может из диалога DSP изменить твою АЧХ любым движком, в своём 2-полосном я это дело заблокировал.Жаль, что в наших скинах аппаратуры это не применить - трёхполосные регуляторы тембра, практически, не встречаются.Как вариант, можно было пойти несколько по другому пути: регуляторы подключить не к скрипту, а к нужным полосам эквалайзера 31, 1к, 16к, а в скрипте считывать эти значения, тогда скрипт окажется независимым от State (возможно, даже, будет один на всё) и блокировать регуляторы будет проще.
И хотел узнать как вы у себя заблокировали в 2-полосном?
Кстати, подобным образом, наверное, можно построить и 5- и 7-полосный эквалайзер - вот это уже будет более актуально и востребовано.А если получится, можно пойти и дальше - сделать эквалайзер с изменяемым числом полос по желанию поьзователя.
Добавил версию с оптимизированными скриптами!
Так, конечно, лаконичнее смотрится. Осталось ещё лишние скобки покуцать.Но, что интересно, я вчера ещё попробовал оптимизировать твой скрипт, правда, дальше ВЧ-фильтра не ушёл, вышло так: for N:= 1 to 8 do EQ.Set('BandValue' + IntToStr(N + 10), ((State - 1499) * (1 - cos(pi * N /8)) + (M - 1499) * (1 - cos(pi * (8 - N) /8))) / 200);Старался, всё-таки, следовать законам тригонометрии, что sin(a - pi/2) = - cos(a), а в твоём примере, вижу, что остался "+". У меня с плюсом не работает, а утебя с минусом. В чём загадка?И ещё, почему в некоторых местах вычитается константа 1499, а вдругих - 1500. Правда эта единичка на результате, практически, не скажется.
Вся наша оптимизация в скриптах сводится, в основном, к сокращению писанины, а скрипт-движок её всё одно сожрёт - ни быстрее, ни медленнее работать в скине не будет, так что, особо с этим заморачиваться не стОит.+1 тебе ещё за труды.
Заметил одну неприятность: если движок 31Гц находился до запуска плеера не в 0, или его принудительно сдвинуть, то при изменении СЧ или ВЧ-регуляторов получается такая "бяка". Надо, видимо, и его в рассчёты включить.
Так и с другими. Они вообще не были изначально включены в расчёт. И в ВЧ случайно попал из вашего примера.Но теперь я везде добавил их.
Этот фильтр (31 Гц), вообще, особняком стоит в эквалайзере. Если заметил, то все остальные идут через полоктавы, а этот - через октаву, относительно 63 Гц, получается, как бы пропущена полоса 43 Гц. А для полноты не хватает ещё и 20 кГц.Во всех эквалайзерах 1 кГц - это центральная частота, у нас же слева от неё 9 полос, а справа - 8 - несимметрия.
Поэтому и пришлось использовать 2 синусоиды. А если добавить ещё 2 слева, то ещё более несимметрично будет при центре 1 кГц.
Имелось в виду эквалайзеры с нечётным числом полос, как и в этом случае - 3. Но в любом случае частоты идут с равным шагом. В реальной аппаратуре часто встречаются эквалайзеры с 20 и 10 полосами - там уже не имеет значения, которая частота будет центральной.Здесь, наверное, можно пойти было на некоторое упрощение: устанавливать движок 31 Гц в то же состояние, что и 63 Гц, т.е. АЧХ на этом участке будет просто прямой, тогда и сохранится симметрия относительно 1 кГц.
А сделать центральными 2 - 700 Гц и 1 кГц?
... Надо собрать значения всех бендов эквалайзера, просуммировать их, а результат подать на скриптовый счётчик. Получится, что он будет срабатывать при любом изменении любой полосы.
Решил таки добить свою идею с коммутаторами:Получился один скрипт, причём средние частоты, оказывается, и рассчитывать не нужно.Регулировать можно как отдельными тремя слайдерами, так и в самом эквалайзере слайдерами 31 Гц, 1 кГц и 16 кГц, остальные блокированы.
У меня тормознуто работают регуляторы особенно средний. Наверное из-за большого количества значений.
Кстати, в 2-полосном варианте можно обойтись и без тригонометрии - просто умножать на коэффициенты, заранее вычисленные для каждой полосы, нагрузка, полагаю, ещё уменьшится.
Я не думаю, что тригонометрические вычисления сильно грузят, скорее это количество вычислений.
Сделал 2-полосный плавный или такой неправильный, надо чтобы центр на месте был как в 3-полосном.
Кстати возникла идея привязать предусиление, тогда уровень громкости при регулировке будет всегда оставаться одинаковым.
А вот над такой задачей для 2-полосного, мне кажется, стоит подумать. Имитировать изменение добротности фильтров, т. е. крутизну синусоид, оставляя АЧХ на средних частотах плоской. Ес-но, раздельно для НЧ и ВЧ. Это уже будет некая заявка на параметрический эквалайзер.
Я смог и такое сделать!
Надо бы подумать над переименованием темы, а то она начиналась с 3-полосного эквалайзера, а теперь разрослась в сторону различных видов.
Молодец, +1. Хоть и несколько грубовато получилось, но логически всё правильно.Единственное, в регуляторах ширины пропускания фильтров два последних значения явно лишние: и на слух это неестественно звучит, и на графике некрасиво смотрится.
Раз вы это опубликовали,значит я могу внедрить такой темброблок в свои поделки?
What is the difference between: темброблок.zip & темброблок_2.3.zip ?
The differences are in the provider's scripts.In 2.3 it is simplified
I want to make 3 knobs to control the 18 band EQ, which one do you suggest I should use?
You can use any.Also note the EQ_3_Band.zip
Кстати, подобным образом, наверное, можно построить и 5- и 7-полосный эквалайзер...
Попробовал сделать десятиполосный: Band1, далее только чётные. Промежуточные - среднеарифметическое соседних.
Это неверный подход, формулы в скрипте будут другими.
Это только в крайнем случае. Кривые фильтров имеют форму синусоиды, а не линейную, частоты фильтров должны быть равномерно расположены, в АИМПе при 18 полосах - через пол-октавы (кроме полосы 31 Гц). 10- полосный эквалайзер имеет смысл делать для диапазона 20-20000, там частоты пойдут через октаву. Глянь, как это реализовано в трёхполосном темброблоке в этой же теме.
procedure Execute(var State: Integer);var EQ: TComponent; N: Integer; begin EQ:= FindObject('prvEqualizer'); for N:= 1 to 8 do EQ.Set('BandValue' + IntToStr(N*2 + 1), (EQ.Get('BandValue' + IntToStr(N*2)) + EQ.Get('BandValue' + IntToStr(N*2 + 2)))/2);end;
Вот что у меня получилось:
Можно же посмотреть, как будет меняться АЧХ при регулировке - в диалоге DSP на родном эквалайзере.
Смотрел, разницы не увидел
Разницы с чем? В твоём примере регулируются только крайние полосы и с изломом АЧХ, что ес-но при таких расчётах, а в оригинальном EQ_3_Band и соседние полосы по синусоидальному закону. АЧХ плавная.
Без тригонометрических выражений в формулах не обойтись...
... А тригонометрию мне без помощи не осилить...