CIC filter gain

`gain(hm)`

gain(hm,j)

gain(hs)

`gain(hm)`

returns the gain
of `hm`

, the CIC decimation or interpolation filter.

When `hm`

is a decimator, `gain`

returns
the gain for the overall CIC decimator.

When `hm`

is an interpolator, the CIC interpolator
inserts zeros into the input data stream, reducing the filter overall
gain by 1/*R*, where *R* is the
interpolation factor, to account for the added zero valued samples.
Therefore, the gain of a CIC interpolator is (*RM*)* ^{N}*/

`gain(hm)`

returns
this value. The next example presents this case.`gain(hm,j)`

returns the gain
of the `j`

th section of a CIC interpolation filter.
When you omit `j`

, `gain`

assumes
that `j`

is 2*N, where *N* is the
number of sections, and returns the gain of the last section of the
filter. This syntax does not apply when `hm`

is a
decimator.

`gain(hs)`

returns the gain
of the filter System object™ `hs`

. The function
supports the `dsp.CICDecimator`

and `dsp.CICInterpolator`

filter
structures.

To compare the performance of two interpolators, one a CIC filter
and the other an FIR filter, use gain to adjust the CIC filter output
amplitude to match the FIR filter output amplitude. Start by creating
an input data set—a sinusoidal signal `x`

.

fs = 1000; % Input sampling frequency. t = 0:1/fs:1.5; % Signal length = 1501 samples. x = sin(2*pi*10*t); % Amplitude = 1 sinusoid. l = 4; % Interpolation factor for FIR filter. d = fdesign.interpolator(l); hm = design(d,'multistage'); ym = filter(hm,x); r = 4; % Interpolation factor for the CIC filter. d = fdesign.interpolator(r,'cic'); hcic = design(d,'multisection'); ycic = filter(hcic,x); gaincic = gain(hcic); subplot(211); plot(1:length(ym),[ym; double(ycic)]); subplot(212) plot(1:length(ym),[ym; double(ycic)/gain(hcic)]);

After correcting for the gain induced by the CIC interpolator, the figure shows the filters provide nearly identical interpolation.

Was this topic helpful?