【问题标题】:Parameters to control the size of a spectrogram控制频谱图大小的参数
【发布时间】:2018-12-16 21:34:13
【问题描述】:

我正在尝试按照以下说明获取频谱图。

每个音频片段的持续时间为 5 秒。大小相等的帧是 从音频中提取(连续帧之间有重叠),每帧由 1024 样品。 mel-scale 分为 128 个 bin。因此, 音频段的频谱图尺寸为192×128。

据我所知,这条指令在melspectrogram 函数中暗示了n_mels=128n_fft=1024。所以我尝试使用以下代码获取频谱图:

from librosa import load, power_to_db
from librosa.display import specshow
from librosa.feature import melspectrogram

audio_path = r'5s.wav'
y, sr = load(audio_path,sr=44100)
S = melspectrogram(y,sr,n_mels=128,n_fft=1024,hop_length=512)
print(S.shape)

y 的形状是(220500,)sr 的采样率是44100,而我得到的频谱图形状是(128, 431)128 mel-scale 大小是正确的,但我得到的帧数是 431 而不是指令中提到的 192 帧。

为了获得 192 帧,我将采样率更改为 22050 并不断调整 hop_lenght,直到频谱图有 192 帧:

audio_path = r'5s.wav'
y, sr = load(audio_path,sr=22050)
S = melspectrogram(y,sr,n_mels=128,n_fft=1024,hop_length=575)
print(S.shape)

但是,我不确定这是否是获得我想要的频谱图维度的正确方法。似乎这个过程只是反复试验。不知道有没有更科学的方法来得到我想要的形状的频谱图而不用猜测参数值?

【问题讨论】:

    标签: python signal-processing spectrogram librosa


    【解决方案1】:

    如果您将y_shape 的长度除以hop_length - 您将获得帧数:

    220500 / 512 = 430.6
    

    如果需要 192 帧,请在 y 中输入 193 * 512 = 98816 样本。

    【讨论】:

    • 我认为hop_length 表示跳过的样本数以获得下一个窗口的起点。看来您的计算不适用于第二个代码。因为这次我有110250 样本,我的hop_length 是564。使用你的计算110250/564 = 195.5,帧数不是192。
    • @RavenCheuk 如果您有 N 个样本并在这些样本上滑动一个窗口,每次跳过 K 个样本,您可以滑动窗口多少次?
    猜你喜欢
    • 2020-06-23
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2021-03-25
    • 2017-09-08
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多