www.gusucode.com > dsp 案例源码程序 matlab代码 > dsp/ImplementAnFIRDecimatorExample.m
%% Implement an FIR Decimator in MATLAB % To implement an FIR Decimator, you must first design it by % using the |designMultirateFIR| function. Specify the decimation factor of % interest (usually greater than 1) and an interpolation factor equal to 1. % You can use the default half-polyphase length of 12 and the default % stopband attenuation of 80 dB. Alternatively, you can also specify the % half-polyphase length and stopband attenuation values. % % Design an FIR decimator with the decimation factor set to 3 and the % half-polyphase length set to 14. % Use the default stopband attenuation of 80 dB. b = designMultirateFIR(1,3,14); %% % Provide the coefficients vector, |b|, as an input to the |dsp.FIRDecimator| % System object(TM). FIRDecim = dsp.FIRDecimator(3,b); fvtool(FIRDecim); %% % By default, the |fvtool| shows the magnitude response. Navigate through % the |fvtool| toolbar to see the phase response, impulse response, % group delay, and other filter analysis information. %% % Filter a noisy sine wave input using the |FIRDecim| object. % The sine wave has frequencies at 1000 Hz and 3000 Hz % 3000 Hz. The noise is a white Gaussian noise with mean zero and % standard deviation 1e-5. The decimated output will have one-third the % sample rate as input. % Initialize two |dsp.SpectrumAnalyzer| System objects, one for the input % and the other for the output. f1 = 1000; f2 = 3000; Fs = 8000; source = dsp.SineWave('Frequency',[f1,f2],'SampleRate',Fs,... 'SamplesPerFrame',1026); specanainput = dsp.SpectrumAnalyzer('SampleRate',Fs,... 'PlotAsTwoSidedSpectrum',false,... 'ShowLegend',true,'YLimits',[-120 30],... 'Title','Noisy Input signal',... 'ChannelNames', {'Noisy Input'}); specanaoutput = dsp.SpectrumAnalyzer('SampleRate',Fs/3,... 'PlotAsTwoSidedSpectrum',false,... 'ShowLegend',true,'YLimits',[-120 30],... 'Title','Filtered output',... 'ChannelNames', {'Filtered output'}); %% % Stream in the input and filter the signal in a processing loop. for Iter = 1:100 input = sum(source(),2); noisyInput = input + (10^-5)*randn(1026,1); output = FIRDecim(noisyInput); specanainput(noisyInput) specanaoutput(output) end %% % The input has two peaks: one at 1000 Hz and the other at 3000 Hz. The % filter has a lowpass response with a passband frequency of 0.3*pi rad/sample. % With a sampling frequency of 8000 Hz, that is a passband frequency % of 1200 Hz. The tone at 1000 Hz is unattenuated, because it falls in the % passband of the filter. The tone at 3000 Hz is filtered out. %% % Similarly, you can design an FIR interpolator and FIR rate % Converter by providing appropriate inputs to the |designMultirateFIR| % function. To implement the filters, pass the designed coefficients to the % |dsp.FIRInterpolator| and |dsp.FIRRateConverter| objects.