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。
  • 图内不放标题,图题由本文件的二级/三级标题承担。
  • 数据为贴近广东实际量级的仿真算例,随机种子固定,重跑结果一致。
posted on 2026-11-07 01:05  小青蛙电气  阅读(3)  评论(0)    收藏  举报