За энтузиазм уже +1 поставил.Спасибо. Но это было пока так для примера. Про форму и сам догадался. Также думаю, что при симметрии это не парабола, а скорее синусоида.
Кривая, конечно, далека от нужной. Таких изломов не должно быть. У ВЧ-фильтра она вообще получилась зеркальной.
АЧХ каждого фильтра имеет форму, близкую к параболе, симметричную относительно центральной частоты.
Чтоб было понятнее, набросал несколько вариантов сочетаний разных положений регуляторов.
И хотел узнать как вы у себя заблокировали в 2-полосном?Вот тут, как раз коммутаторы и понадобятся. Надо собрать значения всех бендов эквалайзера, просуммировать их, а результат подать на скриптовый счётчик. Получится, что он будет срабатывать при любом изменении любой полосы. В этом месте я как раз на грабли попервости и наступил - ошибся с модулем счётчика. Хотя на самом деле всё просто: биндинг возвращает значения в диапазоне -1500..0..1500, умножить на 18, получим 27000, и столько же прибавить (в общем коммутаторе), чтобы результат не был отрицательным - для счётчика это недопустимо. Получается, что модуль должен быть не менее 54000.
Кстати, подобным образом, наверное, можно построить и 5- и 7-полосный эквалайзер - вот это уже будет более актуально и востребовано.Да, построить и 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 кГц.
Но теперь я везде добавил их.
Этот фильтр (31 Гц), вообще, особняком стоит в эквалайзере. Если заметил, то все остальные идут через полоктавы, а этот - через октаву, относительно 63 Гц, получается, как бы пропущена полоса 43 Гц. А для полноты не хватает ещё и 20 кГц.Поэтому и пришлось использовать 2 синусоиды.
Во всех эквалайзерах 1 кГц - это центральная частота, у нас же слева от неё 9 полос, а справа - 8 - несимметрия.
Поэтому и пришлось использовать 2 синусоиды.Имелось в виду эквалайзеры с нечётным числом полос, как и в этом случае - 3. Но в любом случае частоты идут с равным шагом. В реальной аппаратуре часто встречаются эквалайзеры с 20 и 10 полосами - там уже не имеет значения, которая частота будет центральной.
А если добавить ещё 2 слева, то ещё более несимметрично будет при центре 1 кГц.
Имелось в виду эквалайзеры с нечётным числом полос, как и в этом случае - 3. Но в любом случае частоты идут с равным шагом. В реальной аппаратуре часто встречаются эквалайзеры с 20 и 10 полосами - там уже не имеет значения, которая частота будет центральной.А сделать центральными 2 - 700 Гц и 1 кГц?
Здесь, наверное, можно пойти было на некоторое упрощение: устанавливать движок 31 Гц в то же состояние, что и 63 Гц, т.е. АЧХ на этом участке будет просто прямой, тогда и сохранится симметрия относительно 1 кГц.
А сделать центральными 2 - 700 Гц и 1 кГц?Можно, конечно, но что тогда писать на этом регуляторе? Во всех 3-полосных темброблоках, что я встречал, даже в нашей аппаратуре, регулятор СЧ - это 1 кГц. Крайние регуляторы могут иметь и другие частоты, но в реалии их характеристики далеки от совершенства и АЧХ может иметь приличную неравномерность. Здесь же мы можем получить почти идеальную кривую.
... Надо собрать значения всех бендов эквалайзера, просуммировать их, а результат подать на скриптовый счётчик. Получится, что он будет срабатывать при любом изменении любой полосы.Получился один скрипт, причём средние частоты, оказывается, и рассчитывать не нужно.
Решил таки добить свою идею с коммутаторами:Получился один скрипт, причём средние частоты, оказывается, и рассчитывать не нужно.У меня тормознуто работают регуляторы особенно средний. Наверное из-за большого количества значений.
Регулировать можно как отдельными тремя слайдерами, так и в самом эквалайзере слайдерами 31 Гц, 1 кГц и 16 кГц, остальные блокированы.
У меня тормознуто работают регуляторы особенно средний. Наверное из-за большого количества значений.У себя я разницы не наблюдаю, единственное, что заметно - примагничивание в зоне 0 дБ, потому как используются "родные" слайдеры экывалайзера.
Я не думаю, что тригонометрические вычисления сильно грузят, скорее это количество вычислений.
Кстати, в 2-полосном варианте можно обойтись и без тригонометрии - просто умножать на коэффициенты, заранее вычисленные для каждой полосы, нагрузка, полагаю, ещё уменьшится.
Я не думаю, что тригонометрические вычисления сильно грузят, скорее это количество вычислений.Со скрипт-движком, скорее всего, разницы не заметить, но реально подпрограмма вычисления синуса намного объёмнее, чем простое умножение даже вещественных чисел, насколько помню, там используется разложение в ряд.
Сделал 2-полосный плавный или такой неправильный, надо чтобы центр на месте был как в 3-полосном.Не... так, конечно не должно быть, в 2-полосном можно вообще частоты от 500 Гц до 2 кГц не трогать, всегда выставлять на 0.
Кстати возникла идея привязать предусиление, тогда уровень громкости при регулировке будет всегда оставаться одинаковым.Не стоит этого делать. На графике это, может быть, и интересно смотрится, но на слух это будет неприемлимо, да и в реальной аппаратуре так никогда не делается, скорее всего пользователь в этом случае потянется к регулятору громкости. Если, к примеру, мы начнём добавлять верхи или низы, или всё вместе, средние частоты начнут проваливаться и на слух будет казаться, что громкость уменьшилась. Ухо у нас не одинаково воспринимает равную громкость на разных частотах, вспомни кривые равной громкости (это про тонкомпенсацию).
А вот над такой задачей для 2-полосного, мне кажется, стоит подумать. Имитировать изменение добротности фильтров, т. е. крутизну синусоид, оставляя АЧХ на средних частотах плоской. Ес-но, раздельно для НЧ и ВЧ. Это уже будет некая заявка на параметрический эквалайзер.Думаю это решаемо надо ввести ещё одну переменную в формулу и управлять значением через скрипт.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=54358.0;attach=48058)
А вот над такой задачей для 2-полосного, мне кажется, стоит подумать. Имитировать изменение добротности фильтров, т. е. крутизну синусоид, оставляя АЧХ на средних частотах плоской. Ес-но, раздельно для НЧ и ВЧ. Это уже будет некая заявка на параметрический эквалайзер.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=54358.0;attach=48058)
Я смог и такое сделать!Молодец, +1. Хоть и несколько грубовато получилось, но логически всё правильно.
Надо бы подумать над переименованием темы, а то она начиналась с 3-полосного эквалайзера, а теперь разрослась в сторону различных видов.Ну, переименуй первый пост, назови "Вариации на тему EQ". :)
Молодец, +1. Хоть и несколько грубовато получилось, но логически всё правильно.Так это решается легко надо лишь уменьшить количество значений в счётчиках.
Единственное, в регуляторах ширины пропускания фильтров два последних значения явно лишние: и на слух это неестественно звучит, и на графике некрасиво смотрится.
Раз вы это опубликовали,значит я могу внедрить такой темброблок в свои поделки?Для этого и опубликовано ;)
What is the difference between: темброблок.zip & темброблок_2.3.zip ?The differences are in the provider's scripts.
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, далее только чётные. Промежуточные - среднеарифметическое соседних. Помимо громоздкости получившегося скрипта, не уверен в корректности такого подхода. :-\
Попробовал сделать десятиполосный: Band1, далее только чётные. Промежуточные - среднеарифметическое соседних.Это неверный подход, формулы в скрипте будут другими.
Это неверный подход, формулы в скрипте будут другими.Но возьмём крайний случай: Band2 в =15, Band4 в +15. Почему в этом случае Band3 должен быть в положении отличным от нулевого?
Это только в крайнем случае. Кривые фильтров имеют форму синусоиды, а не линейную, частоты фильтров должны быть равномерно расположены, в АИМПе при 18 полосах - через пол-октавы (кроме полосы 31 Гц). 10- полосный эквалайзер имеет смысл делать для диапазона 20-20000, там частоты пойдут через октаву. Глянь, как это реализовано в трёхполосном темброблоке в этой же теме.В любом случае плясать придётся от родного 18-ти полосного. Тот трёхполосный я посмотрел, вот удастся ли из него сделать 10-ти?.. :-\
Это неверный подход, формулы в скрипте будут другими.Вот что у меня получилось:
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 на родном эквалайзере.
Можно же посмотреть, как будет меняться АЧХ при регулировке - в диалоге DSP на родном эквалайзере.Смотрел, разницы не увидел ???
Смотрел, разницы не увидел ???Разницы с чем? В твоём примере регулируются только крайние полосы и с изломом АЧХ, что ес-но при таких рассчётах, а в оригинальном EQ_3_Band и соседние полосы по синусоидальному закону. АЧХ плавная.
Разницы с чем? В твоём примере регулируются только крайние полосы и с изломом АЧХ, что ес-но при таких расчётах, а в оригинальном EQ_3_Band и соседние полосы по синусоидальному закону. АЧХ плавная.В моём примере регулируются только чётные полосы (не считая первой). Рассчитывается лишь положение промежуточных нечётных. По какому закону их нужно рассчитывать, если ни на какие иные параметры, вроде добротности, мы не влияем? Если посмотреть на кривую трёхполосного регулятора, то видно, что рассчитанное положение регулятора 4.0k равно полусумме положений регуляторов 1.0k и 16.0k. Точно так же и в моём случае: есть два регулятора, которые регулируются, и находящийся между ними, положение которого соответствует их среднеарифметической середине. Вся остальная кривизна АЧХ определяется исходной добротностью. Если взять родной эквалайзер из DSP, и вручную выставить любые три соседних регулятора (исключая первый, разумеется) линейно, то чем в этом случае будет отличаться график от аналогичной ситуации моего варианта? Ничем!
Без тригонометрических выражений в формулах не обойтись...Да... Упёрся я в эти частные случаи, когда серединка вопадает в серединку... А тригонометрию мне без помощи не осилить... :'(
... А тригонометрию мне без помощи не осилить... :'(Подождём Aleksandr009, у него мозги явно моих посвежее. Нужно решить эту задачу, как говорят, в "общем виде" для произвольного числа полос. Мне уже влом, да и времени нет - опять ремонтом занимаюсь.