【问题标题】:Time steps difference in spectrogram频谱图中的时间步长差异
【发布时间】:2021-01-16 01:40:57
【问题描述】:

我有一个 10 秒长的音频文件。如果我使用matplotlib 生成spectrogram,那么与librosa 生成的频谱图相比,我得到的时间步数不同。

代码如下:

fs = 8000
nfft = 200
noverlap = 120
hop_length = 120

audio = librosa.core.load(path, sr=fs)

# Spectogram generated using matplotlib
spec, freqs, bins, _ = plt.specgram(audio, nfft, fs, noverlap = noverlap)

print(spec.shape) # (101, 5511)


# Using librosa
spectrogram_librosa = np.abs(librosa.stft(audio,
                                              n_fft=n_fft,
                                              hop_length=hop_length,
                                              win_length=nfft,
                                              window='hann')) ** 2
spectrogram_librosa_db = librosa.power_to_db(spectrogram_librosa, ref=np.max)

print(spectrogram_librosa_db.shape) # (101, 3676)

有人可以向我解释一下为什么时间步长存在巨大差异以及如何确保两者产生相同的输出?

【问题讨论】:

    标签: python matplotlib signal-processing fft librosa


    【解决方案1】:

    这是因为plt.specgramnoverlap 考虑了与音频片段重叠的点数,而hop_length 考虑了片段之间的步长。

    话虽如此,两个结果之间仍然存在 2 分的差异,但这很可能是由于边界造成的。

    import numpy as np
    import librosa
    import matplotlib.pyplot as plt
    
    path = librosa.util.example_audio_file()
    fs = 8000
    nfft = 200
    noverlap = 120  # overlap
    hop_length = 80  # step
    
    audio, fs = librosa.core.load(path, sr=fs)
    
    # Spectogram generated using matplotlib
    spec, freqs, bins, _ = plt.specgram(
        audio, NFFT=nfft, Fs=fs, noverlap=noverlap,
    )
    spec = np.log10(spec + 1e-14)
    
    print(spec.shape)  # (101, 6144)
    
    
    # Using librosa
    spectrogram_librosa = (
        np.abs(
            librosa.stft(
                audio,
                n_fft=nfft,
                hop_length=hop_length,
                win_length=nfft,
                window="hann",
            )
        )
        ** 2
    )
    spectrogram_librosa_db = librosa.power_to_db(spectrogram_librosa, ref=np.max)
    
    print(spectrogram_librosa_db.shape)  # (101, 6146)
    
    fig, ax = plt.subplots(2)
    ax[0].pcolorfast(spec)
    ax[1].pcolorfast(spectrogram_librosa_db)
    plt.show()
    

    这样输出如下图片:

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 2020-01-12
      • 2015-12-10
      • 2011-03-18
      • 1970-01-01
      • 2021-03-25
      • 2017-09-08
      • 1970-01-01
      相关资源
      最近更新 更多