引言
确定承受振动载荷的机械系统的寿命通常至关重要。振动载荷的一个来源是车辆在颠簸路面上的运输。为了模拟可能持续数小时甚至数天的运输周期,必须采用统计方法,从而导致进行随机振动分析(RV)的必要性,这需要给定载荷轮廓(通常为位移、速度或加速度)的时间序列的功率谱密度(PSD);行业和政府标准通常提供机械系统必须承受的载荷的 PSD。然而,通常需要将实验室生成的时间序列数据转换为专有 RV 分析的 PSD。在本文中,我们将了解如何使用 Python 计算时间序列数据的 PSD;我们还将使用 nCode 计算相同的 PSD,以验证 Python 结果的准确性。
时间序列数据集
我们将使用的示例时间序列数据集是加速度(单位为 g)与时间(单位为秒)的关系。该信号的采样率为 4 kHz,持续时间为略超过 4 秒。时间序列的图像显示如下:
功率谱密度 (PSD)
关于连续时间信号如何定义功率谱密度(PSD)的解释可在此处找到此处 。对于离散信号,例如在工业应用中通过采样获得的信号,PSD 通常使用 Welch 方法进行估计,该方法将时间序列分成重叠的段(帧),其大小为选定值,计算每段的 PSD,然后进行平均处理。
从信号中选择段的过程称为加窗。根据窗的类型,可以最小化频谱泄漏的影响,从而得到更准确的 PSD 估计。关于多种窗类型的讨论超出了本文的范围。然而,我们将使用汉明窗,因为它能有效减少频谱泄漏。
最后,段的大小和重叠的选择会影响 PSD 的准确性和平滑度。通常需要通过试错法来获得良好的 PSD 估计。在这里,我们将探讨一种自适应方法,该方法根据信号特性自动调整段长。

使用 Python 计算 PSD
在 Python 中计算 PSD 只需要从 SciPy.Signal 和 NumPy 中导入几个函数。在此基础上,我们导入 Matplotlib 用于绘图和 Pandas 用于数据管理。
自适应窗和汉明窗 PSD 计算函数
以下两个基于此处代码的用户自定义函数,提供了计算自适应和汉明窗 PSD 的方法。请注意,使用默认(汉宁,不同于汉明)窗的自适应 PSD 估计器:
读取时序数据并计算 PSD
时序 CSV 文件具有特定格式,以便在 Python 和 nCode 导入时都能使用,其中第一行包含变量名,第二行包含单位:
读取文件、运行自适应、汉明窗和手动 PSD 计算的代码如下:
运行这些函数并绘图后,得到的三个功率谱密度(PSD)非常吻合:
请注意,对于实际数据集,曲线可能需要多次迭代调整分段(帧)大小和窗口选择才能达到如此平滑的效果。
使用 nCode 进行 PSD 计算
现在,我们将使用 nCode DesignLife 中的相应计算来验证 Python 的 PSD 结果。此处显示了 nCode 工作空间:
从右上角的图表可以看出,我们在 nCode 中实现了与 Python 相同的功率谱密度(PSD)。 频率谱和直方图操作图标的设置如下所示:
请注意, 窗函数类型和缓冲区大小设置与 Python 中的设置相同,因此两个功率谱密度(PSD)几乎完全一致;为便于比较,此处重复显示 Python 的 PSD 图像:

结论
总之,使用标准的 Python 库,可以非常容易地计算时间序列数据的功率谱密度(PSD),这是随机振动分析所需的输入。最后,通过在 nCode 中计算相同的 PSD,验证了在 Python 中计算 PSD 的准确性。