www.gusucode.com > dsp 案例源码程序 matlab代码 > dsp/DesignOfDecimatorsInterpolatorsExample.m

    %% Design of Decimators/Interpolators
% This example shows how to design filters for decimation and
% interpolation. Typically lowpass filters are used for decimation and for
% interpolation. When decimating, lowpass filters are used to reduce the
% bandwidth of a signal prior to reducing the sampling rate. This is done
% to minimize aliasing due to the reduction in the sampling rate. When
% interpolating, lowpass filters are used to remove spectral images from
% the low-rate signal. For general notes on lowpass filter design see the
% example on <matlab:web([docroot,'dsp/examples/designing-low-pass-fir-filters.html']);
% Designing Low Pass FIR Filters>.

% Copyright 1999-2014 The MathWorks, Inc.

%% Input signal
% Before we begin, let us define the signal that we will be throughout the
% example. The samples of the signal we will be using are drawn from
% standard normal distribution to have a flat spectrum.
HSource = dsp.SignalSource('SamplesPerFrame', 500);
HSource.Signal = randn(1e6,1);      % Gaussian white noise signal

%% Design of Decimators
% When decimating, the bandwidth of a signal is reduced to an appropriate
% value so that minimal aliasing occurs when reducing the sampling rate.
% Suppose a signal that occupies the full Nyquist interval (i.e. has been
% critically sampled) has a sampling rate of 800 Hz. The signal's energy
% extends up to 400 Hz. If we'd like to reduce the sampling rate by a
% factor of 4 to 200 Hz, significant aliasing will occur unless the
% bandwidth of the signal is also reduced by a factor of 4. Ideally, a
% perfect lowpass filter with a cutoff at 100 Hz would be used. In
% practice, several things will occur: The signal's components between 0
% and 100 Hz will be slightly distorted by the passband ripple of a
% non-ideal lowpass filter; there will be some aliasing due to the finite
% stopband attenuation of the filter; the filter will have a transition
% band which will distort the signal in such band. The amount of distortion
% introduced by each of these effects can be controlled by designing an
% appropriate filter. In general, to obtain a better filter, a higher
% filter order will be required.

%%
% Let's start by designing a simple lowpass decimator with a decimation
% factor of 4.

M   = 4;   % Decimation factor
Fp  = 80;  % Passband-edge frequency
Fst = 100;  % Stopband-edge frequency
Ap  = 0.1; % Passband peak-to-peak ripple
Ast = 80;  % Minimum stopband attenuation
Fs  = 800; % Sampling frequency
HfdDecim = fdesign.decimator(M,'lowpass',Fp,Fst,Ap,Ast,Fs)

%%
% The specifications for the filter determine that a transition band of 20
% Hz is acceptable between 80 and 100 Hz and that the minimum attenuation
% for out of band components is 80 dB. Also that the maximum distortion for
% the components of interest is 0.05 dB (half the peak-to-peak passband
% ripple). An equiripple filter that meets these specs can be easily
% obtained as follows:

HDecim = design(HfdDecim,'equiripple', 'SystemObject', true);
measure(HDecim)

HSpec = dsp.SpectrumAnalyzer(...                    % Spectrum scope
                    'PlotAsTwoSidedSpectrum', false, ... 
                    'SpectralAverages', 50, 'OverlapPercent', 50, ...
                    'Title', 'Decimator with equiripple lowpass filter',...
                    'YLimits', [-50, 0], 'SampleRate', Fs/M*2); 
                
while ~isDone(HSource)
    inputSig = HSource();   % Input
    decimatedSig = HDecim(inputSig);  % Decimator
    HSpec(upsample(decimatedSig,2));  % Spectrum
    % The upsampling is done to increase X-limits of SpectrumAnalyzer
    % beyond (1/M)*Fs/2 for better visualization
end
release(HSpec);
reset(HSource);

%%
% It is clear from the measurements that the design meets the specs.

%% Using Nyquist Filters
% Nyquist filters are attractive for decimation and interpolation due to
% the fact that a 1/M fraction of the number of coefficients is zero. The
% band of the Nyquist filter is typically set to be equal to the decimation
% factor, this centers the cutoff frequency at (1/M)*Fs/2. In this example,
% the transition band is centered around (1/4)*400 = 100 Hz.

