为什么来自librosa库的频谱图比实际音频轨道的时间持续时间长一倍?

3
我正在使用以下代码从约30秒的录音信号中获取Mel频谱图:
spectrogram =  librosa.feature.melspectrogram(y=self.RawSamples,sr=self.SamplingFrequency, n_mels=128, fmax=8000)

if show:
    plt.figure(figsize=(10, 4))
    librosa.display.specshow(librosa.power_to_db(self.Spectrogram, ref=np.max), y_axis='mel', fmax=8000, x_axis='time')
    plt.colorbar(format='%+2.0f dB')
    plt.title('Mel spectrogram')
    plt.tight_layout()

获得的频谱图:Mel频谱图 请问你能解释一下为什么时间轴显示的时间持续两倍(应该是30秒)。代码出了什么问题吗?

你的原始样本是来自立体声文件吗? - Paul R
是的,它是一个立体声 wav 文件 @PaulR - LiukPet
好的 - 如果您将样本视为单通道,则持续时间将增加一倍。 - Paul R
你知道在调用librosa的spectrogram方法时有没有任何属性可以设置以避免这种情况吗?顺便说一句,非常感谢您的回答,对我帮助很大@PaulR - LiukPet
我不熟悉这个特定的库,但是应该很容易提取单个(左或右)通道,或将两个通道合并成一个(单声道)通道,然后进行处理。 - Paul R
也许可以尝试使用 librosa.core.to_mono 函数? - Paul R
2个回答

3

你需要将采样率传递给 librosa.display.specshow (sr=self.SamplingFrequency)。如果没有传递,它会默认为20050,如果self.SamplingFrequency的值不同,则会显示错误的长度。


我正在使用12000采样率的90秒音频进行工作。频谱图显示的时间持续时间不正确,但是频谱图本身是正确的,对吗? - LotOfQuestion
很可能。但最好向specshow传递正确的选项以验证您的期望是否如预期。 - Jon Nordby
我的代码看起来像这样:<br/> data, sr = librosa.load(file_name, sr=None, duration=90)<br/> D = librosa.amplitude_to_db(np.abs(librosa.stft(data)), ref=np.max)<br/> librosa.display.specshow(D, y_axis='linear', x_axis='time', sr=12000)<br/> 我传递的参数有问题吗? - LotOfQuestion
看起来差不多正确。但如果您有问题,应该开一个新的问题。 - Jon Nordby
现在频谱图显示了正确的持续时间,但是采样率不对:(。无论如何,还是非常感谢您:) - LotOfQuestion

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接