Linkwitz-Riley filter implementation (issue with 3dB peaks at cut-off frequency)

12 次查看(过去 30 天)
Hi,
My name is Daniel. I'm a Master Thesis student from Spain. At the time I'm trying to implement a 3 way linkwitz-riley crossover in Matlab. I'm doing it because the use of normal butterworth filters chained produces a 3dB peak at the cutoff frequencies. The thing is that I'm actually getting those peaks anyway.
To do the Linkwitz-Riley implemetation I'm following an explanation that I've found on dsprelated ( http://www.dsprelated.com/showmessage/112896/1.php )
There it is said...
You need for the three outputs to sum to the cascade of the two allpass filters,
. Lo + Mid + Hi = apH*apL
_ _ _Well,
. apH = lpH + hpH
. apL = lpL + hpL
So,
. apH*apL = (lpH + hpH)*(lpL + hpL)
. = lpH*lpL + lpH*hpL + hpH*(lpL + hpL)
. = lpH*lpL + lpH*hpL + hpH*apL
And the crossover must be configured like this:
. +---+ +---+
. +--|apL|--|hpH|-- Hi
. | +---+ +---+
. |
. | +---+ +---+
. --+--|hpL|--|lpH|-- Mid
. | +---+ +---+
. |
. | +---+ +---+
. +--|lpL|--|lpH|-- Lo
. +---+ +---+_ _ _
So... My code, reproducing this fact is the following...
[b0 a0]=butter(4,(2*pi*500)/22050);
[b1 a1]=butter(4,(2*pi*2000)/22050);
[b2 a2]=butter(4,(2*pi*500)/22050,'high');
[b3 a3]=butter(4,(2*pi*2000)/22050,'high');
H1=dfilt.df2t(b0,a0);
H2=dfilt.df2t(b1,a1);
H3=dfilt.df2t(b2,a2);
H4=dfilt.df2t(b3,a3);
paral=dfilt.parallel(H1,H3)
hi=dfilt.cascade(paral,H4);
mid=dfilt.cascade(H3,H2);
low=dfilt.cascade(H1,H2);
sum=dfilt.parallel(mid,hi,low)
fvtool(sum)
Can anyone find my mistake?
Thank you and best regards,
Dani

回答(0 个)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by