Group Dela of Linkwitz Riley High-, Low, and Bandpass Filter
Hello,
I am an electrical engineering student currently working on analog filters, specifically cascaded Butterworth filter approximations, also known as Linkwitz-Riley filters.
In my MATLAB code, I generate bandpass filters from individual high-pass and low-pass filters, which together form a crossover network.
I want to plot the group delay of the high-pass and low-pass filters, as well as the total group delay of the crossover network.
However, when implementing this, only the group delay plot of the high-pass filter seems to make sense.
My calculations for the high-pass and low-pass filters are as follows.
Lowpass:
Groupdelay:
Highpass:
Groupdelay
After calculating the individual filters, I combined them into a crossover network, as shown in the following MATLAB code.
In my opinion, the group delay plot of the bandpass should look like this:
(from https://www.rfcafe.com/references/electrical/butterworth-highpass-bandpass-bandstop-filter-gain-phase-group-delay-equations.htm)
My calculations result in the following Bode diagram and the corresponding group delay plot.
What am I doing wrong?
Thanks in advance for any help!
Matlab Code:
omega_r1 = 2.*pi.*30;
omega_r2 = 2.*pi.*150;
omega_r3 = 2.*pi.*800;
omega_r4 = 2.*pi.*4E3;
omega_r5 = 2.*pi.*20E3;
Q = 0.7101 ;
f = logspace(-1, 5, 1000);
omega = 2 * pi * f;
s=1i.*omega;
%LRTP1 = LInkwitz Riley Lowpass 1
C_1 = 10E-6;
C_2 = 20.0164E-6;
R_1 = 1/(omega_r2*sqrt(C_1*C_2));
H_tp1 = 1 ./ (1 – (omega.^2 ./ omega_r2^2) + (s ./ (Q .* omega_r2)));
H_tp2 = 1 ./ (1 – (omega.^2 ./ omega_r2^2) + (s ./ (Q .* omega_r2)));
magnitude_LRTP1 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r2.^2)).^2 + (omega ./ (Q .* omega_r2)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r2.^2)).^2 + (omega ./ (Q .* omega_r2)).^2);
phase_LRTP1 = -atan2(omega./(Q.*omega_r2),1-(omega.^2./omega_r2.^2))-atan2(omega./(Q.*omega_r2),1-(omega.^2./omega_r2.^2));
norm_groupdelay_LRTP1 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r2.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r2.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r2.^2) + Q.^2);
groupdelay_LRTP1= (2 .* Q .* omega_r2 .* (omega.^2 + omega_r2.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r2.^2 .* omega.^2 + Q.^2 .* omega_r2.^4);
%LRTP2 = LInkwitz Riley Lowpass 2
C_4 = 10E-6;
C_5 = 20.0164E-6;
R_4 = 1/(omega_r3*sqrt(C_4*C_5));
H_tp3 = 1 ./ (1 – (omega.^2 ./ omega_r3^2) + (s ./ (Q .* omega_r3)));
H_tp4 = 1 ./ (1 – (omega.^2 ./ omega_r3^2) + (s ./ (Q .* omega_r3)));
magnitude_LRTP2 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r3.^2)).^2 + (omega ./ (Q .* omega_r3)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r3.^2)).^2 + (omega ./ (Q .* omega_r3)).^2);
phase_LRTP2 = -atan2(omega./(Q.*omega_r3),1-(omega.^2./omega_r3.^2))-atan2(omega./(Q.*omega_r3),1-(omega.^2./omega_r3.^2));
norm_groupdelay_LRTP2 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r3.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r3.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r3.^2) + Q.^2);
groupdelay_LRTP2= (2 .* Q .* omega_r3 .* (omega.^2 + omega_r3.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r3.^2 .* omega.^2 + Q.^2 .* omega_r3.^4);
%LRTP3 = LInkwitz Riley Lowpass 3
C_7 = 10E-6;
C_8 = 20.0164E-6;
R_7 = 1/(omega_r4*sqrt(C_7*C_8));
H_tp5 = 1 ./ (1 – (omega.^2 ./ omega_r4^2) + (s ./ (Q .* omega_r4)));
H_tp6 = 1 ./ (1 – (omega.^2 ./ omega_r4^2) + (s ./ (Q .* omega_r4)));
magnitude_LRTP3 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r4.^2)).^2 + (omega ./ (Q .* omega_r4)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r4.^2)).^2 + (omega ./ (Q .* omega_r4)).^2);
phase_LRTP3 = -atan2(omega./(Q.*omega_r4),1-(omega.^2./omega_r4.^2))-atan2(omega./(Q.*omega_r4),1-(omega.^2./omega_r4.^2));
norm_groupdelay_LRTP3 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r4.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r4.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r4.^2) + Q.^2);
groupdelay_LRTP3= (2 .* Q .* omega_r4 .* (omega.^2 + omega_r4.^2)) ./ (Q^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r4.^2 .* omega.^2 + Q.^2 .* omega_r4.^4);
%LRTP4 = LInkwitz Riley Lowpass 4
C_10 = 10E-6;
C_11 = 20.0164E-6;
R_10 = 1/(omega_r5*sqrt(C_10*C_11));
H_tp7 = 1 ./ (1 – (omega.^2 ./ omega_r5^2) + (s ./ (Q .* omega_r5)));
H_tp8 = 1 ./ (1 – (omega.^2 ./ omega_r5^2) + (s ./ (Q .* omega_r5)));
magnitude_LRTP4 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r5.^2)).^2 + (omega ./ (Q .* omega_r5)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r5.^2)).^2 + (omega ./ (Q .* omega_r5)).^2);
phase_LRTP4 = -atan2(omega./(Q.*omega_r5),1-(omega.^2./omega_r5.^2))-atan2(omega./(Q.*omega_r5),1-(omega.^2./omega_r5.^2));
norm_groupdelay_LRTP4 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r5.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r5.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r5.^2) + Q.^2);
groupdelay_LRTP4= (2 .* Q .* omega_r5 .* (omega.^2 + omega_r5.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r5.^2 .* omega.^2 + Q.^2 .* omega_r5.^4);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRTP1));
hold on
semilogx(f, 20*log10(magnitude_LRTP2));
semilogx(f, 20*log10(magnitude_LRTP3));
semilogx(f, 20*log10(magnitude_LRTP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRTP’, ‘Interpreter’, ‘latex’);
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRTP1));
hold on
semilogx(f, rad2deg(phase_LRTP2));
semilogx(f, rad2deg(phase_LRTP3));
semilogx(f, rad2deg(phase_LRTP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
semilogx(f, groupdelay_LRTP1);
hold on
semilogx(f, groupdelay_LRTP2);
semilogx(f, groupdelay_LRTP3);
semilogx(f, groupdelay_LRTP4);
grid on;
xlabel(‘$omega$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRTP’, ‘Interpreter’, ‘latex’);
%LRHP1 = LInkwitz Riley Highpass 1
R_2 = 10E3;
R_3 = 20.0164E3;
C_3 = 1/(omega_r1*sqrt(R_2*R_3));
H_hp1 = (Q .* (s ./ omega_r1)) ./ (1 + Q .* ((s ./ omega_r1) + (omega_r1 ./ s)));
H_hp2 = (Q .* (s ./ omega_r1)) ./ (1 + Q .* ((s ./ omega_r1) + (omega_r1 ./ s)));
magnitude_LRHP1 = (Q .* (omega ./ omega_r1)) ./ sqrt(1 + (Q .* ((omega ./ omega_r1) – (omega_r1 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r1)) ./ sqrt(1 + (Q .* ((omega ./ omega_r1) – (omega_r1 ./ omega))).^2);
phase_LRHP1 = -atan2(Q.*omega./omega_r1-Q.*omega_r1./omega,1)+pi./2-atan2(Q.*omega./omega_r1-Q.*omega_r1./omega,1)+pi./2;
norm_groupdelay_LRHP1 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r1).^2 + Q)) ./ ((Q .* (omega ./ omega_r1) – Q ./ (omega ./ omega_r1)).^2 + 1);
groupdelay_LRHP1= (2 .* (Q .* omega_r1 ./ omega.^2 + Q ./ omega_r1)) ./ ((Q .* omega ./ omega_r1 – Q .* omega_r1 ./ omega).^2 + 1);
%LRHP2 = LInkwitz Riley Highpass 2
R_5 = 10E3;
R_6 = 20.0164E3;
C_6 = 1/(omega_r2*sqrt(R_5*R_6));
H_hp3 = (Q .* (s ./ omega_r2)) ./ (1 + Q .* ((s ./ omega_r2) + (omega_r2 ./ s)));
H_hp4 = (Q .* (s ./ omega_r2)) ./ (1 + Q .* ((s ./ omega_r2) + (omega_r2 ./ s)));
magnitude_LRHP2 = (Q .* (omega ./ omega_r2)) ./ sqrt(1 + (Q .* ((omega ./ omega_r2) – (omega_r2 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r2)) ./ sqrt(1 + (Q .* ((omega ./ omega_r2) – (omega_r2 ./ omega))).^2);
phase_LRHP2 = -atan2(Q.*omega./omega_r2-Q.*omega_r2./omega,1)+pi./2-atan2(Q.*omega./omega_r2-Q.*omega_r2./omega,1)+pi./2;
norm_groupdelay_LRHP2 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r2).^2 + Q)) ./ ((Q .* (omega ./ omega_r2) – Q ./ (omega ./ omega_r2)).^2 + 1);
groupdelay_LRHP2= (2 .* (Q .* omega_r2 ./ omega.^2 + Q ./ omega_r2)) ./ ((Q .* omega ./ omega_r2 – Q .* omega_r2 ./ omega).^2 + 1);
%LRHP3 = LInkwitz Riley Highpass 3
R_8 = 10E3;
R_9 = 20.0164E3;
C_9 = 1/(omega_r3*sqrt(R_8*R_9));
H_hp5 = (Q .* (s ./ omega_r3)) ./ (1 + Q .* ((s ./ omega_r3) + (omega_r3 ./ s)));
H_hp6 = (Q .* (s ./ omega_r3)) ./ (1 + Q .* ((s ./ omega_r3) + (omega_r3 ./ s)));
magnitude_LRHP3 = (Q .* (omega ./ omega_r3)) ./ sqrt(1 + (Q .* ((omega ./ omega_r3) – (omega_r3 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r3)) ./ sqrt(1 + (Q .* ((omega ./ omega_r3) – (omega_r3 ./ omega))).^2);
phase_LRHP3 = -atan2(Q.*omega./omega_r3-Q.*omega_r3./omega,1)+pi./2-atan2(Q.*omega./omega_r3-Q.*omega_r3./omega,1)+pi./2;
norm_groupdelay_LRHP3 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r3).^2 + Q)) ./ ((Q .* (omega ./ omega_r3) – Q ./ (omega ./ omega_r3)).^2 + 1);
groupdelay_LRHP3= (2 .* (Q .* omega_r3 ./ omega.^2 + Q ./ omega_r3)) ./ ((Q .* omega ./ omega_r3 – Q .* omega_r3 ./ omega).^2 + 1);
%LRHP4 = LInkwitz Riley Highpass 4
R_11 = 10E3;
R_12 = 20.0164E3;
C_12 = 1/(omega_r4*sqrt(R_11*R_12));
H_hp7 = (Q .* (s ./ omega_r4)) ./ (1 + Q .* ((s ./ omega_r4) + (omega_r4 ./ s)));
H_hp8 = (Q .* (s ./ omega_r4)) ./ (1 + Q .* ((s ./ omega_r4) + (omega_r4 ./ s)));
magnitude_LRHP4 = (Q .* (omega ./ omega_r4)) ./ sqrt(1 + (Q .* ((omega ./ omega_r4) – (omega_r4 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r4)) ./ sqrt(1 + (Q .* ((omega ./ omega_r4) – (omega_r4 ./ omega))).^2);
phase_LRHP4 = -atan2(Q.*omega./omega_r4-Q.*omega_r4./omega,1)+pi./2-atan2(Q.*omega./omega_r4-Q.*omega_r4./omega,1)+pi./2;
norm_groupdelay_LRHP4 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r4).^2 + Q)) ./ ((Q .* (omega ./ omega_r4) – Q ./ (omega ./ omega_r4)).^2 + 1);
groupdelay_LRHP4= (2 .* (Q .* omega_r4 ./ omega.^2 + Q ./ omega_r4)) ./ ((Q .* omega ./ omega_r4 – Q .* omega_r4 ./ omega).^2 + 1);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRHP1));
hold on
semilogx(f, 20*log10(magnitude_LRHP2));
semilogx(f, 20*log10(magnitude_LRHP3));
semilogx(f, 20*log10(magnitude_LRHP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRHP’, ‘Interpreter’, ‘latex’);
% Plot für die Phase (in Grad)
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRHP1));
hold on
semilogx(f, rad2deg(phase_LRHP2));
semilogx(f, rad2deg(phase_LRHP3));
semilogx(f, rad2deg(phase_LRHP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
% Plot für die groupdelay
semilogx(f, groupdelay_LRHP1);
hold on
semilogx(f, groupdelay_LRHP2);
semilogx(f, groupdelay_LRHP3);
semilogx(f, groupdelay_LRHP4);
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRHP’, ‘Interpreter’, ‘latex’);
%LRBP1 = LInkwitz Riley Bandpass 1
magnitude_LRBP1 = magnitude_LRHP1.*magnitude_LRTP1;
phase_LRBP1 = phase_LRHP1+phase_LRTP1;
groupdelay_LRBP1 = groupdelay_LRTP1+groupdelay_LRHP1;
%Same result:
%groupdelay_LRBP1 = -gradient(phase_LRBP1) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 2
magnitude_LRBP2 = magnitude_LRHP2.*magnitude_LRTP2;
phase_LRBP2 = phase_LRHP2+phase_LRTP2;
groupdelay_LRBP2 = groupdelay_LRTP2+groupdelay_LRHP2;
%Same result:
%groupdelay_LRBP2 = -gradient(phase_LRBP2) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 3
magnitude_LRBP3 = magnitude_LRHP3.*magnitude_LRTP3;
phase_LRBP3 = phase_LRHP3+phase_LRTP3;
groupdelay_LRBP3 = groupdelay_LRTP3+groupdelay_LRHP3;
%Same result:
%groupdelay_LRBP3 = -gradient(phase_LRBP3) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 4
magnitude_LRBP4 = magnitude_LRHP4.*magnitude_LRTP4;
phase_LRBP4 = phase_LRHP4+phase_LRTP4;
groupdelay_LRBP4 = groupdelay_LRTP4+groupdelay_LRHP4;
%Same result:
%groupdelay_LRBP4 = -gradient(phase_LRBP4) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass_ges
magnitude_LRBP_ges = magnitude_LRBP1+magnitude_LRBP2+magnitude_LRBP3+magnitude_LRBP4;
phase_LRBP_ges = phase_LRBP1+phase_LRBP2+phase_LRBP3+phase_LRBP4;
groupdelay_LRBP_ges = groupdelay_LRTP1+groupdelay_LRHP1+groupdelay_LRTP2+groupdelay_LRHP2…
+groupdelay_LRTP3+groupdelay_LRHP3+groupdelay_LRTP4+groupdelay_LRHP4;
%Same result:
%groupdelay_LRBP_ges = -gradient(phase_LRBP2) ./ gradient(omega);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRBP1));
hold on
semilogx(f, 20*log10(magnitude_LRBP2));
semilogx(f, 20*log10(magnitude_LRBP3));
semilogx(f, 20*log10(magnitude_LRBP4));
semilogx(f, 20*log10(magnitude_LRBP_ges));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRBP’, ‘Interpreter’, ‘latex’);
% Plot für die Phase (in Grad)
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRBP1));
hold on
semilogx(f, rad2deg(phase_LRBP2));
semilogx(f, rad2deg(phase_LRBP3));
semilogx(f, rad2deg(phase_LRBP4));
semilogx(f, rad2deg(phase_LRBP_ges));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
% Plot für die groupdelay
semilogx(f, groupdelay_LRBP1);
hold on
semilogx(f, groupdelay_LRBP2);
semilogx(f, groupdelay_LRBP3);
semilogx(f, groupdelay_LRBP4);
semilogx(f, groupdelay_LRBP_ges);
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRBP’, ‘Interpreter’, ‘latex’);Hello,
I am an electrical engineering student currently working on analog filters, specifically cascaded Butterworth filter approximations, also known as Linkwitz-Riley filters.
In my MATLAB code, I generate bandpass filters from individual high-pass and low-pass filters, which together form a crossover network.
I want to plot the group delay of the high-pass and low-pass filters, as well as the total group delay of the crossover network.
However, when implementing this, only the group delay plot of the high-pass filter seems to make sense.
My calculations for the high-pass and low-pass filters are as follows.
Lowpass:
Groupdelay:
Highpass:
Groupdelay
After calculating the individual filters, I combined them into a crossover network, as shown in the following MATLAB code.
In my opinion, the group delay plot of the bandpass should look like this:
(from https://www.rfcafe.com/references/electrical/butterworth-highpass-bandpass-bandstop-filter-gain-phase-group-delay-equations.htm)
My calculations result in the following Bode diagram and the corresponding group delay plot.
What am I doing wrong?
Thanks in advance for any help!
Matlab Code:
omega_r1 = 2.*pi.*30;
omega_r2 = 2.*pi.*150;
omega_r3 = 2.*pi.*800;
omega_r4 = 2.*pi.*4E3;
omega_r5 = 2.*pi.*20E3;
Q = 0.7101 ;
f = logspace(-1, 5, 1000);
omega = 2 * pi * f;
s=1i.*omega;
%LRTP1 = LInkwitz Riley Lowpass 1
C_1 = 10E-6;
C_2 = 20.0164E-6;
R_1 = 1/(omega_r2*sqrt(C_1*C_2));
H_tp1 = 1 ./ (1 – (omega.^2 ./ omega_r2^2) + (s ./ (Q .* omega_r2)));
H_tp2 = 1 ./ (1 – (omega.^2 ./ omega_r2^2) + (s ./ (Q .* omega_r2)));
magnitude_LRTP1 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r2.^2)).^2 + (omega ./ (Q .* omega_r2)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r2.^2)).^2 + (omega ./ (Q .* omega_r2)).^2);
phase_LRTP1 = -atan2(omega./(Q.*omega_r2),1-(omega.^2./omega_r2.^2))-atan2(omega./(Q.*omega_r2),1-(omega.^2./omega_r2.^2));
norm_groupdelay_LRTP1 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r2.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r2.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r2.^2) + Q.^2);
groupdelay_LRTP1= (2 .* Q .* omega_r2 .* (omega.^2 + omega_r2.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r2.^2 .* omega.^2 + Q.^2 .* omega_r2.^4);
%LRTP2 = LInkwitz Riley Lowpass 2
C_4 = 10E-6;
C_5 = 20.0164E-6;
R_4 = 1/(omega_r3*sqrt(C_4*C_5));
H_tp3 = 1 ./ (1 – (omega.^2 ./ omega_r3^2) + (s ./ (Q .* omega_r3)));
H_tp4 = 1 ./ (1 – (omega.^2 ./ omega_r3^2) + (s ./ (Q .* omega_r3)));
magnitude_LRTP2 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r3.^2)).^2 + (omega ./ (Q .* omega_r3)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r3.^2)).^2 + (omega ./ (Q .* omega_r3)).^2);
phase_LRTP2 = -atan2(omega./(Q.*omega_r3),1-(omega.^2./omega_r3.^2))-atan2(omega./(Q.*omega_r3),1-(omega.^2./omega_r3.^2));
norm_groupdelay_LRTP2 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r3.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r3.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r3.^2) + Q.^2);
groupdelay_LRTP2= (2 .* Q .* omega_r3 .* (omega.^2 + omega_r3.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r3.^2 .* omega.^2 + Q.^2 .* omega_r3.^4);
%LRTP3 = LInkwitz Riley Lowpass 3
C_7 = 10E-6;
C_8 = 20.0164E-6;
R_7 = 1/(omega_r4*sqrt(C_7*C_8));
H_tp5 = 1 ./ (1 – (omega.^2 ./ omega_r4^2) + (s ./ (Q .* omega_r4)));
H_tp6 = 1 ./ (1 – (omega.^2 ./ omega_r4^2) + (s ./ (Q .* omega_r4)));
magnitude_LRTP3 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r4.^2)).^2 + (omega ./ (Q .* omega_r4)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r4.^2)).^2 + (omega ./ (Q .* omega_r4)).^2);
phase_LRTP3 = -atan2(omega./(Q.*omega_r4),1-(omega.^2./omega_r4.^2))-atan2(omega./(Q.*omega_r4),1-(omega.^2./omega_r4.^2));
norm_groupdelay_LRTP3 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r4.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r4.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r4.^2) + Q.^2);
groupdelay_LRTP3= (2 .* Q .* omega_r4 .* (omega.^2 + omega_r4.^2)) ./ (Q^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r4.^2 .* omega.^2 + Q.^2 .* omega_r4.^4);
%LRTP4 = LInkwitz Riley Lowpass 4
C_10 = 10E-6;
C_11 = 20.0164E-6;
R_10 = 1/(omega_r5*sqrt(C_10*C_11));
H_tp7 = 1 ./ (1 – (omega.^2 ./ omega_r5^2) + (s ./ (Q .* omega_r5)));
H_tp8 = 1 ./ (1 – (omega.^2 ./ omega_r5^2) + (s ./ (Q .* omega_r5)));
magnitude_LRTP4 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r5.^2)).^2 + (omega ./ (Q .* omega_r5)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r5.^2)).^2 + (omega ./ (Q .* omega_r5)).^2);
phase_LRTP4 = -atan2(omega./(Q.*omega_r5),1-(omega.^2./omega_r5.^2))-atan2(omega./(Q.*omega_r5),1-(omega.^2./omega_r5.^2));
norm_groupdelay_LRTP4 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r5.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r5.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r5.^2) + Q.^2);
groupdelay_LRTP4= (2 .* Q .* omega_r5 .* (omega.^2 + omega_r5.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r5.^2 .* omega.^2 + Q.^2 .* omega_r5.^4);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRTP1));
hold on
semilogx(f, 20*log10(magnitude_LRTP2));
semilogx(f, 20*log10(magnitude_LRTP3));
semilogx(f, 20*log10(magnitude_LRTP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRTP’, ‘Interpreter’, ‘latex’);
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRTP1));
hold on
semilogx(f, rad2deg(phase_LRTP2));
semilogx(f, rad2deg(phase_LRTP3));
semilogx(f, rad2deg(phase_LRTP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
semilogx(f, groupdelay_LRTP1);
hold on
semilogx(f, groupdelay_LRTP2);
semilogx(f, groupdelay_LRTP3);
semilogx(f, groupdelay_LRTP4);
grid on;
xlabel(‘$omega$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRTP’, ‘Interpreter’, ‘latex’);
%LRHP1 = LInkwitz Riley Highpass 1
R_2 = 10E3;
R_3 = 20.0164E3;
C_3 = 1/(omega_r1*sqrt(R_2*R_3));
H_hp1 = (Q .* (s ./ omega_r1)) ./ (1 + Q .* ((s ./ omega_r1) + (omega_r1 ./ s)));
H_hp2 = (Q .* (s ./ omega_r1)) ./ (1 + Q .* ((s ./ omega_r1) + (omega_r1 ./ s)));
magnitude_LRHP1 = (Q .* (omega ./ omega_r1)) ./ sqrt(1 + (Q .* ((omega ./ omega_r1) – (omega_r1 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r1)) ./ sqrt(1 + (Q .* ((omega ./ omega_r1) – (omega_r1 ./ omega))).^2);
phase_LRHP1 = -atan2(Q.*omega./omega_r1-Q.*omega_r1./omega,1)+pi./2-atan2(Q.*omega./omega_r1-Q.*omega_r1./omega,1)+pi./2;
norm_groupdelay_LRHP1 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r1).^2 + Q)) ./ ((Q .* (omega ./ omega_r1) – Q ./ (omega ./ omega_r1)).^2 + 1);
groupdelay_LRHP1= (2 .* (Q .* omega_r1 ./ omega.^2 + Q ./ omega_r1)) ./ ((Q .* omega ./ omega_r1 – Q .* omega_r1 ./ omega).^2 + 1);
%LRHP2 = LInkwitz Riley Highpass 2
R_5 = 10E3;
R_6 = 20.0164E3;
C_6 = 1/(omega_r2*sqrt(R_5*R_6));
H_hp3 = (Q .* (s ./ omega_r2)) ./ (1 + Q .* ((s ./ omega_r2) + (omega_r2 ./ s)));
H_hp4 = (Q .* (s ./ omega_r2)) ./ (1 + Q .* ((s ./ omega_r2) + (omega_r2 ./ s)));
magnitude_LRHP2 = (Q .* (omega ./ omega_r2)) ./ sqrt(1 + (Q .* ((omega ./ omega_r2) – (omega_r2 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r2)) ./ sqrt(1 + (Q .* ((omega ./ omega_r2) – (omega_r2 ./ omega))).^2);
phase_LRHP2 = -atan2(Q.*omega./omega_r2-Q.*omega_r2./omega,1)+pi./2-atan2(Q.*omega./omega_r2-Q.*omega_r2./omega,1)+pi./2;
norm_groupdelay_LRHP2 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r2).^2 + Q)) ./ ((Q .* (omega ./ omega_r2) – Q ./ (omega ./ omega_r2)).^2 + 1);
groupdelay_LRHP2= (2 .* (Q .* omega_r2 ./ omega.^2 + Q ./ omega_r2)) ./ ((Q .* omega ./ omega_r2 – Q .* omega_r2 ./ omega).^2 + 1);
%LRHP3 = LInkwitz Riley Highpass 3
R_8 = 10E3;
R_9 = 20.0164E3;
C_9 = 1/(omega_r3*sqrt(R_8*R_9));
H_hp5 = (Q .* (s ./ omega_r3)) ./ (1 + Q .* ((s ./ omega_r3) + (omega_r3 ./ s)));
H_hp6 = (Q .* (s ./ omega_r3)) ./ (1 + Q .* ((s ./ omega_r3) + (omega_r3 ./ s)));
magnitude_LRHP3 = (Q .* (omega ./ omega_r3)) ./ sqrt(1 + (Q .* ((omega ./ omega_r3) – (omega_r3 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r3)) ./ sqrt(1 + (Q .* ((omega ./ omega_r3) – (omega_r3 ./ omega))).^2);
phase_LRHP3 = -atan2(Q.*omega./omega_r3-Q.*omega_r3./omega,1)+pi./2-atan2(Q.*omega./omega_r3-Q.*omega_r3./omega,1)+pi./2;
norm_groupdelay_LRHP3 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r3).^2 + Q)) ./ ((Q .* (omega ./ omega_r3) – Q ./ (omega ./ omega_r3)).^2 + 1);
groupdelay_LRHP3= (2 .* (Q .* omega_r3 ./ omega.^2 + Q ./ omega_r3)) ./ ((Q .* omega ./ omega_r3 – Q .* omega_r3 ./ omega).^2 + 1);
%LRHP4 = LInkwitz Riley Highpass 4
R_11 = 10E3;
R_12 = 20.0164E3;
C_12 = 1/(omega_r4*sqrt(R_11*R_12));
H_hp7 = (Q .* (s ./ omega_r4)) ./ (1 + Q .* ((s ./ omega_r4) + (omega_r4 ./ s)));
H_hp8 = (Q .* (s ./ omega_r4)) ./ (1 + Q .* ((s ./ omega_r4) + (omega_r4 ./ s)));
magnitude_LRHP4 = (Q .* (omega ./ omega_r4)) ./ sqrt(1 + (Q .* ((omega ./ omega_r4) – (omega_r4 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r4)) ./ sqrt(1 + (Q .* ((omega ./ omega_r4) – (omega_r4 ./ omega))).^2);
phase_LRHP4 = -atan2(Q.*omega./omega_r4-Q.*omega_r4./omega,1)+pi./2-atan2(Q.*omega./omega_r4-Q.*omega_r4./omega,1)+pi./2;
norm_groupdelay_LRHP4 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r4).^2 + Q)) ./ ((Q .* (omega ./ omega_r4) – Q ./ (omega ./ omega_r4)).^2 + 1);
groupdelay_LRHP4= (2 .* (Q .* omega_r4 ./ omega.^2 + Q ./ omega_r4)) ./ ((Q .* omega ./ omega_r4 – Q .* omega_r4 ./ omega).^2 + 1);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRHP1));
hold on
semilogx(f, 20*log10(magnitude_LRHP2));
semilogx(f, 20*log10(magnitude_LRHP3));
semilogx(f, 20*log10(magnitude_LRHP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRHP’, ‘Interpreter’, ‘latex’);
% Plot für die Phase (in Grad)
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRHP1));
hold on
semilogx(f, rad2deg(phase_LRHP2));
semilogx(f, rad2deg(phase_LRHP3));
semilogx(f, rad2deg(phase_LRHP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
% Plot für die groupdelay
semilogx(f, groupdelay_LRHP1);
hold on
semilogx(f, groupdelay_LRHP2);
semilogx(f, groupdelay_LRHP3);
semilogx(f, groupdelay_LRHP4);
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRHP’, ‘Interpreter’, ‘latex’);
%LRBP1 = LInkwitz Riley Bandpass 1
magnitude_LRBP1 = magnitude_LRHP1.*magnitude_LRTP1;
phase_LRBP1 = phase_LRHP1+phase_LRTP1;
groupdelay_LRBP1 = groupdelay_LRTP1+groupdelay_LRHP1;
%Same result:
%groupdelay_LRBP1 = -gradient(phase_LRBP1) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 2
magnitude_LRBP2 = magnitude_LRHP2.*magnitude_LRTP2;
phase_LRBP2 = phase_LRHP2+phase_LRTP2;
groupdelay_LRBP2 = groupdelay_LRTP2+groupdelay_LRHP2;
%Same result:
%groupdelay_LRBP2 = -gradient(phase_LRBP2) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 3
magnitude_LRBP3 = magnitude_LRHP3.*magnitude_LRTP3;
phase_LRBP3 = phase_LRHP3+phase_LRTP3;
groupdelay_LRBP3 = groupdelay_LRTP3+groupdelay_LRHP3;
%Same result:
%groupdelay_LRBP3 = -gradient(phase_LRBP3) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 4
magnitude_LRBP4 = magnitude_LRHP4.*magnitude_LRTP4;
phase_LRBP4 = phase_LRHP4+phase_LRTP4;
groupdelay_LRBP4 = groupdelay_LRTP4+groupdelay_LRHP4;
%Same result:
%groupdelay_LRBP4 = -gradient(phase_LRBP4) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass_ges
magnitude_LRBP_ges = magnitude_LRBP1+magnitude_LRBP2+magnitude_LRBP3+magnitude_LRBP4;
phase_LRBP_ges = phase_LRBP1+phase_LRBP2+phase_LRBP3+phase_LRBP4;
groupdelay_LRBP_ges = groupdelay_LRTP1+groupdelay_LRHP1+groupdelay_LRTP2+groupdelay_LRHP2…
+groupdelay_LRTP3+groupdelay_LRHP3+groupdelay_LRTP4+groupdelay_LRHP4;
%Same result:
%groupdelay_LRBP_ges = -gradient(phase_LRBP2) ./ gradient(omega);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRBP1));
hold on
semilogx(f, 20*log10(magnitude_LRBP2));
semilogx(f, 20*log10(magnitude_LRBP3));
semilogx(f, 20*log10(magnitude_LRBP4));
semilogx(f, 20*log10(magnitude_LRBP_ges));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRBP’, ‘Interpreter’, ‘latex’);
% Plot für die Phase (in Grad)
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRBP1));
hold on
semilogx(f, rad2deg(phase_LRBP2));
semilogx(f, rad2deg(phase_LRBP3));
semilogx(f, rad2deg(phase_LRBP4));
semilogx(f, rad2deg(phase_LRBP_ges));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
% Plot für die groupdelay
semilogx(f, groupdelay_LRBP1);
hold on
semilogx(f, groupdelay_LRBP2);
semilogx(f, groupdelay_LRBP3);
semilogx(f, groupdelay_LRBP4);
semilogx(f, groupdelay_LRBP_ges);
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRBP’, ‘Interpreter’, ‘latex’); Hello,
I am an electrical engineering student currently working on analog filters, specifically cascaded Butterworth filter approximations, also known as Linkwitz-Riley filters.
In my MATLAB code, I generate bandpass filters from individual high-pass and low-pass filters, which together form a crossover network.
I want to plot the group delay of the high-pass and low-pass filters, as well as the total group delay of the crossover network.
However, when implementing this, only the group delay plot of the high-pass filter seems to make sense.
My calculations for the high-pass and low-pass filters are as follows.
Lowpass:
Groupdelay:
Highpass:
Groupdelay
After calculating the individual filters, I combined them into a crossover network, as shown in the following MATLAB code.
In my opinion, the group delay plot of the bandpass should look like this:
(from https://www.rfcafe.com/references/electrical/butterworth-highpass-bandpass-bandstop-filter-gain-phase-group-delay-equations.htm)
My calculations result in the following Bode diagram and the corresponding group delay plot.
What am I doing wrong?
Thanks in advance for any help!
Matlab Code:
omega_r1 = 2.*pi.*30;
omega_r2 = 2.*pi.*150;
omega_r3 = 2.*pi.*800;
omega_r4 = 2.*pi.*4E3;
omega_r5 = 2.*pi.*20E3;
Q = 0.7101 ;
f = logspace(-1, 5, 1000);
omega = 2 * pi * f;
s=1i.*omega;
%LRTP1 = LInkwitz Riley Lowpass 1
C_1 = 10E-6;
C_2 = 20.0164E-6;
R_1 = 1/(omega_r2*sqrt(C_1*C_2));
H_tp1 = 1 ./ (1 – (omega.^2 ./ omega_r2^2) + (s ./ (Q .* omega_r2)));
H_tp2 = 1 ./ (1 – (omega.^2 ./ omega_r2^2) + (s ./ (Q .* omega_r2)));
magnitude_LRTP1 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r2.^2)).^2 + (omega ./ (Q .* omega_r2)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r2.^2)).^2 + (omega ./ (Q .* omega_r2)).^2);
phase_LRTP1 = -atan2(omega./(Q.*omega_r2),1-(omega.^2./omega_r2.^2))-atan2(omega./(Q.*omega_r2),1-(omega.^2./omega_r2.^2));
norm_groupdelay_LRTP1 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r2.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r2.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r2.^2) + Q.^2);
groupdelay_LRTP1= (2 .* Q .* omega_r2 .* (omega.^2 + omega_r2.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r2.^2 .* omega.^2 + Q.^2 .* omega_r2.^4);
%LRTP2 = LInkwitz Riley Lowpass 2
C_4 = 10E-6;
C_5 = 20.0164E-6;
R_4 = 1/(omega_r3*sqrt(C_4*C_5));
H_tp3 = 1 ./ (1 – (omega.^2 ./ omega_r3^2) + (s ./ (Q .* omega_r3)));
H_tp4 = 1 ./ (1 – (omega.^2 ./ omega_r3^2) + (s ./ (Q .* omega_r3)));
magnitude_LRTP2 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r3.^2)).^2 + (omega ./ (Q .* omega_r3)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r3.^2)).^2 + (omega ./ (Q .* omega_r3)).^2);
phase_LRTP2 = -atan2(omega./(Q.*omega_r3),1-(omega.^2./omega_r3.^2))-atan2(omega./(Q.*omega_r3),1-(omega.^2./omega_r3.^2));
norm_groupdelay_LRTP2 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r3.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r3.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r3.^2) + Q.^2);
groupdelay_LRTP2= (2 .* Q .* omega_r3 .* (omega.^2 + omega_r3.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r3.^2 .* omega.^2 + Q.^2 .* omega_r3.^4);
%LRTP3 = LInkwitz Riley Lowpass 3
C_7 = 10E-6;
C_8 = 20.0164E-6;
R_7 = 1/(omega_r4*sqrt(C_7*C_8));
H_tp5 = 1 ./ (1 – (omega.^2 ./ omega_r4^2) + (s ./ (Q .* omega_r4)));
H_tp6 = 1 ./ (1 – (omega.^2 ./ omega_r4^2) + (s ./ (Q .* omega_r4)));
magnitude_LRTP3 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r4.^2)).^2 + (omega ./ (Q .* omega_r4)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r4.^2)).^2 + (omega ./ (Q .* omega_r4)).^2);
phase_LRTP3 = -atan2(omega./(Q.*omega_r4),1-(omega.^2./omega_r4.^2))-atan2(omega./(Q.*omega_r4),1-(omega.^2./omega_r4.^2));
norm_groupdelay_LRTP3 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r4.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r4.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r4.^2) + Q.^2);
groupdelay_LRTP3= (2 .* Q .* omega_r4 .* (omega.^2 + omega_r4.^2)) ./ (Q^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r4.^2 .* omega.^2 + Q.^2 .* omega_r4.^4);
%LRTP4 = LInkwitz Riley Lowpass 4
C_10 = 10E-6;
C_11 = 20.0164E-6;
R_10 = 1/(omega_r5*sqrt(C_10*C_11));
H_tp7 = 1 ./ (1 – (omega.^2 ./ omega_r5^2) + (s ./ (Q .* omega_r5)));
H_tp8 = 1 ./ (1 – (omega.^2 ./ omega_r5^2) + (s ./ (Q .* omega_r5)));
magnitude_LRTP4 = 1 ./ sqrt((1 – (omega.^2 ./ omega_r5.^2)).^2 + (omega ./ (Q .* omega_r5)).^2)…
.*1 ./ sqrt((1 – (omega.^2 ./ omega_r5.^2)).^2 + (omega ./ (Q .* omega_r5)).^2);
phase_LRTP4 = -atan2(omega./(Q.*omega_r5),1-(omega.^2./omega_r5.^2))-atan2(omega./(Q.*omega_r5),1-(omega.^2./omega_r5.^2));
norm_groupdelay_LRTP4 = 1/(2*pi).*(2 * Q * (omega.^2 ./ omega_r5.^2 + 1)) ./ (Q.^2 .* (omega.^4 ./ omega_r5.^4) + (1 – 2 * Q.^2) .* (omega.^2 ./ omega_r5.^2) + Q.^2);
groupdelay_LRTP4= (2 .* Q .* omega_r5 .* (omega.^2 + omega_r5.^2)) ./ (Q.^2 .* omega.^4 + (1 – 2 .* Q.^2) .* omega_r5.^2 .* omega.^2 + Q.^2 .* omega_r5.^4);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRTP1));
hold on
semilogx(f, 20*log10(magnitude_LRTP2));
semilogx(f, 20*log10(magnitude_LRTP3));
semilogx(f, 20*log10(magnitude_LRTP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRTP’, ‘Interpreter’, ‘latex’);
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRTP1));
hold on
semilogx(f, rad2deg(phase_LRTP2));
semilogx(f, rad2deg(phase_LRTP3));
semilogx(f, rad2deg(phase_LRTP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
semilogx(f, groupdelay_LRTP1);
hold on
semilogx(f, groupdelay_LRTP2);
semilogx(f, groupdelay_LRTP3);
semilogx(f, groupdelay_LRTP4);
grid on;
xlabel(‘$omega$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRTP’, ‘Interpreter’, ‘latex’);
%LRHP1 = LInkwitz Riley Highpass 1
R_2 = 10E3;
R_3 = 20.0164E3;
C_3 = 1/(omega_r1*sqrt(R_2*R_3));
H_hp1 = (Q .* (s ./ omega_r1)) ./ (1 + Q .* ((s ./ omega_r1) + (omega_r1 ./ s)));
H_hp2 = (Q .* (s ./ omega_r1)) ./ (1 + Q .* ((s ./ omega_r1) + (omega_r1 ./ s)));
magnitude_LRHP1 = (Q .* (omega ./ omega_r1)) ./ sqrt(1 + (Q .* ((omega ./ omega_r1) – (omega_r1 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r1)) ./ sqrt(1 + (Q .* ((omega ./ omega_r1) – (omega_r1 ./ omega))).^2);
phase_LRHP1 = -atan2(Q.*omega./omega_r1-Q.*omega_r1./omega,1)+pi./2-atan2(Q.*omega./omega_r1-Q.*omega_r1./omega,1)+pi./2;
norm_groupdelay_LRHP1 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r1).^2 + Q)) ./ ((Q .* (omega ./ omega_r1) – Q ./ (omega ./ omega_r1)).^2 + 1);
groupdelay_LRHP1= (2 .* (Q .* omega_r1 ./ omega.^2 + Q ./ omega_r1)) ./ ((Q .* omega ./ omega_r1 – Q .* omega_r1 ./ omega).^2 + 1);
%LRHP2 = LInkwitz Riley Highpass 2
R_5 = 10E3;
R_6 = 20.0164E3;
C_6 = 1/(omega_r2*sqrt(R_5*R_6));
H_hp3 = (Q .* (s ./ omega_r2)) ./ (1 + Q .* ((s ./ omega_r2) + (omega_r2 ./ s)));
H_hp4 = (Q .* (s ./ omega_r2)) ./ (1 + Q .* ((s ./ omega_r2) + (omega_r2 ./ s)));
magnitude_LRHP2 = (Q .* (omega ./ omega_r2)) ./ sqrt(1 + (Q .* ((omega ./ omega_r2) – (omega_r2 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r2)) ./ sqrt(1 + (Q .* ((omega ./ omega_r2) – (omega_r2 ./ omega))).^2);
phase_LRHP2 = -atan2(Q.*omega./omega_r2-Q.*omega_r2./omega,1)+pi./2-atan2(Q.*omega./omega_r2-Q.*omega_r2./omega,1)+pi./2;
norm_groupdelay_LRHP2 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r2).^2 + Q)) ./ ((Q .* (omega ./ omega_r2) – Q ./ (omega ./ omega_r2)).^2 + 1);
groupdelay_LRHP2= (2 .* (Q .* omega_r2 ./ omega.^2 + Q ./ omega_r2)) ./ ((Q .* omega ./ omega_r2 – Q .* omega_r2 ./ omega).^2 + 1);
%LRHP3 = LInkwitz Riley Highpass 3
R_8 = 10E3;
R_9 = 20.0164E3;
C_9 = 1/(omega_r3*sqrt(R_8*R_9));
H_hp5 = (Q .* (s ./ omega_r3)) ./ (1 + Q .* ((s ./ omega_r3) + (omega_r3 ./ s)));
H_hp6 = (Q .* (s ./ omega_r3)) ./ (1 + Q .* ((s ./ omega_r3) + (omega_r3 ./ s)));
magnitude_LRHP3 = (Q .* (omega ./ omega_r3)) ./ sqrt(1 + (Q .* ((omega ./ omega_r3) – (omega_r3 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r3)) ./ sqrt(1 + (Q .* ((omega ./ omega_r3) – (omega_r3 ./ omega))).^2);
phase_LRHP3 = -atan2(Q.*omega./omega_r3-Q.*omega_r3./omega,1)+pi./2-atan2(Q.*omega./omega_r3-Q.*omega_r3./omega,1)+pi./2;
norm_groupdelay_LRHP3 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r3).^2 + Q)) ./ ((Q .* (omega ./ omega_r3) – Q ./ (omega ./ omega_r3)).^2 + 1);
groupdelay_LRHP3= (2 .* (Q .* omega_r3 ./ omega.^2 + Q ./ omega_r3)) ./ ((Q .* omega ./ omega_r3 – Q .* omega_r3 ./ omega).^2 + 1);
%LRHP4 = LInkwitz Riley Highpass 4
R_11 = 10E3;
R_12 = 20.0164E3;
C_12 = 1/(omega_r4*sqrt(R_11*R_12));
H_hp7 = (Q .* (s ./ omega_r4)) ./ (1 + Q .* ((s ./ omega_r4) + (omega_r4 ./ s)));
H_hp8 = (Q .* (s ./ omega_r4)) ./ (1 + Q .* ((s ./ omega_r4) + (omega_r4 ./ s)));
magnitude_LRHP4 = (Q .* (omega ./ omega_r4)) ./ sqrt(1 + (Q .* ((omega ./ omega_r4) – (omega_r4 ./ omega))).^2)…
.*(Q .* (omega ./ omega_r4)) ./ sqrt(1 + (Q .* ((omega ./ omega_r4) – (omega_r4 ./ omega))).^2);
phase_LRHP4 = -atan2(Q.*omega./omega_r4-Q.*omega_r4./omega,1)+pi./2-atan2(Q.*omega./omega_r4-Q.*omega_r4./omega,1)+pi./2;
norm_groupdelay_LRHP4 = 1/(2*pi) .* (2 .* (Q ./ (omega ./ omega_r4).^2 + Q)) ./ ((Q .* (omega ./ omega_r4) – Q ./ (omega ./ omega_r4)).^2 + 1);
groupdelay_LRHP4= (2 .* (Q .* omega_r4 ./ omega.^2 + Q ./ omega_r4)) ./ ((Q .* omega ./ omega_r4 – Q .* omega_r4 ./ omega).^2 + 1);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRHP1));
hold on
semilogx(f, 20*log10(magnitude_LRHP2));
semilogx(f, 20*log10(magnitude_LRHP3));
semilogx(f, 20*log10(magnitude_LRHP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRHP’, ‘Interpreter’, ‘latex’);
% Plot für die Phase (in Grad)
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRHP1));
hold on
semilogx(f, rad2deg(phase_LRHP2));
semilogx(f, rad2deg(phase_LRHP3));
semilogx(f, rad2deg(phase_LRHP4));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
% Plot für die groupdelay
semilogx(f, groupdelay_LRHP1);
hold on
semilogx(f, groupdelay_LRHP2);
semilogx(f, groupdelay_LRHP3);
semilogx(f, groupdelay_LRHP4);
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRHP’, ‘Interpreter’, ‘latex’);
%LRBP1 = LInkwitz Riley Bandpass 1
magnitude_LRBP1 = magnitude_LRHP1.*magnitude_LRTP1;
phase_LRBP1 = phase_LRHP1+phase_LRTP1;
groupdelay_LRBP1 = groupdelay_LRTP1+groupdelay_LRHP1;
%Same result:
%groupdelay_LRBP1 = -gradient(phase_LRBP1) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 2
magnitude_LRBP2 = magnitude_LRHP2.*magnitude_LRTP2;
phase_LRBP2 = phase_LRHP2+phase_LRTP2;
groupdelay_LRBP2 = groupdelay_LRTP2+groupdelay_LRHP2;
%Same result:
%groupdelay_LRBP2 = -gradient(phase_LRBP2) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 3
magnitude_LRBP3 = magnitude_LRHP3.*magnitude_LRTP3;
phase_LRBP3 = phase_LRHP3+phase_LRTP3;
groupdelay_LRBP3 = groupdelay_LRTP3+groupdelay_LRHP3;
%Same result:
%groupdelay_LRBP3 = -gradient(phase_LRBP3) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass 4
magnitude_LRBP4 = magnitude_LRHP4.*magnitude_LRTP4;
phase_LRBP4 = phase_LRHP4+phase_LRTP4;
groupdelay_LRBP4 = groupdelay_LRTP4+groupdelay_LRHP4;
%Same result:
%groupdelay_LRBP4 = -gradient(phase_LRBP4) ./ gradient(omega);
%LRBP1 = LInkwitz Riley Bandpass_ges
magnitude_LRBP_ges = magnitude_LRBP1+magnitude_LRBP2+magnitude_LRBP3+magnitude_LRBP4;
phase_LRBP_ges = phase_LRBP1+phase_LRBP2+phase_LRBP3+phase_LRBP4;
groupdelay_LRBP_ges = groupdelay_LRTP1+groupdelay_LRHP1+groupdelay_LRTP2+groupdelay_LRHP2…
+groupdelay_LRTP3+groupdelay_LRHP3+groupdelay_LRTP4+groupdelay_LRHP4;
%Same result:
%groupdelay_LRBP_ges = -gradient(phase_LRBP2) ./ gradient(omega);
figure;
subplot(2, 1, 1);
semilogx(f, 20*log10(magnitude_LRBP1));
hold on
semilogx(f, 20*log10(magnitude_LRBP2));
semilogx(f, 20*log10(magnitude_LRBP3));
semilogx(f, 20*log10(magnitude_LRBP4));
semilogx(f, 20*log10(magnitude_LRBP_ges));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Amplitude’);
title(‘LRBP’, ‘Interpreter’, ‘latex’);
% Plot für die Phase (in Grad)
subplot(2, 1, 2);
semilogx(f, rad2deg(phase_LRBP1));
hold on
semilogx(f, rad2deg(phase_LRBP2));
semilogx(f, rad2deg(phase_LRBP3));
semilogx(f, rad2deg(phase_LRBP4));
semilogx(f, rad2deg(phase_LRBP_ges));
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘Phase (Grad)’);
figure;
% Plot für die groupdelay
semilogx(f, groupdelay_LRBP1);
hold on
semilogx(f, groupdelay_LRBP2);
semilogx(f, groupdelay_LRBP3);
semilogx(f, groupdelay_LRBP4);
semilogx(f, groupdelay_LRBP_ges);
grid on;
xlabel(‘$f$’, ‘Interpreter’, ‘latex’);
ylabel(‘groupdelay’);
title(‘LRBP’, ‘Interpreter’, ‘latex’); group delay, higpass, lowpass, bandpass, crossover, groupdelay MATLAB Answers — New Questions