Проект параметрического эквалайзера

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

Как правило, параметрические эквалайзеры разработаны как БИХ-фильтры второго порядка. Эти фильтры имеют недостаток, что из-за их младшего разряда, они могут представить относительно большую пульсацию или области перехода и могут наложиться друг с другом, когда несколько из них соединяются в каскаде. DSP System Toolbox™ предусматривает возможность разработать старшие БИХ-параметрические эквалайзеры. Такие старшие проекты обеспечивают намного больше управления формой каждого фильтра. Кроме того, особый случай проектов к традиционным параметрическим эквалайзерам второго порядка, если порядок фильтра устанавливается к два.

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

Некоторые базовые конструкции

Рассмотрите следующие два проекта параметрических эквалайзеров. Спецификации проекта являются тем же самым за исключением порядка фильтра. Первый проект является типичным параметрическим эквалайзером второго порядка, который повышает сигнал приблизительно 10 кГц на 5 дБ. Второй проект делает то же самое с фильтром шестого порядка. Заметьте, как фильтр шестого порядка ближе к идеальному фильтру кирпичной стены когда по сравнению с проектом второго порядка. Очевидно, приближение может быть улучшено путем увеличения порядка фильтра еще больше. Цена, чтобы заплатить за такое улучшенное приближение является увеличенной стоимостью внедрения, когда больше множителей требуется.

Fs = 48e3;
N1 = 2;
N2 = 6;
G  = 5; % 5 dB
Wo = 10000/(Fs/2);
BW = 4000/(Fs/2);
[B1,A1] = designParamEQ(N1,G,Wo,BW);
[B2,A2] = designParamEQ(N2,G,Wo,BW);
BQ1 = dsp.BiquadFilter('SOSMatrix',[B1.',[1,A1.']]);
BQ2 = dsp.BiquadFilter('SOSMatrix',[B2.',[ones(3,1),A2.']]);
hfvt = fvtool(BQ1,BQ2,'Fs',Fs,'Color','white');
legend(hfvt,'2nd-Order Design','6th-Order Design');

Один из параметров проекта является пропускной способностью фильтра, BW. В предыдущем примере пропускная способность была задана как 4 кГц. Пропускная способность на 4 кГц происходит в половине усиления (2,5 дБ).

Проекты на основе добротности

Другой параметр общего умысла является добротностью, Q. Q фильтра задан как Wo/BW (центральная частота/пропускная способность). Это обеспечивает меру резкости фильтра, т.е. как резко переходы фильтра между ссылочным значением (0 дБ) и усилением G. Рассмотрите два проекта с тем же G и Во, но различными значениями Q.

Fs  = 48e3;
N   = 2;
Q1  = 1.5;
Q2  = 10;
G   = 15; % 15 dB
Wo  = 6000/(Fs/2);
BW1 = Wo/Q1;
BW2 = Wo/Q2;
[B1,A1] = designParamEQ(N,G,Wo,BW1);
[B2,A2] = designParamEQ(N,G,Wo,BW2);
BQ1 = dsp.BiquadFilter('SOSMatrix',[B1.',[1,A1.']]);
BQ2 = dsp.BiquadFilter('SOSMatrix',[B2.',[1,A2.']]);
hfvt = fvtool(BQ1,BQ2,'Fs',Fs,'Color','white');
legend(hfvt,'Q = 1.5','Q = 10');

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

Fs  = 48e3;
N   = 2;
Q   = 10;
G   = 9; % 9 dB
Wo1 = 2000/(Fs/2);
Wo2 = 12000/(Fs/2);
BW1 = Wo1/Q;
BW2 = Wo2/Q;
[B1,A1] = designParamEQ(N,G,Wo1,BW1);
[B2,A2] = designParamEQ(N,G,Wo2,BW2);
BQ1 = dsp.BiquadFilter('SOSMatrix',[B1.',[1,A1.']]);
BQ2 = dsp.BiquadFilter('SOSMatrix',[B2.',[1,A2.']]);
hfvt = fvtool(BQ1,BQ2,'Fs',Fs,'Color','white');
legend(hfvt,'BW1 = 200 Hz; Q = 10','BW2 = 1200 Hz; Q = 10');

Когда просматривается в шкале логарифмической частоты, хотя, "пропускная способность октавы" двух фильтров является тем же самым.

hfvt = fvtool(BQ1,BQ2,'FrequencyScale','log','Fs',Fs,'Color','white');
legend(hfvt,'Fo1 = 2 kHz','Fo2 = 12 kHz');

Низкая полка и высокие фильтры полки

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

