Documentation Center

  • Trials
  • Product Updates

Multistage Design Of Decimators/Interpolators

This example shows how to design multistage decimators and interpolators. The example Efficient Narrow Transition-Band FIR Filter Design showed how to apply the IFIR and the MULTISTAGE approaches to single-rate designs of lowpass filters. The techniques can be extended to the design of multistage decimators and/or interpolators. The IFIR approach results in a 2-stage decimator/interpolator. For the MULTISTAGE approach, the number of stages can be either automatically optimized or manually controlled.

Reducing the Sampling-Rate of a Signal

Decimators are used to reduce the sampling-rate of a signal while simultaneously reducing the bandwidth proportionally. For example, if the rate is to be reduced by a factor of 8, the following are typical specifications for a lowpass filter that will reduce the bandwidth accordingly.

Fpass = 0.11;
Fstop = 0.12;
Apass = 0.02;  % 0.02 dB peak-to-peak ripple
Astop = 60;    % 60 dB minimum attenuation
M     = 8;     % Decimation factor of 8
Hfd   = fdesign.decimator(M,'lowpass',Fpass,Fstop,Apass,Astop);

A single-stage equiripple design for these specifications requires on average 649/8 = 81.125 multiplications per input sample (MPIS):

Hm = design(Hfd,'equiripple');
ans =
Number of Multipliers            : 650   
Number of Adders                 : 649   
Number of States                 : 648   
Multiplications per Input Sample : 81.25 
Additions per Input Sample       : 81.125

As we mentioned, an IFIR design results in a two stage implementation. Notice that in this case only 27/4+172/8 = 28.25 MPIS are required.

Hm_ifir = design(Hfd,'ifir');
ans =
Number of Multipliers            : 199   
Number of Adders                 : 197   
Number of States                 : 194   
Multiplications per Input Sample : 28.25 
Additions per Input Sample       : 27.875

A multistage design results in approximately the same cost when implementing the design with 3 stages. The number of MPIS required for this design is 9/2+14/4+172/8 = 29.5

Hm_multi = design(Hfd,'multistage');
ans =
Number of Multipliers            : 195   
Number of Adders                 : 192   
Number of States                 : 190   
Multiplications per Input Sample : 29.5  
Additions per Input Sample       : 28.625

Tweaking Designs for Improved Efficiency

The IFIR design has a joint optimization option that can improve the efficiency of the design even further (although it may not converge in some cases). Note that this design may take a long time. The number of MPIS is reduced to 13/4+163/8 = 23.625

Hm_ifir_jo = design(Hfd,'ifir','JointOptimization',true);
ans =
Number of Multipliers            : 176   
Number of Adders                 : 174   
Number of States                 : 174   
Multiplications per Input Sample : 23.625
Additions per Input Sample       : 23.25 

The multistage design can also be improved by noticing that the decimators used involve a decimation factor of 2. Two of three stages can be replaced with halfband filters, for which only about half of the coefficients are non-zero. The number of MPIS is reduced to 27.25.

Hm_multi_hb = design(Hfd,'multistage','UseHalfbands',true);
ans =
Number of Multipliers            : 188   
Number of Adders                 : 185   
Number of States                 : 194   
Multiplications per Input Sample : 27.25 
Additions per Input Sample       : 26.375

Using Nyquist Filters for Improved Efficiency

When decimating by a factor M, it is often computationally advantageous to use Nyquist designs (Where the band is also M). In this example, we have M = 8.

TW      = 0.01; % Transition width is the same as in previous design
Astop   = 60;   % 60 dB minimum attenuation
M       = 8;    % Decimation factor of 8
Hfd_nyq = fdesign.decimator(M,'nyquist',M,TW,Astop);

A single-stage design using a Kaiser window results in a filter length of 727. However, given that it is a Nyquist filter, about one out of every M coefficients is zero, so the actual number of multipliers is 637 so the number of MPIS is 79.625 which is less than the single-stage equripple design for the same transition width and stopband attenuation. Moreover, the passband ripple is smaller.

Hm_nyq = design(Hfd_nyq,'kaiserwin');
ans =
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.11                      
3-dB Point       : 0.11379                   
6-dB Point       : 0.11496                   
Stopband Edge    : 0.12                      
Passband Ripple  : 0.019632 dB               
Stopband Atten.  : 60.0576 dB                
Transition Width : 0.01                      
ans =
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.12                      
3-dB Point       : 0.12384                   
6-dB Point       : 0.125                     
Stopband Edge    : 0.13                      
Passband Ripple  : 0.01648 dB                
Stopband Atten.  : 60.1578 dB                
Transition Width : 0.01                      
ans =
Number of Multipliers            : 637   
Number of Adders                 : 636   
Number of States                 : 720   
Multiplications per Input Sample : 79.625
Additions per Input Sample       : 79.5  

Halfband filters are a special case of Nyquist filters when the band is equal to two. One way to obtain an 8th-band Nyquist filter that decimates by 8 is to cascade three halfbands, each of which decimates by two. Multistage designs will do this automatically when the cost is found to be minimal. Given that only about half the coefficients are non-zero the number of MPIS required in this case is only 15.375, the lowest by far of all designs tried.

Hm_multi_nyq = design(Hfd_nyq,'multistage');
ans =
Number of Multipliers            : 99    
Number of Adders                 : 96    
Number of States                 : 186   
Multiplications per Input Sample : 15.375
Additions per Input Sample       : 14.5  
hfvt = fvtool(Hm_nyq,Hm_multi_nyq, 'Color', 'white');
legend(hfvt,'Single-stage Nyquist design','Multistage Nyquist design',...


The cases shown above apply equally to the design ofinterpolators. For example:

Fpass = 0.11;
Fstop = 0.12;
Astop = 60;    % 60 dB minimum attenuation
L     = 8;     % Interpolation factor of 8
Hfi   = fdesign.interpolator(L,'lowpass',Fpass,Fstop,Apass,Astop);

A multistage design that uses halfbands can be computed with identical syntax as before:

Hmi = design(Hfi,'multistage','UseHalfbands',true);
ans =
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.11                      
3-dB Point       : 0.114                     
6-dB Point       : 0.11515                   
Stopband Edge    : 0.12                      
Passband Ripple  : 0.012937 dB               
Stopband Atten.  : 60.053 dB                 
Transition Width : 0.01                      

Notice that as with all interpolators, the passband gain (in linear units) is equal to the interpolation factor. The minimum distance (in dB) between the passband and the stopband is about 60 dB as specified by Astop.


The use of multistage techniques can provide significant computational savings when implementing decimators/interpolators. In particular, the use of multistage Nyquist filters can be extremely efficient.

Was this topic helpful?