TW = 20; % Transition width of 20 Hz
HfdNyqDecim = fdesign.decimator(M,'nyquist',M,TW,Ast,Fs)

%% 
% A Kaiser window design can be obtained in a straightforward manner.
HNyqDecim = design(HfdNyqDecim,'kaiserwin','SystemObject', true);

HSpec2 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ... 
                          'SpectralAverages', 50, 'OverlapPercent', 50, ...
                          'Title', 'Decimator with Nyquist filter',...
                          'YLimits', [-50, 0],...
                          'SampleRate', Fs/M*2);       % Spectrum scope
while ~isDone(HSource)
    inputSig = HSource();   % Input
    decimatedSig = HNyqDecim(inputSig);   % Decimator
    HSpec2(upsample(decimatedSig,2));  % Spectrum
    % The upsampling is done to increase X-limits of SpectrumAnalyzer
    % beyond (1/M)*Fs/2 for better visualization
end
release(HSpec2);
reset(HSource);

%% Aliasing with Nyquist Filters
% Suppose the signal to be filtered has a flat spectrum. Once filtered, it
% acquires the spectral shape of the filter. After reducing the sampling
% rate, this spectrum is repeated with replicas centered around multiples
% of the new lower sampling frequency. An illustration of the spectrum of
% the decimated signal can be found from:

NFFT = 4096;
[H,f] = freqz(HNyqDecim,NFFT,'whole',Fs);
figure;
plot(f-Fs/2,20*log10(abs(fftshift(H))))
grid on
hold on
plot(f-Fs/M,20*log10(abs(fftshift(H))),'r-')
plot(f-Fs/2-Fs/M,20*log10(abs(fftshift(H))),'k-')
legend('Baseband spectrum', ...
    'First positive replica', 'First negative replica')
title('Alisasing with Nyquist filter');
fig = gcf;
fig.Color = 'White';
hold off

%%
% Note that the replicas overlap somewhat, so aliasing is introduced.
% However, the aliasing only occurs in the transition band. That is,
% significant energy (above the prescribed 80 dB) from the first replica
% only aliases into the baseband between 90 and 100 Hz. Since the filter
% was transitioning in this region anyway, the signal has been distorted in
% that band and aliasing there is not important.

%%
% On the other hand, notice that although we have used the same transition
% width as with the lowpass design from above, we actually retain a wider
% usable band (90 Hz rather than 80) when comparing this Nyquist design
% with the original lowpass design. To illustrate this, let's follow the
% same procedure to plot the spectrum of the decimated signal when
% the lowpass design from above is used

[H,f] = freqz(HDecim,NFFT,'whole',Fs);
figure;
plot(f-Fs/2,20*log10(abs(fftshift(H))))
grid on
hold on
plot(f-Fs/M,20*log10(abs(fftshift(H))),'r-')
plot(f-Fs/2-Fs/M,20*log10(abs(fftshift(H))),'k-')
legend('Baseband spectrum', ...
    'First positive replica', 'First negative replica')
title('Alisasing with lowpass filter');
fig = gcf;
fig.Color = 'White';
hold off

%%
% In this case, there is no significant overlap (above 80 dB) between
% replicas, however because the transition region started at 80 Hz, the
% resulting decimated signal has a smaller usable bandwidth.

%% Decimating by 2: Halfband Filters
% When the decimation factor is 2, the Nyquist filter becomes a halfband
% filter. These filters are very attractive because just about half of
% their coefficients are equal to zero. Often, to design Nyquist filters
% when the band is an even number, it is desirable to perform a multistage
% design that uses halfband filters in some/all of the stages.

HfdHBDecim = fdesign.decimator(2,'halfband');
HHBDecim = design(HfdHBDecim,'equiripple','SystemObject', true);
HSpec3 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ... 
                          'SpectralAverages', 50, 'OverlapPercent', 50, ...
                          'Title', 'Decimator with halfband filter',...
                          'YLimits', [-50, 0],...
                          'SampleRate', Fs);         % Spectrum scope
while ~isDone(HSource)
    inputSig = HSource();   % Input
    decimatedSig = HHBDecim(inputSig);   % Decimator
    HSpec3(upsample(decimatedSig,2));  % Spectrum