Fs  = 48e3;
N   = 4;
G   = 10; % 10 dB
Wo1 = 0;
Wo2 = 1; % Corresponds to Fs/2 (Hz) or pi (rad/sample)
BW = 1000/(Fs/2); % Bandwidth occurs at 7.4 dB in this case
[B1,A1] = designParamEQ(N,G,Wo1,BW);
[B2,A2] = designParamEQ(N,G,Wo2,BW);
BQ1 = dsp.BiquadFilter('SOSMatrix',[B1.',[ones(2,1),A1.']]);
BQ2 = dsp.BiquadFilter('SOSMatrix',[B2.',[ones(2,1),A2.']]);
hfvt = fvtool(BQ1,BQ2,'Fs',Fs,'Color','white');
legend(hfvt,'Low Shelf Filter','High Shelf Filter');

Параметрический эквалайзер, который сокращает

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

Fs = 48e3;
N  = 2;
G  = -5; % -5 dB
Wo = 6000/(Fs/2);
BW = 2000/(Fs/2);
[B,A] = designParamEQ(N,G,Wo,BW);
BQ = dsp.BiquadFilter('SOSMatrix',[B.',[1,A.']]);
hfvt = fvtool(BQ,'Fs',Fs,'Color','white');
legend(hfvt,'G = -5 dB');

В пределе фильтр может быть разработан, чтобы иметь усиление нуля (-Inf дБ) на заданной частоте. Это позволяет разрабатывать 2-й порядок или фильтры метки высшего порядка.

Fs  = 44.1e3;
N   = 8;
G   = -inf;
Q   = 1.8;
Wo  = 60/(Fs/2); % Notch at 60 Hz
BW  = Wo/Q; % Bandwidth will occur at -3 dB for this special case
[B1,A1] = designParamEQ(N,G,Wo,BW);
[NUM,DEN]  = iirnotch(Wo,BW); % or [NUM,DEN] = designParamEQ(2,G,Wo,BW);
SOS2 = [NUM,DEN];
BQ1 = dsp.BiquadFilter('SOSMatrix',[B1.',[ones(4,1),A1.']]);
BQ2 = dsp.BiquadFilter('SOSMatrix',SOS2);
hfvt = fvtool(BQ1,BQ2,'Fs',Fs,'FrequencyScale','Log','Color','white');
legend(hfvt,'8th order notch filter','2nd order notch filter');

Расположение каскадом параметрических эквалайзеров

Параметрические эквалайзеры обычно соединяются в каскаде (последовательно) так, чтобы несколько использовались одновременно, чтобы компенсировать звуковой сигнал. Чтобы соединить несколько эквалайзеров таким образом, используйте dsp.FilterCascade.

Fs  = 48e3;
N   = 2;
G1  = 3;  % 3 dB
G2  = -2; % -2 dB
Wo1 = 400/(Fs/2);
Wo2 = 1000/(Fs/2);
BW = 500/(Fs/2); % Bandwidth occurs at 7.4 dB in this case
[B1,A1] = designParamEQ(N,G1,Wo1,BW);
[B2,A2] = designParamEQ(N,G2,Wo2,BW);
BQ1 = dsp.BiquadFilter('SOSMatrix',[B1.',[1,A1.']]);
BQ2 = dsp.BiquadFilter('SOSMatrix',[B2.',[1,A2.']]);
FC  = dsp.FilterCascade(BQ1,BQ2);
hfvt = fvtool(FC,'Fs',Fs,'Color','white','FrequencyScale','Log');
legend(hfvt,'Cascade of 2nd order filters');

Проекты младшего разряда, такие как фильтры второго порядка выше могут вмешаться друг в друга, если их центральные частоты близко расположены. В примере выше, фильтр, сосредоточенный на уровне 1 кГц, как предполагалось, имел усиление-2 дБ. Из-за интерференции от другого фильтра, фактическое усиление больше похоже на-1 дБ. Проекты высшего порядка менее подвержены такой интерференции.

Fs  = 48e3;
N   = 8;
G1  = 3;  % 3 dB
G2  = -2; % -2 dB
Wo1 = 400/(Fs/2);
Wo2 = 1000/(Fs/2);
BW = 500/(Fs/2); % Bandwidth occurs at 7.4 dB in this case
[B1,A1] = designParamEQ(N,G1,Wo1,BW);
[B2,A2] = designParamEQ(N,G2,Wo2,BW);
BQ1a = dsp.BiquadFilter('SOSMatrix',[B1.',[ones(4,1),A1.']]);
BQ2a = dsp.BiquadFilter('SOSMatrix',[B2.',[ones(4,1),A2.']]);
FC2  = dsp.FilterCascade(BQ1a,BQ2a);
hfvt = fvtool(FC,FC2,'Fs',Fs,'Color','white','FrequencyScale','Log');
legend(hfvt,'Cascade of 2nd order filters','Cascade of 8th order filters');

