Python环境下一种基于改进小波变换的信号时频分析方法

小波,不严格的说即有限持续时间的波形,其平均值为零。许多我们感兴趣的信号和图像表现出瞬变行为。例如语音信号的特点是辅音短脉冲编码,然后元音稳态振荡;自然图像边缘突变;金融时间序列表现出瞬态行为,经济状况的快速上升和下降。与傅里叶基不同,小波基比较擅长稀疏表示分段规则信号和图像,其中包括众多瞬态行为。将小波与正弦波进行比较,正弦波是傅里叶分析的基础,正弦曲线的持续时间没有限制—负无穷延伸到正无穷。正弦曲线是平滑的,小波往往是不规则和不对称的。

针对小波变换存在的依赖母函数选择问题,受多分辨率思想的启发,对小波进行了修正,以一系列小波集代替传统小波母函数,对小波进行阶数选择及循环数缩放,得到能够在时频面有着较高分辨率的小波变换结果。

需要提前安装JAX模块,可以参考:

https://blog.csdn.net/weixin_50008473/article/details/126589113

程序部分代码如下:

import sys
sys.path.insert(0, '..')

import jax.numpy as jnp
import matplotlib.pyplot as plt
from improvewavelets import wavelet_transform, adaptive_wavelet_transform

fs = 1024
burst_freqs = [20, 40, 60]
f_shift = 10
n_cycles = 11
n_neighb_cycles = 12

ys = []

# create a 0.1s blank signal to start
ys.append(jnp.zeros(int(fs*0.1)))

for f in burst_freqs:
  # frequency contaminated signal
  t = 1/f * n_cycles
  x = jnp.linspace(0, t, int(t * fs))
  y = jnp.sin(2*jnp.pi*f*x) + jnp.sin(2*jnp.pi*(f+f_shift)*x - jnp.pi/1.5)
  ys.append(y)

  # time contaminated signal, 2 cycles later
  ys.append(jnp.zeros(int(fs*(1/f)*2)))
  
  t2 = 1/f * n_neighb_cycles
  x = jnp.linspace(0, t2, int(t2 * fs))
  y = jnp.sin(2*jnp.pi*f*x)
  ys.append(y)

  # space between bursts of 0.1s
  ys.append(jnp.zeros(int(fs*0.1)))

signal = jnp.concatenate(ys)


fig, ax = plt.subplots(figsize=(15, 2), dpi=300)
ax.set_xlabel("Time (ms)")
ax.plot(jnp.linspace(0, len(signal)/fs, len(signal)), signal)

freqs = jnp.linspace(10, 80, 141)

fig, ax = plt.subplots(ncols=3, figsize=(15, 5), dpi=300)

for i, c in enumerate([3, 16, 33]):
    scalogram = wavelet_transform(signal, freqs, c, fs)
    ax[i].imshow(jnp.abs(scalogram)**2, aspect=1/40, cmap="jet", interpolation="none", origin="lower", extent=[0, len(signal)/fs, freqs[0], freqs[-1]])
    ax[i].set_title(f"Cycles: {c}")
    ax[i].set_xlabel("Time (s)")
    ax[i].set_ylabel("Frequency (Hz)")

fig, ax = plt.subplots(ncols=3, figsize=(15, 5), dpi=300)

for (i, (base_cycle, min_order, max_order)) in enumerate(zip([3, 5, 1], [1, 1, 5], [30, 30, 40])):
    scalogram = adaptive_wavelet_transform(signal, freqs, sampling_freq=fs, 
                                        base_cycle=base_cycle, min_order=min_order, max_order=max_order, mode="add")
    ax[i].imshow(jnp.abs(scalogram)**2, aspect=1/40, cmap="jet", interpolation="none", origin="lower", extent=[0, len(signal)/fs, freqs[0], freqs[-1]])
    ax[i].set_title(f"Base cycles: {base_cycle}, Orders: {min_order}-{max_order}")
    ax[i].set_xlabel("Time (s)")
    ax[i].set_ylabel("Frequency (Hz)")

出图如下:

工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任
《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家,担任《计算机科学》,《电子器件》 , 《现代制造过程》 ,《电源学报》,《船舶工程》 ,《轴承》 ,《工矿自动化》 ,《重庆理工大学学报》 ,《噪声与振动控制》 ,《机械传动》 ,《机械强度》 ,《机械科学与技术》 ,《机床与液压》,《声学技术》,《应用声学》,《石油机械》,《西安工业大学学报》等中文核心审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python中,时频分析一种用于分析信号在时间和频率上的变化的方法时频分析可以帮助我们了解信号的频率成分随时间的变化情况。 通过使用NumPy和Matplotlib库,我们可以在Python中进行时频分析。其中,引用展示了绘制频率不断变化的正弦波的方法。通过定义频率数组和时间数组,我们可以计算出正弦波的值,并使用Matplotlib库将其绘制出来。 引用展示了绘制频率和振幅变化的正弦波的方法。通过设置振幅数组和频率数组,我们可以将时间分块,并在每个时间块内计算出正弦波的值。最后,使用Matplotlib库将这些正弦波绘制出来。 引用展示了绘制振幅不断变化的正弦波的方法。通过定义振幅数组和时间数组,我们可以计算出振幅变化的正弦波的值,并使用Matplotlib库将其绘制出来。 这些方法可以帮助我们对信号在时间和频率上的变化进行可视化分析,从而更好地理解信号的特性和变化趋势。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用Python时频分析-1](https://blog.csdn.net/zhangyong6712/article/details/129937697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哥廷根数学学派

码字不易,且行且珍惜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值