Этот пример показывает, как выполнить статистические измерения на потоке входных данных с помощью функциональности DSP System Toolbox™, доступной в командной строке MATLAB®. Вы вычислите минимум статистики сигнала, максимум, среднее значение, отклонение и пик к RMS и плотность спектра мощности сигнала и построите их.
Этот пример вычисляет статистику сигнала с помощью Системных объектов DSP System Toolbox. Этот указатель объектов их состояния, автоматически уменьшающие сумму ручного кода, должен был обновить состояния, уменьшающие возможный шанс кодирования ошибок.
Эти Системные объекты предварительно вычисляют много значений, используемых в обработке. Это очень полезно, когда вы обрабатываете сигналы тех же свойств в цикле. Например, в вычислении БПФ в приложении оценки спектра, значения синуса и косинуса могут быть вычислены и сохранены, если вы знаете свойства входа, и эти значения могут быть снова использованы для последующих вызовов. Также объекты проверяют только, имеют ли входные свойства тот же тип как предыдущие входные параметры в каждом вызове.
Здесь вы инициализируете некоторые переменные, используемые в коде, и инстанцируете Системных объектов, используемых в вашей обработке. Эти объекты также предварительно вычисляют любые необходимые переменные, или таблицы, приводящие к эффективной обработке, вызывает позже в цикле.
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 КИХ-фильтр. Создайте КИХ-Системный объект Фильтра, используемый, чтобы отфильтровать шумовой сигнал:
fir = dsp.FIRFilter('Numerator',fir1(32,.3));
Создайте Системный объект Средства оценки Спектра, чтобы оценить плотность спектра мощности входа.
spect = dsp.SpectrumEstimator('SampleRate',Fs,... 'SpectrumType','Power density',... 'FrequencyRange','onesided',... 'Window','Kaiser');
Создайте Системные объекты, чтобы вычислить среднее значение, отклонение, пик к 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 = dsp.TimeScope('SampleRate',Fs,... 'TimeSpan',numFrames*frameSize/Fs,... 'TimeSpanOverrunAction','Scroll',... 'BufferLength',numFrames*frameSize,... 'ShowGrid',true,... 'Title','Running Mean',... 'YLabel','Mean',... 'YLimits',[-0.1 .1],... 'Position',[43 308 420 330]); p2rmsScope = dsp.TimeScope('SampleRate',Fs,... 'TimeSpan',numFrames*frameSize/Fs,... 'TimeSpanOverrunAction','Scroll',... 'BufferLength',numFrames*frameSize,... 'ShowGrid',true,... 'Title','Running Peak-To-RMS',... 'YLabel','Peak-To-RMS',... 'YLimits',[0 5],... 'Position',[480 308 420 330]); minmaxScope= dsp.TimeScope('SampleRate',Fs,... 'TimeSpan',numFrames*frameSize/Fs,... 'TimeSpanOverrunAction','Scroll',... 'BufferLength',3*numFrames*frameSize,... '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]);
Здесь вы вызываете свой цикл обработки, который отфильтрует белый Гауссов шум и вычислит его среднее значение, отклонение, пик к RMS, min, макс. и спектр с помощью Системных объектов.
Обратите внимание на то, что Системные объекты называются в цикле. Поскольку свойства входных данных не изменяются, это включает повторное использование объектов здесь. Это уменьшает использование памяти.
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);
Вы видели визуально, что код связал только вызывающие последовательные Системные объекты с соответствующими входными параметрами и больше не включает поддержание переменные как индексы или счетчики, чтобы вычислить статистику. Это помогает в более быстром и безошибочном кодировании. Предварительное вычисление постоянных переменных в объектах обычно приводит к более быстрому времени вычислений.