带 Linkwitz Riley 滤波器的 3 频段分频器

信息处理 过滤器 阶段 全部通过
2022-02-26 07:12:53

我想用 BiQuad 滤波器编写一个 3 波段“EQ”,但由于某种原因,我得到了一些相位失真。

这个问题已经在这里讨论过了。

我发现我需要使用全通滤波器来补偿滤波器的相位响应。顺便说一句,过滤器是 Linkwitz-Riley 二阶过滤器。

但是当我尝试将这个想法复制到我的项目中时,我仍然有一些失真。

// low pass calcuation for linkwitz riley filters

float lowCutoff; // the lower cutoff frequency
float highCutoff; // the higher cutoff frequency

double omega = M_PI * cutoffFrequency;  
double theta = omega / sampleRate;
double kappa = omega / tan(theta);
double delta = kappa * kappa + omega * omega + 2.0 * kappa * omega;

double a0 = (omega * omega) / delta;
double a1 = 2.0 * a0;
double a2 = a0;

double b1 = (-2.0 * kappa * kappa + 2.0 * omega * omega) / delta;
double b2 = (-2.0 * kappa * omega + kappa * kappa + omega * omega) / delta;

// high pass, only the calculation of a0 to b2 changes
// the intermediate values stay the same

double a0 = (kappa * kappa) / delta;
double a1 = -2.0 * a0;
double a2 = a0;

double b1 = (-2.0 * kappa * kappa + 2.0 * omega * omega) / delta;
double b2 = (-2.0 * kappa * omega + kappa * kappa + omega * omega) / delta;

// allpass filter to compensate phase response:

double q = 0.5;
double alpha = (tan(M_PI*q/sampleRate) - 1) / (tan(M_PI*0.5/sampleRate) + 1);
double beta =   -cos(lowCutoff  * M_PI / sampleRate);

double a0 = -alpha;
double a1 = beta*(1.0 - alpha);
double a2 = 1.0;
double b1 = beta*(1.0 - alpha);;
double b2 = -alpha;;

因为我使用二阶滤波器,所以我也必须使用二阶全通滤波器,对吧?我已经阅读了那些过滤器的内容,并且通过这个计算,我必须使用q. 所以q应该和qLinkwitz-Riley过滤器中的一样,应该是0.5对的吧?(我在某处读过这个,不确定。)

然后,我的实际处理看起来像这样:

// filter names:
// loAPF, lowHPF, ... low: lower cutoffhigh: higher cutoff
// APF: allpass, HPF: highpass, LPF: lowpass

highSample =  lowAPF->tick(highHPF->tick(sample));
midSample =   lowHPF->tick(highLPF->tick(sample));
lowSample =   lowLPF->tick(highLPF->tick(sample));

有人知道为什么我的相位响应可能有问题吗?

提前致谢!

2个回答

Linkwitz 网站上有一个关于“Duelund 3 路分频滤波器函数 D3”的参考资料,它似乎是 3 波段,它不是从 2 波段 LR 分频器的一个波段中分离出来的。我可能以前见过这个,但我并不熟悉。我现在看看它,看看我能不能摸到它。

这是对 Duelund 事物的另一个参考。

好的,这似乎是必不可少的 Duelund 3 路分频器:

HLP(s)=1s4+2as3+(a2+2)s2+2as+1

HBP(s)=(a2+2)s2s4+2as3+(a2+2)s2+2as+1

HHP(s)=s4s4+2as3+(a2+2)s2+2as+1

这一切加起来就是一个全通滤波器。好像a=22被推荐。

二阶 Linkwitz-Riley 分频器需要一阶全通相位补偿。

LR 分频器的低通一半是:

1s2+2s+1

LR 分频器的高通一半是:

s2s2+2s+1

对于偶数阶 LR 分频器,为了全通,两个部分之一必须具有反转极性。因此:

s2s2+2s+1-1s2+2s+1=(s-1)(s+1)(s+1)(s+1)=(s-1)(s+1)