end
release(HSpec3);
reset(HSource);

%%
% As with other Nyquist filters, when halfbands are used for decimation,
% aliasing will occur only in the transition region.

%% Interpolation
% When interpolating a signal, the baseband response of the signal should
% be left as unaltered as possible. Interpolation is obtained by
% removing spectral replicas when the sampling rate is increased.

%%
% Suppose we have a signal sampled at 48 Hz. If it is critically sampled,
% there is significant energy in the signal up to 24 Hz. If we want to
% interpolate by a factor of 4, we would ideally design a lowpass filter
% running at 192 Hz with a cutoff at 24 Hz. As with decimation, in practice
% an acceptable transition width needs to be incorporated into the design
% of the lowpass filter used for interpolation along with passband ripple
% and a finite stopband attenuation. For example, consider the following
% specs:

L   = 4;   % Interpolation factor
Fp  = 22;  % Passband-edge frequency
Fst = 24;  % Stopband-edge frequency
Ap  = 0.1; % Passband peak-to-peak ripple
Ast = 80;  % Minimum stopband attenuation
Fs  = 48;  % Sampling frequency
HfdInterp = fdesign.interpolator(L,'lowpass',Fp,Fst,Ap,Ast,Fs*L)

%%
% An equiripple design that meets the specs can be found in the same manner
% as with decimators

HInterp = design(HfdInterp,'equiripple','SystemObject', true);

HSpec4 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ... 
                 'SpectralAverages', 50, 'OverlapPercent', 50, ...
                 'Title', 'Interpolator with equiripple lowpass filter',...
                 'SampleRate', Fs*L);         % Spectrum scope
while ~isDone(HSource)
    inputSig = HSource();   % Input
    interpSig = HInterp(inputSig);   % Interpolator
    HSpec4(interpSig);  % Spectrum
end
release(HSpec4);
reset(HSource);

%%
% Notice that the filter has a gain of 6 dBm. In general interpolators will
% have a gain equal to the interpolation factor. This is needed for the
% signal being interpolated to maintain the same range after interpolation.
% For example,
release(HInterp);
HSin = dsp.SineWave('Frequency', 18, 'SampleRate', Fs, ...
                    'SamplesPerFrame', 100);
interpSig = HInterp(HSin());
HPlot = dsp.ArrayPlot('YLimits', [-2, 2], ...
                      'Title', 'Sine wave interpolated');
HPlot(interpSig(200:300)) % Plot the output

%%
% Note that although the filter has a gain of 4, the interpolated signal
% has the same amplitude as the original signal.

%% Use of Nyquist Filters for Interpolation
% Similar to the decimation case, Nyquist filters are attractive for
% interpolation purposes. Moreover, given that there is a coefficient equal
% to zero every L samples, the use of Nyquist filters ensures that the
% samples from the input signal are retained unaltered at the output. This
% is not the case for other lowpass filters when used for interpolation (on
% the other hand, distortion may be minimal in other filters, so this is
% not necessarily a huge deal).

TW = 2;
HfdNyqInterp = fdesign.interpolator(L,'nyquist',L,TW,Ast,Fs*L)
HNyqInterp = design(HfdNyqInterp,'kaiserwin', 'SystemObject', true);

HSpec5 = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum', false, ... 
                          'SpectralAverages', 30, 'OverlapPercent', 50, ...
                          'Title', 'Interpolator with Nyquist filter',...
                          'SampleRate', Fs*L);         % Spectrum scope
while ~isDone(HSource)
    inputSig = HSource();   % Input
    interpSig = HNyqInterp(inputSig);   % Decimator
    HSpec5(interpSig);  % Spectrum
end
release(HSpec5);
reset(HSource);

%%
% In an analogous manner to decimation, when used for interpolation,
% Nyquist filters allow some degree of imaging. That is, some frequencies
% above the cutoff frequency are not attenuated by the value of Ast.
% However, this occurs only in the transition band of the filter. On the
% other hand, once again a wider portion of the baseband of the original
% signal is maintained intact when compared to a lowpass filter with
% stopband-edge at the ideal cutoff frequency when both filters have the
% same transition width.