增强的时频分析频谱图可视化工具,用于生成频谱图、频谱分析或时频图。
Pywayne Plot. 用于专业时间频率分析的增强光谱可视化工具.是一项面向实际任务的技能,主要用于QQ: 快速启动;注册 projection. 注册自定义 SpecgramAxes 投影. must call。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
面向专业时频分析的增强型语谱图可视化工具。
import matplotlib.pyplot as plt
from pywayne.plot import regist_projection, parula_map
import numpy as np
# 注册自定义投影
regist_projection()
# 创建语谱图
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=signal_data,
Fs=100,
NFFT=128,
noverlap=96,
cmap=parula_map,
scale='dB'
)
ax.set_ylabel('Frequency (Hz)')
plt.colorbar(im, label='Magnitude (dB)')
plt.show()
注册自定义的 SpecgramAxes 投影。必须在使用增强型 specgram 功能前调用。
from pywayne.plot import regist_projection regist_projection()
具备高级特性的增强型语谱图绘制方法。
关键参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
NFFT |
FFT 窗长(采样点数) | 256 |
Fs |
采样频率(Hz) | 2 |
noverlap |
窗间重叠点数 | 128 |
cmap |
色图(推荐使用 parula_map) |
- |
mode |
'psd'、'magnitude'、'angle'、'phase' | 'psd' |
scale |
'dB' 或 'linear' | 'dB' |
normalize |
'global'、'local'、'none' | 'global' |
freq_scale |
频率缩放因子 | 1.0 |
Fc |
中心频率偏移(Hz) | 0 |
返回值:
spec —— 二维语谱图数组(形状为 (n_freqs, n_times))freqs —— 频率轴数组t —— 时间轴数组im —— matplotlib 图像对象(用于 colorbar)根据信号特征自动推荐 STFT 参数。
from pywayne.plot import get_specgram_params
params = get_specgram_params(
signal_length=10000,
sampling_rate=100,
time_resolution=0.1 # 或 freq_resolution=0.5
)
# 返回:NFFT、noverlap、actual_freq_res、actual_time_res、n_segments
适用于科学可视化的 MATLAB 风格感知均匀色图。
from pywayne.plot import parula_map plt.imshow(data, cmap=parula_map)
fs = 100 # 采样率
win_time, step_time = 1, 0.1
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=acc_data,
Fs=fs,
NFFT=int(win_time * fs),
noverlap=int((win_time - step_time) * fs),
scale='dB',
cmap=parula_map
)
ax.set_ylabel('Frequency (Hz)')
ax.set_ylim(0, 30)
# 将 Hz 转换为 bpm,用于心率可视化
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=ppg_signal,
Fs=100,
NFFT=400,
noverlap=300,
freq_scale=60, # Hz -> bpm
scale='dB'
)
ax.set_ylabel('Heart Rate (bpm)')
ax.set_ylim(40, 180)
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=vibration_data,
Fs=1000,
NFFT=1024,
noverlap=512,
scale='linear',
normalize='global'
)
plt.colorbar(im, label='Normalized Magnitude')
fig, ax = plt.subplots(subplot_kw={'projection': 'z_norm'})
spec, freqs, t, im = ax.specgram(
x=signal,
Fs=100,
NFFT=100,
pad_to=512, # 零填充以获得更平滑的频谱
noverlap=80,
scale='dB'
)
| 模式 | 说明 | 适用场景 |
|---|---|---|
dB |
对数缩放(PSD 使用 10×log₁₀,幅值使用 20×log₁₀) | 动态范围较大的信号 |
linear |
线性幅值 | 直接幅值对比 |
scale='linear' 有效)| 模式 | 说明 | 适用场景 |
|---|---|---|
global |
Z / max(Z),保留相对强度关系 | 跨时间比较强度 |
local |
按列归一化至 [0,1] | 聚焦于随时间变化的频率成分 |
none |
不进行归一化 | 原始语谱图数值 |
| freq_scale | 单位 | 适用场景 |
|---|---|---|
| 1.0 | Hz | 默认值,适用于大多数信号 |
| 60 | bpm | 心率、呼吸率 |
| 0.001 | kHz | 音频信号 |
示例:freq_scale=60 将 2 Hz → 120 bpm
可使用 get_specgram_params() 自动计算最优参数。
spec, freqs, t, im = ax.specgram(...)
def on_click(event):
if event.xdata and event.inaxes == ax:
time_idx = np.argmin(np.abs(t - event.xdata))
plt.figure()
plt.plot(freqs, spec[:, time_idx])
plt.title(f'FFT at t={event.xdata:.2f}s')
plt.show()
fig.canvas.mpl_connect('button_press_event', on_click)
projection='z_norm' 前,务必先调用 regist_projection()parula_map 以获得最佳感知均匀性NFFT 设为 2 的整数次幂相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章