%% Compare Performance of Interpolation Filters
% To compare the performance of two interpolators, one a CIC filter and the other an FIR filter, use the gain function 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.
x = x';

% Design a cascade of two dsp.FIRInterpolator objects with an overall interpolation factor of 4.

l = 4; % Interpolation factor for FIR filter.
d = fdesign.interpolator(l);
firInterp = design(d,'multistage','SystemObject',true);

% Run the data through the interpolator.

yfir = firInterp(x);

%
% Design a dsp.CICInterpolator object with an interpolation factor set 4, differential delay set to 1, and the number of sections set to 4.

r = 4; % Interpolation factor for the CIC filter.
d = fdesign.interpolator(r,'cic');
cicInterp = design(d,'multisection','SystemObject',true);

% Run the same data through the filter.

ycic = cicInterp(x);

%  Use the gain function to adjust the CIC filter output amplitude to match the FIR filter output amplitude.

gaincic = gain(cicInterp);
subplot(211);
plot([yfir; double(ycic)]);
subplot(212)
plot([yfir; double(ycic)/gain(cicInterp)]);

% After correcting for the gain induced by the CIC interpolator, in the second subplot you can see that the FIR filter and the CIC filter provide nearly identical interpolation.
%
% This gain equals the gain of the last section of the CIC filter. To confirm, correct the FIR filter amplitude using gain(\textrm{cicInterp},2N). If N is the number of integrator and comb sections of the CIC filter, then 2N is the last section of the CIC filter. N is given by cicInterp.NumSections.
% The second subplot shows that the FIR filter and CIC filter provide nearly identical interpolation when the correction gain equals the gain of the last section of the CIC filter.

subplot(212);
plot([yfir; double(ycic)/gain(cicInterp,2*cicInterp.NumSections)]);

% Copyright 2012 The MathWorks, Inc.