AnyMath 文档
Notebook

利用FFT模块构建非稳态复信号频谱图

让我们考虑显示时间不稳定信号频谱的经典问题。 线性频率调制(LFM)信号可用作这样的信号。 例如,当振荡频率在仿真期间线性增加时。 在观察期间计算整个信号的快速傅立叶变换(FFT)的标准方法不允许我们估计变化的动态,这意味着我们需要使用STFT(短时傅立叶变换)方法来构建频谱图,

使用EngeeDSP信号处理库的功能,两者都可以在Engee建模环境中轻松实现。

模型的组成

动态模型在**复杂_fft中组装。engee文件。**我们可以以编程方式打开它:

In [ ]:
engee.open("complex_fft.engee")

当前模型级别如下所示:

complex_fft--1770891051205.png

子系统Complex_LFM用作信号源,其中收集复数LFM信号。:

complex_fft--1770891180980.png

接下来,将生成的复信号发送到低通滤波器(low-pass filter),该滤波器是使用Engee交互式应用程序"数字滤波器编辑器"生成的。 应用中滤波器的特性和规格如下图所示。:

fda.png

生成的筛选器结构位于IIR_LPF子系统中:

complex_fft--1770891207229.png

滤波器输出后的顺序复数样本被送到缓冲块,其输出是1024个元素的向量。 汉明窗函数应用于向量,然后转到FFT块的输入。 随后的块链分配FFT样本的输出复矢量的前半部分,计算值模,补偿能量,并以dBm为单位表示中间幅度谱。

运行结果保存到workspace_out变量中。

仿真结果的交互式分析

该模型的配置方式是,一秒的模拟对应于一秒的"实时"时间(挂钟)。 因此,在启动模型后,在"信号可视化"窗口中,您可以观察动态中的各种输出,包括时域和频域。

"信号可视化"窗口的输出

通过低频时复数LFM的示波图如下所示:

01_lpf.png

FFT输出的截断向量的模块的输出可以使用"时域中的帧"显示类型来观察:

02_fft.png

仿真环境的内置频谱分析仪("频域中的信号")将在dynamics中显示滤波器前后FM信号频谱的变化。:

gif1.gif

并且"自定义"处理链的逻辑输出也可以使用"阵列构造"选项在dynamics中可视化:

gif2.gif

程序分析和频谱图构建

对于脚本中的分析任务,我们将链的输出记录为工作区中的块。 这允许我们将变换输出的帧表示为矩阵。 该模型可以以编程方式运行:

In [ ]:
engee.run("complex_fft")

在循环中,我们将处理结果的数值向量(用于形成频谱图的频谱的单独"帧")分配给变量outmatrix:

In [ ]:
nframes = Int(ceil(stoptime*fs/nfft));
half_nfft = Int(round(nfft/2));
timeline = zeros(nframes);
outmatrix = zeros(half_nfft,nframes);
for k = 1:nframes
    tempvar = workspace_out[k];
    timeline[k] = tempvar[1];
    outmatrix[:,k] = tempvar[2];
end
freqvec = LinRange(0,fs/2,half_nfft);

让我们以三维表面的形式构建一个频谱图:

In [ ]:
surface(timeline, freqvec, outmatrix, c = :rainbow)
Out[0]:

结论

我们熟悉了EngeeDSP库的模块和交互工具的功能,用于构建处理非平稳复杂信号的动态模型。 我们还考虑了两种方法来可视化这些信号的频率组成-在动力学和使用频谱图。