This example shows how to design filters given customized magnitude and phase specifications. Custom magnitude and phase design specifications are used for the equalization of magnitude and phase distortions found in data transmission systems (channel equalization) or in oversampled ADC (compensation for non-ideal hardware characteristics for example). These techniques also allow for the design of filters that have smaller group delays than linear phase filters and less distortion than minimum-phase filters for a given order.
In this first example, we compare several FIR design techniques to model the magnitude and phase of a complex RF bandpass filter defined on the complete Nyquist range (there is no relaxed or "don't care" regions).
load cpxbp.mat f = fdesign.arbmagnphase('N,F,H',100,F1,H1); Hd = design(f,'allfir'); hfvt = fvtool(Hd, 'Color','w'); legend(hfvt,'Equiripple', 'FIR Least-Squares','Frequency Sampling', ... 'Location', 'NorthEast') hfvt(2) = fvtool(Hd,'Analysis','phase','Color','white'); legend(hfvt(2),'Equiripple', 'FIR Least-Squares','Frequency Sampling') ax = hfvt(2).CurrentAxes; ax.NextPlot = 'add'; pidx = find(F1>=0); plot(ax,F1,[fliplr(unwrap(angle(H1(pidx-1:-1:1)))) ... % Mask unwrap(angle(H1(pidx:end)))],'k--')
Next, we design a highpass IIR filter with approximately linear passband phase. Caution must be employed when using this IIR design technique since the stability of the filter is not guaranteed.
F = [linspace(0,.475,50) linspace(.525,1,50)]; H = [zeros(1,50) exp(-1j*pi*13*F(51:100))]; f = fdesign.arbmagnphase('Nb,Na,F,H',12,10,F,H); W = [ones(1,50) 100*ones(1,50)]; Hd = design(f,'iirls','Weights',W); isstable(Hd)
ans = logical 1
close(hfvt(1)); close(hfvt(2)); hfvt = fvtool(Hd, 'Color','w'); legend(hfvt,'IIR Least-Squares','Location', 'NorthWest') hfvt(2) = fvtool(Hd,'Analysis','phase','Color','white'); legend(hfvt(2),'IIR Least-Squares','Location', 'NorthEast')
It is sometimes interesting to give up the exact linearity of the phase in order to reduce the delay of the filter while maintaining a good approximation of the phase linearity in the passband. Let's define the 3 bands of the bandpass filter:
F1 = linspace(0,.25,30); % Lower stopband F2 = linspace(.3,.56,40); % Passband F3 = linspace(.62,1,30); % Higher stopband N = 50; % Filter Order gd = 12; % Desired Group Delay H1 = zeros(size(F1)); H2 = exp(-1j*pi*gd*F2); H3 = zeros(size(F3)); f = fdesign.arbmagnphase('N,B,F,H',N,3,F1,H1,F2,H2,F3,H3); Hd = design(f,'equiripple');
Comparing with a linear phase design, we see that the group delay is reduced by half while the phase response remains approximately linear in the passband.
f = fdesign.arbmag('N,B,F,A',N,3,F1,abs(H1),F2,abs(H2),F3,abs(H3)); Hd(2) = design(f,'equiripple'); close(hfvt(1)); close(hfvt(2)); hfvt = fvtool(Hd, 'Color', 'w'); legend(hfvt,'Low Group Delay', 'Linear Phase', 'Location', 'NorthEast') hfvt(2) = fvtool(Hd,'Analysis','grpdelay','Color','w'); legend(hfvt(2),'Low Group Delay', 'Linear Phase', 'Location', 'NorthEast') axis([.3 .56 0 35])
hfvt(2).Analysis = 'phase'; hfvt(2).Color = 'w'; axis([.3 .56 -30 10])
A common problem is to compensate for nonlinear-phase responses of IIR filters. In this example we will work with a 3rd order Chebyshev Type I lowpass filter with a normalized passband frequency of 1/16 and .5 dB of passband ripples.
Fp = 1/16; % Passband frequency Ap = .5; % Passband ripples f = fdesign.lowpass('N,Fp,Ap',3,Fp,Ap); Hcheby = design(f,'cheby1'); close(hfvt(1)); close(hfvt(2)); hfvt = fvtool(Hcheby,'Color','w'); legend(hfvt, 'Chebyshev Lowpass'); hfvt(2) = fvtool(Hcheby,'Color','w','Analysis','grpdelay'); legend(hfvt(2), 'Chebyshev Lowpass');
Design of a 2-band digital FIR equalizer. We choose a 2-band approach because we want to concentrate our efforts in the passband. We are aiming at a flat group delay of 35 samples in the passband.
Gd = 35; % Passband Group Delay of the equalized filter (linear phase) F1 = 0:5e-4:Fp; % Passband D1 = exp(-1j*Gd*pi*F1)./freqz(Hcheby,F1*pi); Fst = 3/16; % Stopband F2 = linspace(Fst,1,100); D2 = zeros(1,length(F2)); f = fdesign.arbmagnphase('N,B,F,H',51,2,F1,D1,F2,D2); Hfirls = design(f,'firls'); % Least-Squares design Heqrip = design(f,'equiripple'); % Equiripple design
Magnitude Equalization
The passband ripples are attenuated after equalization from .5 dB to .27dB for the least-squares equalizer and .16 dB for the equiripple equalizer.
close(hfvt(1)); close(hfvt(2)); hfvt = fvtool(Hcheby,cascade(Hcheby,Hfirls),cascade(Hcheby,Heqrip), ... 'Color','w'); legend(hfvt,'Chebyshev Lowpass','Least-Squares Equalization (cascade)', ... 'Equiripple Equalization (cascade)', 'Location', 'NorthEast') hfvt(2) = fvtool(Hcheby,cascade(Hcheby,Hfirls),cascade(Hcheby,Heqrip), ... 'Color','w'); legend(hfvt(2),'Chebyshev Lowpass', ... 'Least-Squares Equalization (cascade)', ... 'Equiripple Equalization (cascade)', 'Location', 'NorthEast') axis([0 .1 -.8 .5])
Phase (Group Delay) Equalization
The group delay in the passband was equalized from a peak to peak difference of 8.8 samples to .51 samples with the least-squares equalizer and .62 samples with the equiripple equalizer.
hfvt(2).Analysis = 'grpdelay'; axis([0 1 0 40]) hfvt(3) = fvtool(Hcheby,cascade(Hcheby,Hfirls),cascade(Hcheby,Heqrip), ... 'Analysis', 'grpdelay','Color','w'); legend(hfvt(3),'Chebyshev Lowpass', ... 'Least-Squares Equalization (cascade)', ... 'Equiripple Equalization (cascade)', 'Location', 'NorthEast') axis([0 Fp 34 36])
close(hfvt(1)); close(hfvt(2)); close(hfvt(3));