【问题标题】:How to translate cwt time scale to actual scale如何将 cwt 时间比例转换为实际比例
【发布时间】:2022-10-25 04:11:50
【问题描述】:

我使用以下代码将 1sec 音频文件转换为 morlet 小波:

import matplotlib.pyplot as plt
import soundfile as sf
import skimage.io
from scipy import signal
from scipy.io import wavfile
import numpy as np
from ssqueezepy import cwt
from ssqueezepy.visuals import plot, imshow

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

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

Wx, scales = cwt(data1, 'morlet')
Wx = abs(Wx) # remove complex component
imshow(Wx,  abs=1)

但是,我得到的 x 轴以千为单位显示....实际时间如何与 ssqueezepy cwt 代码生成的 x 轴相对应?这是我的 1sec 音频文件的情节:

【问题讨论】:

  • sample_rate1 的值是多少?
  • @Sheldon,sample_rate 是 96000 Hz。音频文件的持续时间为 1 秒。

标签: python-3.x wavelet


【解决方案1】:

获得 x 轴值的原因在成千上万是因为这是数组中的实际样本数。

您正在处理以 96,000 Hz 采样的 1 秒信号:因此,您最终得到 96,000 个样本。

如果您想在横坐标上显示以秒为单位的实际时间,您可以使用imshow 中的extent 参数,如this SO post 中所述。您可能还希望在 y 轴上显示 cwt 函数返回的实际 scales

SR = 96000
number_of_samples_in_array = 96000
time_samples = np.linspace(0, number_of_samples_in_array/SR, SR)
imshow(Wx,abs=1,extent=[time_samples[0], time_samples[-1],scales[0],scales[-1]])

我在以 22050 Hz 采样的 3 秒 wav 文件上运行了这个 sn-p(CantinaBand3.wav可用here) 这就是我得到的:

请注意刻度如何一直上升到奈奎斯特频率 (11,025 Hz)。在您的情况下,y 轴应该从 0 到 48,000 Hz。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2020-02-10
    • 2017-07-25
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多