Main Content

Streaming Signal Statistics

This example shows how to perform statistical measurements on an input data stream using DSP System Toolbox™ functionality available at the MATLAB® command line. Compute the signal statistics minimum, maximum, mean, variance and peak-to-RMS and the signal power spectrum density and plot them.

Introduction

This example computes signal statistics using DSP System Toolbox System objects. These objects handle their states automatically reducing the amount of hand code needed to update states reducing the possible chance of coding errors.

These System objects pre-compute many values used in the processing. This is very useful when you are processing signals of same properties in a loop. For example, in computing an FFT in a spectrum estimation application, the values of sine and cosine can be computed and stored once you know the properties of the input and these values can be reused for subsequent calls. Also the objects check only whether the input properties are of same type as previous inputs in each call.

Initialization

Here you initialize some of the variables used in the code and instantiate the System objects used in your processing. These objects also pre-compute any necessary variables or tables resulting in efficient processing calls later inside a loop.

frameSize = 1024; % Size of one chunk of signal to be processed in one loop
Fs = 48e3;        % Sample rate
numFrames = 100;  % number of frames to process

The input signal in this example is white Gaussian noise passed through a lowpass FIR filter. Create the FIR Filter System object™ used to filter the noise signal:

fir = dsp.FIRFilter(Numerator=designLowpassFIR(FilterOrder=32,CutoffFrequency=.3));

Create a Spectrum Estimator System object to estimate the power spectrum density of the input.

spect = dsp.SpectrumEstimator(SampleRate=Fs,...
                              SpectrumType='Power density',...
                              FrequencyRange='onesided',...
                              Window='Kaiser');

Create System objects to calculate mean, variance, peak-to-RMS, minimum and maximum and set them to running mode. These objects are a subset of statistics System objects available in the product. In running mode, you compute the statistics of the input for its entire length in the past rather than the statistics for just the current input.

runMean       = dsp.MovingAverage(SpecifyWindowLength=false);
runVar        = dsp.MovingVariance(SpecifyWindowLength=false);
runPeaktoRMS  = dsp.PeakToRMS(RunningPeakToRMS=true);
runMin        = dsp.MovingMinimum(SpecifyWindowLength=false);
runMax        = dsp.MovingMaximum(SpecifyWindowLength=false);

Initialize scope System objects, used to visualize statistics and spectrum

meanScope = timescope(SampleRate=Fs,...
                      TimeSpanSource='property',...
                      TimeSpan=numFrames*frameSize/Fs,...
                      Title='Running Mean',...
                      YLabel='Mean',...
                      YLimits=[-0.1 .1],...
                      Position=[43   308   420   330]);
p2rmsScope = timescope(SampleRate=Fs,...
                       TimeSpanSource='property',...                           
                       TimeSpan=numFrames*frameSize/Fs,...
                       Title='Running Peak-To-RMS',...
                       YLabel='Peak-To-RMS',...
                       YLimits=[0 5],...
                       Position=[480   308   420   330]);
minmaxScope = timescope(SampleRate=Fs,...
                        TimeSpanSource='property', ...                         
                        TimeSpan=numFrames*frameSize/Fs,...
                        ShowGrid=true,...
                        Title='Signal with Running Minimum and Maximum',...
                        YLabel='Signal Amplitude',...
                        YLimits=[-3 3],...
                        Position=[43   730   422   330]);
spectrumScope = dsp.ArrayPlot(SampleIncrement=.5 * Fs/(frameSize/2 + 1 ),...
                             PlotType='Line',...
                             Title='Power Spectrum Density',...
                             XLabel='Frequency (Hz)',...
                             YLabel='Power/Frequency (dB/Hz)',...
                             YLimits=[-120 -30],...
                             Position=[475 730 420 330]);

Stream Processing Loop

Here you call your processing loop which filters white Gaussian noise and calculates its mean, variance, peak-to-RMS, min, max and spectrum using the System objects.

Note that the System objects are called inside the loop. Since the input data properties do not change, the objects are reused leading to the usage of less memory.

for i=1:numFrames
    % Pass white Gaussian noise through FIR Filter
    sig = fir(randn(frameSize,1));

    % Compute power spectrum density
    ps = spect(sig);
   
    % The runMean System object keeps track of the information about past
    % samples and gives you the mean value reached until now. The same is
    % true for runMin and runMax System objects.
    meanval  = runMean(sig);
    variance = runVar( sig);
    peak2rms = runPeaktoRMS(sig);
    minimum  = runMin( sig);
    maximum  = runMax(sig);

    % Plot the data you have processed
    minmaxScope([sig,minimum,maximum]);
    spectrumScope(10*log10(ps));
    meanScope(meanval);
    p2rmsScope(peak2rms);
end
release(minmaxScope);

release(spectrumScope);

release(meanScope);

release(p2rmsScope);

Conclusion

You have seen visually that the code involves just calling successive System objects with appropriate input arguments and does not involve maintaining any more variables like indices or counters to compute the statistics. This technique helps in quicker and error free coding. Pre-computation of constant variables inside the objects generally leads to faster processing time.