Skip to main content

Python 中的同步压缩、小波变换和时频分析

项目描述

Python中的同步压缩

squeezepy CI 编解码器 PyPI 版本 Codacy 徽章 DOI 执照:麻省理工学院

Synchrosqueezing 是一种强大的重新分配方法,它关注时频表示,并允许提取瞬时幅度和频率。友好的概述。

特征

  • 连续小波变换 (CWT)、正向和反向及其同步压缩
  • 短时傅里叶变换 (STFT)、正向和反向及其同步压缩
  • 小波可视化和测试套件
  • 广义莫尔斯小波
  • 脊提取
  • Python 1中最快的小波变换,超过了 MATLAB

1:随意打开问题,否则显示

安装

pip install ssqueezepy. 或者,对于最新版本(很可能是稳定的):

pip install git+https://github.com/OverLordGoldDragon/ssqueezepy

GPU 和 CPU 加速

默认启用多线程执行(通过 禁用os.environ['SSQ_PARALLEL'] = '0')。GPU 需要安装CuPy >= 8.0.0PyTorch >= 1.8.0(通过 启用os.environ['SSQ_GPU'] = '1')。pyfftw可选地支持最大 CPU FFT 速度。请参阅性能指南

基准

代码。转换使用填充、float32精度(float64支持)和输出形状 (300, len(x)),平均超过 10 次运行。pyfftw未使用,这将进一步加速 1 线程和并行。坐在作者的 i7-7700HQ、GTX 1070 上。

len(x)-转换 1 线程 CPU 平行 显卡 小波 scipy 图书馆
10k-英担 0.126 0.0462 0.00393 3.58 0.523 -
10k-stft 0.108 0.0385 0.00534 - 0.118 0.0909
10k-ssq_cwt 0.372 0.148 0.00941 - - -
10k-ssq_stft 0.282 0.147 0.0278 - - -
16万英担 2.99 1.25 0.0367 12.7 10.7 -
160k-stft 1.66 0.418 0.0643 - 1.93 1.38
160k-ssq_cwt 8.38 3.16 0.0856 - - -
160k-ssq_stft 4.65 2.48 0.159 - - -

例子

1. 严重噪声下的信号恢复

图片

2. 医疗:脑电图

3. 测试套件:CWT vs STFT,反射添加并行线性啁啾

4. 岭提取:三次多项式。FM+纯音;无噪音和 1.69dB SNR

更多的

5. 测试套件:GMW vs Morlet,反射添加双曲啁啾(极端时间定位)

6. 高阶GMW CWT,加反射平行线性啁啾,3.06dB SNR

更多示例

内省

ssqueezepy配备了可视化工具包,可用于探索跨尺度和配置的小波行为。(另见解释和代码

效果如何?

简而言之,同步压缩利用时间频率表示的冗余来稀疏地定位振荡,通过施加先验。也就是说,我们假设 x被 AM-FM 组件很好地捕获,例如基于我们对底层过程的了解。我们超越了海森堡的限制,但仅限于所有可能信号的一个子集。它也类似于注意力机制。

与本地化的分析内核卷积

计算相位变换,然后将振荡与共享速率相结合


最小的例子

import numpy as np
import matplotlib.pyplot as plt
from ssqueezepy import ssq_cwt, ssq_stft

def viz(x, Tx, Wx):
    plt.imshow(np.abs(Wx), aspect='auto', cmap='turbo')
    plt.show()
    plt.imshow(np.abs(Tx), aspect='auto', vmin=0, vmax=.2, cmap='turbo')
    plt.show()

#%%# Define signal ####################################
N = 2048
t = np.linspace(0, 10, N, endpoint=False)
xo = np.cos(2 * np.pi * 2 * (np.exp(t / 2.2) - 1))
xo += xo[::-1]  # add self reflected
x = xo + np.sqrt(2) * np.random.randn(N)  # add noise

plt.plot(xo); plt.show()
plt.plot(x);  plt.show()

#%%# CWT + SSQ CWT ####################################
Twxo, Wxo, *_ = ssq_cwt(xo)
viz(xo, Twxo, Wxo)

Twx, Wx, *_ = ssq_cwt(x)
viz(x, Twx, Wx)

#%%# STFT + SSQ STFT ##################################
Tsxo, Sxo, *_ = ssq_stft(xo)
viz(xo, np.flipud(Tsxo), np.flipud(Sxo))

Tsx, Sx, *_ = ssq_stft(x)
viz(x, np.flipud(Tsx), np.flipud(Sx))

另请参阅山脊提取自述文件

学习资源

  1. 连续小波变换,& vs STFT
  2. Synchrosqueezing 的相变,直观
  3. 小波时间和频率分辨率视觉效果
  4. 为什么混合正弦的 SSQ 会出现振荡?可分离性视觉效果
  5. 零填充对频谱的影响

DSP 基础:我建议从 3b1b 的傅里叶变换开始,然后继续DSP 指南第 7-11 章。离散傅里叶变换为使用真实数据进行信号处理奠定了基础。更深入的 DFT 系数在这里,也是3b1b

贡献者(值得注意)

  • David Bondesson : 山脊提取 ( ridge_extraction.py; examples/: extracting_ridges.py, ridge_extraction/README.md)

如何引用

简写:

John Muradeli,ssqueezepy,2020 年。GitHub 存储库,https://github.com/OverLordGoldDragon/ssqueezepy/。DOI: 10.5281/zenodo.5080508

中文提供:

@article{OverLordGoldDragon2020ssqueezepy,
  title={ssqueezepy},
  author={John Muradeli},
  journal={GitHub. Note: https://github.com/OverLordGoldDragon/ssqueezepy/},
  year={2020},
  doi={10.5281/zenodo.5080508},
}

参考

ssqueezepy最初移植自 MATLAB 的Synchrosqueezing Toolbox,由 E. Brevdo 和 G. Thakur [1] 编写。Synchrosqueezed Wavelet Transform 由 I. Daubechies 和 S. Maes [2] 引入,在 [3] 中进行了跟进,并在 [4] 中适应了 STFT。许多实现细节来自[5]。基于[6]的岭提取。

  1. G. Thakur,E. Brevdo,N.-S。Fučkar 和 H.-T。吴。“时变光谱分析的同步压缩算法:鲁棒性特性和新的古气候应用”,信号处理 93:1079-1094,2013。
  2. I. Daubechies,S. Maes。“基于听觉神经模型的连续小波变换的非线性压缩”
  3. I. Daubechies、J. Lu、HT Wu。“同步压缩小波变换:经验模式分解的工具”,应用和计算谐波分析 30(2):243-261,2011。
  4. G. Thakur,HT Wu。“基于同步压缩的非均匀样本瞬时频率恢复”,SIAM 数学分析杂志,43(5):2078-2095,2011。
  5. Mallat, S. “第 3 版信号处理小波导览”
  6. D. Iatsenko、PVE McClintock、A. Stefanovska。“关于从信号的时频表示中的脊中提取瞬时频率”

执照

ssqueezepy 已获得 MIT 许可,可在LICENSE文件中找到。某些源功能可能在其他作者/许可下;请参阅NOTICE.txt

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

ssqueezepy-0.6.3.tar.gz (117.0 kB 查看哈希

已上传 source

内置分布

ssqueezepy-0.6.3-py3-none-any.whl (125.0 kB 查看哈希

已上传 py3