为什么必须翻转 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。
对于找到的音频文件 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。