%% Filter Frames of a Noisy Sine Wave Signal in MATLAB
% This example shows how to lowpass filter a noisy signal in MATLAB and visualize 
% the original and filtered signals using a spectrum analyzer. For a Simulink 
% version of this example, see <docid:dsp_ug#buiuzvj-3 Filter Frames of a
% Noisy Sine Wave Signal in Simulink>.
%% Specify Signal Source
% The input signal is the sum of two sine waves with frequencies of 1 kHz and 
% 10 kHz. The sampling frequency is 44.1 kHz. 

Sine1 = dsp.SineWave('Frequency',1e3,'SampleRate',44.1e3);
Sine2 = dsp.SineWave('Frequency',10e3,'SampleRate',44.1e3);
%% Create Lowpass Filter
% The lowpass FIR filter, |dsp.LowpassFilter|, designs a minimum-order FIR lowpass 
% filter using the generalized Remez FIR filter design algorithm. Set the passband 
% frequency to 5000 Hz and the stopband frequency to 8000 Hz. The passband ripple 
% is 0.1 dB and the stopband attenuation is 80 dB.
%%
FIRLowPass = dsp.LowpassFilter('PassbandFrequency',5000,...
    'StopbandFrequency',8000);
%% Create Spectrum Analyzer
% Set up the spectrum analyzer to compare the power spectra of the original 
% and filtered signals. The spectrum units are dBm.
%%
SpecAna = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum',false, ...
    'SampleRate',Sine1.SampleRate, ...
    'NumInputPorts',2,...
    'ShowLegend',true, ...
    'YLimits',[-145,45]);

SpecAna.ChannelNames = {'Original noisy signal','Low pass filtered signal'};
%% Specify Samples per Frame
% This example uses frame-based processing, where data is processed one frame 
% at a time. Each frame of data contains sequential samples from an independent 
% channel. Frame-based processing is advantageous for many signal processing applications 
% because you can process multiple samples at once. By buffering your data into 
% frames and processing multisample frames of data, you can improve the computational 
% time of your signal processing algorithms. Set the number of samples per frame 
% to 4000. 
%%
Sine1.SamplesPerFrame = 4000;
Sine2.SamplesPerFrame = 4000;
%% Filter the Noisy Sine Wave Signal
% Add zero-mean white Gaussian noise with a standard deviation of 0.1 to the 
% sum of sine waves. Filter the result using the FIR filter. While running the 
% simulation, the spectrum analyzer shows that frequencies above 8000 Hz in the 
% source signal are attenuated. The resulting signal maintains the peak at 1 kHz 
% because it falls in the passband of the lowpass filter.
%%
for i = 1 : 1000
    x = Sine1()+Sine2()+0.1.*randn(Sine1.SamplesPerFrame,1);
    y = FIRLowPass(x);    
    SpecAna(x,y);                              
end
release(SpecAna)

%% 
% Copyright 2012 The MathWorks, Inc.