Усовершенствованные проектные решения: определение низких частот и высоких частот

Для более усовершенствованных проектов может использоваться fdesign.parameq. Например, из-за деформирования частоты, в целом может быть трудно управлять точными ребрами частоты, в которых происходит пропускная способность. Для этого следующее может использоваться:

Fs    = 44.1e3;
N     = 4;
Flow  = 3000;
Fhigh = 4000;
Grsq  = 1;
Gref  = 10*log10(Grsq);
G     = -8;
Gsq   = 10.^(G/10); % Magnitude squared of filter; G = 5 dB
GBW   = 10*log10((Gsq + Grsq)/2);  % Flow and Fhigh occur at -2.37 dB

PEQ = fdesign.parameq('N,Flow,Fhigh,Gref,G0,GBW',...
    N,Flow/(Fs/2),Fhigh/(Fs/2),Gref,G,GBW);
BQ = design(PEQ,'SystemObject',true);
hfvt = fvtool(BQ,'Fs',Fs,'Color','white');
legend(hfvt,'Equalizer with Flow = 3 kHz and Fhigh = 4 kHz');

Заметьте, что фильтр имеет усиление-2.37 дБ на уровне 3 кГц и 4 кГц, как задано.

Откладывание фильтров с переменной пропускной способностью перехода или наклоном

Одна из характеристик отлогого фильтра является пропускной способностью перехода (иногда также названный наклоном перехода), который может быть задан параметром наклона полки S. GBW усиления ссылки пропускной способности всегда устанавливается в половину усиления повышения или сокращения отлогого фильтра. Все другие параметры, являющиеся постоянным, как S, увеличивают уменьшения пропускной способности перехода, (и наклон увеличений ответа) создание "наклонного вращения" вокруг точки GBW, как проиллюстрировано в примере ниже.

N  = 2;
Fs = 48e3;
Fo = 0;  % F0=0 designs a lowpass filter, F0=1 designs a highpass filter
Fc = 2e3/(Fs/2); % Cutoff Frequency
G  = 10;

S  = 1.5;
PEQ = fdesign.parameq('N,F0,Fc,S,G0',N,Fo,Fc,S,G);
BQ1 = design(PEQ,'SystemObject',true);

PEQ.S = 2.5;
BQ2 = design(PEQ,'SystemObject',true);

PEQ.S = 4;
BQ3 = design(PEQ,'SystemObject',true);

hfvt = fvtool(BQ1,BQ2,BQ3,'Fs',Fs,'Color','white');
legend(hfvt,'S=1.5','S=2.5','S=4');

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

m1 = measure(BQ1);
get(m1,'GBW')
m2 = measure(BQ2);
get(m2,'GBW')
m3 = measure(BQ3);
get(m3,'GBW')
ans =

     5


ans =

     5


ans =

     5

get(m1,'HighTransitionWidth')
get(m2,'HighTransitionWidth')
get(m3,'HighTransitionWidth')
ans =

    0.0945


ans =

    0.0425


ans =

    0.0238

Как параметр наклона полки S увеличения, также увеличивается пульсация фильтров. Мы можем увеличить порядок фильтра уменьшать пульсацию при поддержании желаемой пропускной способности перехода.

N   = 2;
PEQ = fdesign.parameq('N,F0,Fc,S,G0',N,Fo,Fc,S,G);
BQ1 = design(PEQ,'SystemObject',true);

PEQ.FilterOrder = 3;
BQ2 = design(PEQ,'SystemObject',true);

PEQ.FilterOrder = 4;
BQ3 = design(PEQ,'SystemObject',true);

hfvt = fvtool(BQ1,BQ2,BQ3,'Fs',Fs,'Color','white');
legend(hfvt,'N=2','N=3','N=4');

Откладывание фильтров с предписанной добротностью

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

N  = 2;
Fs = 48e3;
Fo = 1;  % F0=0 designs a lowpass filter, F0=1 designs a highpass filter
Fc = 20e3/(Fs/2); % Cutoff Frequency
G  = 10;
Q  = 0.48;
PEQ = fdesign.parameq('N,F0,Fc,Qa,G0',N,Fo,Fc,Q,G);
BQ1 = design(PEQ,'SystemObject',true);

PEQ.Qa = 1/sqrt(2);
BQ2 = design(PEQ,'SystemObject',true);

PEQ.Qa = 2.0222;
BQ3 = design(PEQ,'SystemObject',true);

hfvt = fvtool(BQ1,BQ2,BQ3,'Fs',Fs,'Color','white');
legend(hfvt,'Qa=0.48','Qa=0.7071','Qa=2.0222');