文档

信号的统计数据

此示例演示如何使用DSP系统工具箱对输入数据流执行统计测量™ MATLAB®命令行提供的功能。您将计算信号统计信息的最小值、最大值、平均值、方差和峰均方根值以及信号功率谱密度,并绘制它们。

介绍

这个例子使用DSP系统工具箱系统对象计算信号统计。这些对象自动处理它们的状态,减少了更新状态所需的手动代码数量,减少了可能的编码错误。

这些系统对象预先计算处理中使用的许多值。这在循环中处理相同属性的信号时非常有用。例如,在频谱估计应用程序中计算FFT时,一旦知道输入的属性,就可以计算和存储正弦和余弦的值,并且这些值可以重新用于后续调用。此外,对象仅检查输入属性是否与每个调用中以前的输入类型相同。

初始化

这里初始化代码中使用的一些变量,并实例化处理中使用的System对象。这些对象还预先计算任何必要的变量或表,从而在循环中稍后进行有效的处理调用。

frameSize = 1024;%在一个循环中要处理的一个信号块的大小Fs = 48 e3;%采样率numFrames = 100;%要处理的帧数

本例中的输入信号是通过低通FIR滤波器的高斯白噪声。创建用于滤波噪声信号的FIR滤波器系统对象:

fir=dsp.fir滤波器(“分子”,fir1(32,3));

创建一个频谱估计系统对象来估计输入的功率谱密度。

spect = dsp。SpectrumEstimator (“采样器”,财政司司长,...“光谱类型”,的功率密度,...“FrequencyRange”,“单向的”,...“窗口”,“皇帝”);

创建系统对象以计算平均值、方差、峰值到均方根值、最小值和最大值,并将其设置为运行模式。这些对象是产品中可用的统计系统对象的子集。在运行模式下,您可以计算过去输入的整个长度的统计信息,而不仅仅是当前输入的统计信息。

运行平均值=dsp.MovingAverage('指定Windows长度',假);runVar=dsp.MovingVariance('指定Windows长度',假);runPeaktoRMS=dsp.PeakToRMS(“RunningPeakToRMS”,对);runMin=dsp.MovingMinimum('指定Windows长度'、假);runMax = dsp。MovingMaximum ('指定Windows长度'、假);

初始化范围系统对象,用于可视化统计信息和频谱

meanScope=dsp.TimeScope(“采样器”,财政司司长,...“时间跨度”,numFrames*frameSize/Fs,...“TimeSpanOverrunAction”,“滚动”,...“BufferLength”,numFrames*帧大小,...“ShowGrid”符合事实的...“标题”,“跑步平均值”,...“YLabel”,“的意思是”,...“YLimits”,[-0.1 .1],...“位置”,[43 308 420 330]);p2rmsScope = dsp。TimeScope (“采样器”,财政司司长,...“时间跨度”,numFrames*frameSize/Fs,...“TimeSpanOverrunAction”,“滚动”,...“BufferLength”,numFrames*帧大小,...“ShowGrid”符合事实的...“标题”,“运行Peak-To-RMS”,...“YLabel”,“峰值至RMS”,...“YLimits”, [0 5),...“位置”,[480 308 420 330]); minmaxScope=dsp.TimeScope(“采样器”,财政司司长,...“时间跨度”,numFrames*frameSize/Fs,...“TimeSpanOverrunAction”,“滚动”,...“BufferLength”3 * numFrames * frameSize...“ShowGrid”符合事实的...“标题”,...'运行最小值和最大值的信号',...“YLabel”,“信号幅度”,...“YLimits”3 [3],...“位置”,[43 730 422 330]); spectrumScope=dsp.ArrayPlot(“SampleIncrement”,....5 * Fs/(frameSize/2 + 1),...“PlotType”,“线路”,...“标题”,的功率谱密度,...“包含”,‘频率(Hz)’,...“YLabel”,‘功率/频率(dB/Hz)’,...“YLimits”,[-120 -30],...“位置”,[475 730 420 330]);

流处理循环

这里您调用处理循环,它将过滤高斯白噪声,并使用系统对象计算其均值、方差、峰均方根值、最小值、最大值和频谱。

请注意,系统对象是在循环内调用的。由于输入数据属性不变,因此可以在此处重用对象。这减少了内存使用。

对于i=1:numFrames%将高斯白噪声通过FIR滤波器sig=fir(randn(帧大小,1));%计算功率谱密度ps=spect(sig);%avrg系统对象跟踪有关过去系统的信息%的样本,并给出到目前为止达到的平均值。相同的是%对于runMin和runMax系统对象,为true。平均值=运行平均值(sig);方差=runVar(sig);peak2rms=运行峰值波形(sig);最小值=运行最小值(sig);最大值=runMax(sig);%绘制您处理过的数据minmaxScope([sig,最小值,最大值]);spectrumScope(10*log10(ps));meanScope(meanval);p2rmsScope(peak2rms);终止发布(minmaxScope);发布(spectrumScope);发布(meanScope);发布(p2rmsScope);

结论

您已经直观地看到,该代码只涉及使用适当的输入参数调用连续的系统对象,而不涉及维护任何其他变量(如索引或计数器)来计算统计数据。这有助于更快和无错误的编码。对象内部常量变量的预计算通常会导致更快的处理时间。

这个话题有用吗?