Статистика потокового сигнала

В этом примере показано, как выполнить статистические измерения в потоке входных данных с помощью функциональности DSP System Toolbox™, доступной в командной строке MATLAB ®. Вы вычислите минимальную, максимальную, среднюю, отклонение и peak-to-RMS статистики сигнала и плотность спектра степени сигнала и постройте их график.

Введение

Этот пример вычисляет статистику сигналов с использованием объектов DSP System Toolbox System. Эти объекты обрабатывают свои состояния автоматически уменьшая количество ручного кода, необходимого для обновления состояний, снижая возможную вероятность ошибок кодирования.

Эти системные объекты предварительно вычисляют многие значения, используемые в обработке. Это очень полезно, когда вы обрабатываете сигналы тех же свойств в цикле. Для примера при вычислении БПФ в приложении оценки спектра значения синуса и косинуса могут быть вычислены и сохранены, если вы знаете свойства входа, и эти значения могут быть повторно использованы для последующих вызовов. Кроме того, объекты проверяют только, имеют ли входные свойства тот же тип, что и предыдущие входы в каждом вызове.

Инициализация

Здесь вы инициализируете некоторые переменные, используемые в коде, и создаете экземпляры системных объектов, используемых в обработке. Эти объекты также предварительно вычисляют любые необходимые переменные или таблицы, что приводит к эффективной обработке вызовов позже внутри цикла.

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

Входной сигнал в этом примере является белым Гауссовым шумом, прошедшим через lowpass конечная импульсная характеристика. Создайте объект KIR Filter System, используемый для фильтрации сигнала шума:

fir = dsp.FIRFilter('Numerator',fir1(32,.3));

Создайте объект Системы Оценки Спектра, чтобы оценить плотность спектра степени входа.

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

Создайте Системные объекты, чтобы вычислить среднее значение, отклонение, peak-to-RMS, минимум и максимум и установить их в текущий режим. Эти объекты являются подмножеством статистических Системных объектов, доступных в продукте. В режиме выполнения вы вычисляете статистику входа для всей его длины в прошлом, а не для статистики только для текущего входа.

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);

Инициализируйте возможности объекты, используемые для визуализации статистики и спектра

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]);

Цикл обработки потока

Здесь вы вызываете цикл обработки, который будет фильтровать белый Гауссов шум и вычислять его среднее значение, отклонение, peak-to-RMS, min, max и спектр, используя системные объекты.

Обратите внимание, что системные объекты вызываются внутри цикла. Поскольку свойства входных данных не изменяются, это позволяет повторно использовать объекты здесь. Это уменьшает использование памяти.

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);

Заключение

Вы увидели визуально, что код включает в себя только вызов последующих системных объектов с соответствующими входными параметрами и не включает в себя поддержание других переменных, таких как индексы или счетчики, для вычисления статистики. Это помогает в более быстром и свободном от ошибок кодировании. Предварительный расчет постоянных переменных внутри объектов обычно приводит к более быстрому времени вычислений.