Main Content

FIR Nyquist (L-th band) Filter Design

This example shows how to design lowpass FIR Nyquist filters. It also compares these filters with raised cosine and square root raised cosine filters. These filters are widely used in pulse-shaping for digital transmission systems. They also find application in interpolation/decimation and filter banks.

Magnitude Response Comparison

The plot shows the magnitude response of an equiripple Nyquist filter and a raised cosine filter. Both filters have an order of 60 and a rolloff-factor of 0.5. Because the equiripple filter has an optimal equiripple stopband, it has a larger stopband attenuation for the same filter order and transition width. The raised-cosine filter is obtained by truncating the analytical impulse response and it is not optimal in any sense.

NBand = 4;
N = 60;           % Filter order
R = 0.5;          % Rolloff factor
TW = R/(NBand/2); % Transition Bandwidth 
f1 = fdesign.nyquist(NBand,'N,TW',N,TW);
eq = design(f1,'equiripple',Zerophase=true,SystemObject=true);
coeffs = rcosdesign(R,N/NBand,NBand,'normal');
coeffs = coeffs/max(abs(coeffs))/NBand;
rc     = dsp.FIRFilter(Numerator=coeffs);
fvt = fvtool(eq,rc);
legend(fvt,'Equiripple NYQUIST design','Raised Cosine design');

{"String":"Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Equiripple NYQUIST design, Raised Cosine design.","Tex":"Magnitude Response (dB)","LaTex":[]}

In fact, in this example it is necessary to increase the order of the raised-cosine design to about 1400 in order to attain similar attenuation.

Impulse Response Comparison

Here we compare the impulse responses. Notice that the impulse response in both cases is zero every 4th sample (except for the middle sample). Nyquist filters are also known as L-th band filters, because the cutoff frequency is πL and the impulse response is zero every L-th sample. In this case, we have 4th band filters.

f1.FilterOrder = 38;
eq1 = design(f1,'equiripple',Zerophase=true,SystemObject=true);
coeffs = rcosdesign(R,f1.FilterOrder/NBand,NBand,'normal');
coeffs = coeffs/max(abs(coeffs))/NBand;
rc1 = dsp.FIRFilter(Numerator=coeffs);
fvt = fvtool(eq1,rc1,Analysis='Impulse');
legend(fvt,'Equiripple NYQUIST','Raised Cosine');

{"String":"Figure Figure 2: Impulse Response contains an axes object. The axes object with title Impulse Response contains 2 objects of type stem. These objects represent Equiripple NYQUIST, Raised Cosine.","Tex":"Impulse Response","LaTex":[]}

Nyquist Filters with a Sloped Stopband

Equiripple designs allow for control of the slope of the stopband of the filter. For example, the following designs have slopes of 0, 20, and 40 dB/(rad/sample)of attenuation:

f1.FilterOrder = 52;
f1.Band = 8;
f1.TransitionWidth = .05;
eq1 = design(f1,'equiripple', SystemObject=true);
eq2 = design(f1,'equiripple', StopbandShape='linear', StopbandDecay=20,SystemObject=true);
eq3 = design(f1,'equiripple', StopbandShape='linear', StopbandDecay=40,SystemObject=true);
fvt = fvtool(eq1,eq2,eq3);
legend(fvt,'Slope=0', 'Slope=20', 'Slope=40')

{"String":"Figure Figure 3: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 4 objects of type line. These objects represent Slope=0, Slope=20, Slope=40.","Tex":"Magnitude Response (dB)","LaTex":[]}

Minimum-Phase Design

We can design a minimum-phase spectral factor of the overall Nyquist filter (a square-root in the frequency domain). This spectral factor can be used in a similar manner to the square-root raised-cosine filter in matched filtering applications. A square-root of the filter is placed on the transmitter's end and the other square root is placed at the receiver's end.

f1.FilterOrder = 30;
f1.Band = NBand;
f1.TransitionWidth = TW;
eq1 = design(f1,'equiripple', Minphase=true, SystemObject=true);
coeffs = rcosdesign(R,N/NBand,NBand);
coeffs = coeffs / max(coeffs) * (-1/(pi*NBand) * (pi*(R-1) - 4*R));
srrc   = dsp.FIRFilter(Numerator=coeffs);
fvt = fvtool(eq1,srrc);
legend(fvt,'Minimum-phase equiripple design',...
    'Square-root raised-cosine design');

{"String":"Figure Figure 4: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Minimum-phase equiripple design, Square-root raised-cosine design.","Tex":"Magnitude Response (dB)","LaTex":[]}

Decreasing the Rolloff Factor

The response of the raised-cosine filter improves as the rolloff factor decreases (shown here for rolloff = 0.2). This is because of the narrow main lobe of the frequency response of a rectangular window that is used in the truncation of the impulse response.

f1.FilterOrder = N;
f1.TransitionWidth = .1;
eq1 = design(f1,'equiripple', Zerophase=true, SystemObject=true);
R = 0.2;
coeffs = rcosdesign(R,N/NBand,NBand,'normal');
coeffs = coeffs/max(abs(coeffs))/NBand;
rc1   = dsp.FIRFilter(Numerator=coeffs);
fvt = fvtool(eq1,rc1);
legend(fvt,'NYQUIST equiripple design','Raised Cosine design');

{"String":"Figure Figure 5: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 2 objects of type line. These objects represent NYQUIST equiripple design, Raised Cosine design.","Tex":"Magnitude Response (dB)","LaTex":[]}

Windowed-Impulse-Response Nyquist Design

Nyquist filters can also be designed using the truncated-and-windowed impulse response method. This can be another alternative to the raised-cosine design. For example we can use the Kaiser window method to design a filter that meets the initial specs:

f1.TransitionWidth = TW;
kaiserFilt = design(f1, 'kaiserwin', SystemObject=true);

The Kaiser window design requires the same order (60) as the equiripple design to meet the specs. In contrast, we required an extraordinary 1400th-order raised-cosine filter to meet the stopband spec.

fvt = fvtool(eq,rc,kaiserFilt);
legend(fvt,'Equiripple design', 'Raised Cosine design', 'Kaiser window design');

{"String":"Figure Figure 6: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 3 objects of type line. These objects represent Equiripple design, Raised Cosine design, Kaiser window design.","Tex":"Magnitude Response (dB)","LaTex":[]}

Nyquist Filters for Interpolation

Besides digital data transmission, Nyquist filters are attractive for interpolation purposes. The reason is that every L samples you have a zero sample (except for the middle sample) as mentioned before. There are two advantages to this, both are obvious by looking at the polyphase representation.

fm = fdesign.interpolator(4,'nyquist');
kaiserFilt = design(fm,'kaiserwin',SystemObject=true);
fvt = fvtool(kaiserFilt);
fvt.PolyphaseView = 'on';

{"String":"Figure Figure 7: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains 4 objects of type line.","Tex":"Magnitude Response (dB)","LaTex":[]}

The polyphase subfilter #4 is an allpass filter, and in fact, it is a pure delay. To verify that, select impulse response or view the filter coefficients in FVTool. That pure delay branch of the polyphase filter has the following characteristics:

  • All of its coefficients are zero except for one, leading to an efficient implementation of that polyphase branch.

  • The interpolation filter preserves the input samples values, i.e. y(Lk)=u(k), even though the filter is not ideal.

Related Topics