为什么必须翻转 y 轴才能在 Python 中进行 cwt 分析以与 Matlab cwt 函数进行比较

Why does the y-axis have to be flipped for a cwt analysis in Python to compare to the Matlab cwt function

对于找到的音频文件 here,我正在使用 Python 中的 ssqueezepy 库来生成信号的 cwt。这是我的 Python 代码:

import librosa
import librosa.display
import numpy as np
from ssqueezepy import cwt
from ssqueezepy.visuals import plot, imshow
import numpy as np
import matplotlib.pyplot as plt
import soundfile as sf

# Set the path to the Binary Class dataset
input_file = (r'G:/audio/AWCK AR AK 47 Close 01_trim-pt5_16bit_norm-1_Mono.wav')


[data1, sample_rate1] = sf.read(input_file)
#[sample_rate1, data1] = wav.read(input_file);
duration = len(data1)/sample_rate1

time = np.arange(0, duration, 1/sample_rate1) #time vector

 
#%%##############            Take CWT & plot                ##################################################
Wx, scales = cwt(data1, 'morlet')
imshow(Wx, yticks=scales, abs=1,
       title="abs(CWT) | Morlet wavelet",
       ylabel="scales", xlabel="samples")

plt.show()

这是生成的尺度图:

当我使用 Matlab 时:

%% preparing dataset

input_file = ['G:\audio\AWCK AR AK 47 Close 01_trim-pt5_16bit_norm-1_Mono.wav'];
 
[y,Fs] = audioread(input_file);
   
%% Display scalogram

cwt(y, "bump", Fs)

我得到这个情节:

当您查看 y 轴时,Python 的 y 轴是倒置的,但 Python 和 Matlab 图看起来相似。

你能解释一下为什么会有差异吗?如何让Python在坐标轴透视上与Matlab匹配?

看看 this GitHub package scaleogram,它建立在 PyWavelet 上,但可以制作看起来更像 Matlab 输出的绘图。

基本上,在较高的分解级别上,您观察到的信号的比例会变大(细节较少)。在最简单的离散级别的情况下,比例在每个级别都加倍(您可以将比例视为每个级别的过滤器长度),您会得到:

level scale frequency
0 2 256
1 4 128
2 8 64
3 16 32
4 32 16
5 64 8
6 128 4
7 256 2

如您所见,比例和频率随级别呈指数变化,这就是您分别在 Pywavelet(比例)和 Matlab(频率)图中看到的。 Matlab 图对 y 刻度使用对数刻度(仅 10 的每一次幂),我认为这在眼睛上更容易一些。 scaleogram 包控制 y 轴上的单位 at this line