09 声谱图 specgram
用途
时频瀑布,用于局放、振动、载波通信这类非平稳信号。
示例(5 张)
09-1 变压器局部放电超声信号的声谱图

09-2 断路器操作振动的时频分布

09-3 异步电机启动电流的时频分布

09-4 风电功率波动的时频能量分布

09-5 电力线载波通信信号的时频图

代码
以下 5 个函数取自 code/第二批_信号分析261107.py,直接调用即可出图。样式(宋体 + Times、10 磅、刻度朝内四边、留白自检)由 code/公共配置261107.py 的 setup_cn_style() 和 save() 统一提供,本节不再重复。
# 摘自 code/第二批_信号分析261107.py
def sg_01():
"""变压器局部放电超声信号的声谱图。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.86)
rng = np.random.default_rng(901)
fs = 20000
t = np.arange(0, 1.0, 1 / fs)
x = rng.normal(0, 0.02, t.size)
for t0 in (0.18, 0.42, 0.55, 0.78):
x += 0.9 * np.exp(-((t - t0) / 0.004) ** 2) * np.sin(2 * np.pi * 4200 * (t - t0))
m = ax.specgram(x, NFFT=256, Fs=fs, noverlap=200, cmap=CMAP_SEQ)
ax.set_xlabel("时间 " + IT["t"] + " / s")
ax.set_ylabel("频率 " + IT["f"] + " / kHz")
ax.set_ylim(0, 8000)
ax.set_yticks([0, 2000, 4000, 6000, 8000])
ax.set_yticklabels(["0", "2", "4", "6", "8"])
cbar(fig, ax, m[3], "功率 / dB")
save(fig, "09_声谱图", "09_声谱图_局部放电声谱")
def sg_02():
"""断路器操作振动的时频分布。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.86)
rng = np.random.default_rng(902)
fs = 10000
t = np.arange(0, 0.5, 1 / fs)
x = rng.normal(0, 0.03, t.size)
for t0, f0 in [(0.08, 1800), (0.14, 900), (0.22, 2600)]:
x += 1.1 * np.exp(-((t - t0) / 0.008) ** 2) * np.sin(2 * np.pi * f0 * (t - t0))
m = ax.specgram(x, NFFT=128, Fs=fs, noverlap=110, cmap=CMAP_SEQ)
ax.set_xlabel("时间 " + IT["t"] + " / s")
ax.set_ylabel("频率 " + IT["f"] + " / kHz")
ax.set_ylim(0, 4000)
ax.set_yticks([0, 1000, 2000, 3000, 4000])
ax.set_yticklabels(["0", "1", "2", "3", "4"])
cbar(fig, ax, m[3], "功率 / dB")
save(fig, "09_声谱图", "09_声谱图_断路器振动时频")
def sg_03():
"""异步电机启动电流的时频分布。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.86)
fs = 2000
t = np.arange(0, 3.0, 1 / fs)
slip = np.exp(-t / 0.9)
f_rot = 50 * (1 - 0.03 * slip)
x = 5.5 * np.exp(-t / 1.1) * np.sin(2 * np.pi * np.cumsum(f_rot) / fs) + 0.02 * np.random.default_rng(903).normal(0, 1, t.size)
m = ax.specgram(x, NFFT=512, Fs=fs, noverlap=480, cmap=CMAP_SEQ)
ax.set_xlabel("时间 " + IT["t"] + " / s")
ax.set_ylabel("频率 " + IT["f"] + " / Hz")
ax.set_ylim(0, 120)
cbar(fig, ax, m[3], "功率 / dB")
save(fig, "09_声谱图", "09_声谱图_电机启动时频")
def sg_04():
"""风电功率波动的时频能量分布。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.86)
rng = np.random.default_rng(904)
fs = 1.0
t = np.arange(0, 512, 1 / fs)
x = (2.2 * np.sin(2 * np.pi * t / 96) + 1.1 * np.sin(2 * np.pi * t / 24)
+ rng.normal(0, 0.6, t.size))
m = ax.specgram(x, NFFT=128, Fs=fs, noverlap=100, cmap=CMAP_SEQ)
ax.set_xlabel("时间 " + IT["t"] + " / h")
ax.set_ylabel("频率 " + IT["f"] + " / (1/h)")
ax.set_ylim(0, 0.5)
cbar(fig, ax, m[3], "功率 / dB")
save(fig, "09_声谱图", "09_声谱图_风电波动时频")
def sg_05():
"""电力线载波通信信号的时频图。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.86)
rng = np.random.default_rng(905)
fs = 100000
t = np.arange(0, 0.02, 1 / fs)
bits = rng.integers(0, 2, 40)
x = np.zeros_like(t)
for k, b in enumerate(bits):
m0 = (t >= k * 0.0005) & (t < (k + 1) * 0.0005)
f = 20000 if b else 40000
x[m0] = np.sin(2 * np.pi * f * t[m0])
x += rng.normal(0, 0.15, t.size)
m = ax.specgram(x, NFFT=256, Fs=fs, noverlap=230, cmap=CMAP_SEQ)
ax.set_xlabel("时间 " + IT["t"] + " / ms")
ax.set_ylabel("频率 " + IT["f"] + " / kHz")
ax.set_ylim(0, 60000)
ax.set_yticks([0, 20000, 40000, 60000])
ax.set_yticklabels(["0", "20", "40", "60"])
cbar(fig, ax, m[3], "功率 / dB")
save(fig, "09_声谱图", "09_声谱图_载波通信时频")
说明
- 图片尺寸 1181×944 px(100 mm × 80 mm @ 300 dpi),三维图为 1181×1122 px。
- 图内不放标题,图题由本文件的二级/三级标题承担。
- 数据为贴近广东实际量级的仿真算例,随机种子固定,重跑结果一致。
浙公网安备 33010602011771号