这个例子展示了如何使用MATLAB®命令行中可用的DSP System Toolbox™功能在输入数据流上执行统计测量。您将计算信号统计的最小值、最大值、平均值、方差和峰-均方根以及信号功率谱密度,并绘制它们。
此示例使用DSP系统工具箱系统对象计算信号统计信息。这些对象会自动处理其状态,从而减少更新状态所需的手动代码量,从而降低编码错误的可能性。
这些System对象预先计算处理过程中使用的许多值。当你在循环中处理相同属性的信号时,这是非常有用的。例如,在频谱估计应用程序中计算FFT时,只要知道输入的属性,就可以计算和存储正弦和余弦的值,并且这些值可以在后续调用中重用。而且,对象只检查输入属性是否与每次调用中的前一个输入具有相同的类型。
在这里,您可以初始化代码中使用的一些变量,并实例化处理中使用的系统对象。这些对象还可以预先计算任何必要的变量或表,从而在稍后的循环中实现高效的处理调用。
帧大小=1024;%要在一个循环中处理的一个信号块的大小Fs=48e3;%采样率numFrames=100;要处理的帧数
这个例子中的输入信号是通过低通FIR滤波器的高斯白噪声。创建FIR Filter System对象用于过滤噪声信号:
冷杉= dsp。FIRFilter (“分子”fir1(32。3));
创建频谱估计器系统对象以估计输入的功率谱密度。
spect=dsp.频谱刺激仪(“SampleRate”Fs,...“SpectrumType”,“功率密度”,...“频率范围”,“片面的”,...“窗口”,“凯撒”);
创建System对象来计算平均值、方差、峰值到均方根、最小值和最大值,并将它们设置为运行模式。这些对象是产品中可用的统计系统对象的子集。在运行模式下,您将计算过去整个输入长度的统计信息,而不仅仅是当前输入的统计信息。
runMean = dsp。MovingAverage (“SpecifyWindowLength”、假);runVar = dsp。MovingVariance (“SpecifyWindowLength”、假);runPeaktoRMS = dsp。PeakToRMS (“RunningPeakToRMS”,真正的);runMin = dsp。MovingMinimum (“SpecifyWindowLength”,假);runMax=dsp.MOVINGMAX(“SpecifyWindowLength”、假);
初始化作用域系统对象,用于可视化统计信息和频谱
平均范围=时间范围(“SampleRate”Fs,...“TimeSpanSource”,“属性”,...“时间间隔”numFrames * frameSize / Fs,...“头衔”,“移动平均”,...“伊拉贝尔”,“中庸”,...“YLimits”、(-0.1 1。)...“位置”,[43 308 420 330]);p2rmsScope=时间范围(“SampleRate”Fs,...“TimeSpanSource”,“属性”,...“时间间隔”numFrames * frameSize / Fs,...“头衔”,“运行峰值至RMS”,...“伊拉贝尔”,“Peak-To-RMS”,...“YLimits”,[0 5],...“位置”,[480 308 420 330]);minmaxScope=timescope(“SampleRate”Fs,...“TimeSpanSource”,“属性”,...“时间间隔”numFrames * frameSize / Fs,...“ShowGrid”,真的,...“头衔”,...“运行最小和最大信号”,...“伊拉贝尔”,信号幅度的,...“YLimits”,[-3 3],...“位置”,[43 730 422 330]);spectrumScope = dsp。ArrayPlot (“采样增量”,....5*Fs/(帧大小/2+1),...“打印类型”,“行”,...“头衔”,“功率谱密度”,...“XLabel”,的频率(赫兹),...“伊拉贝尔”,“功率/频率(dB / Hz)”,...“YLimits”(-120 -30),...“位置”,[475 730 420 330]);
在这里,你调用你的处理循环,它将过滤高斯白噪声,并使用System对象计算其均值,方差,峰值-均方根,最小值,最大值和频谱。
注意,System对象是在循环内部调用的。由于输入数据属性没有改变,因此允许在这里重用对象。这减少了内存的使用。
为我= 1:numFrames通过FIR滤波器的高斯白噪声sig =冷杉(randn (frameSize 1));%计算功率谱密度ps = spect(团体);%runMean系统对象跟踪有关过去系统的信息%采样并提供到目前为止达到的平均值。同样是% true用于runMin和runMax系统对象。meanval = runMean(团体);方差= runVar(sig);peak2rms = runPeaktoRMS(团体);最小=运行最小(sig);最大= runMax(团体);%绘制已处理的数据minmaxScope((团体、最小、最大));spectrumScope (10 * log10 (ps));meanScope (meanval);p2rmsScope (peak2rms);结束释放(minmaxScope);释放(spectrumScope);释放(meanScope);释放(p2rmsScope);
您可以直观地看到,代码只涉及使用适当的输入参数连续调用System对象,而不涉及维护任何变量,如索引或计数器来计算统计信息。这有助于更快和无错误的编码。在对象内部预先计算常量变量通常会导致更快的处理时间。