微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在整个音频文件上调用 librosa 函数?

如何解决如何在整个音频文件上调用 librosa 函数?

我有一些简短的音频文件,我正在尝试使用 Librosa 对其进行分析,特别是光谱质心函数。但是,此函数输出一组不同值,表示音频文件内不同帧的频谱质心。 The documentation 表示可以通过在调用函数时指定参数 n_fft 来更改帧大小。如果此功能一次分析整个音频文件而不是在多个时间点输出结果,对我来说会更有益。有没有办法让我指定我希望使用整个音频文件的帧大小而不是认时间(2048个样本)调用函数?还有更好的方法吗?

干杯,谢谢!

解决方法

FFT 窗口的长度 (n_fft) 不仅指定您需要多少样本,还指定结果的频率分辨率(n_fft 越长,分辨率越好)。为确保许多文件的结果具有可比性,您可能希望对所有文件使用相同的 n_fft 值。

除此之外,假设您的文件都包含不超过 16k 的样本。然后您仍然可以实现合理的运行时间(FFT 在 O(N log N) 中运行)。显然,随着文件大小的增加,情况会变得更糟。因此您可以调用 spectral_centroid(y=y,n_fft=16384,hop_length=16384,center=False) 并且因为 hop_length 设置为与 n_fft 相同的值,所以您将为非重叠窗口计算 FFT。并且因为 n_fft 大于所有文件中的最大样本数(在本例中),所以您应该只得到一个值。请注意,我将 center 设置为 False 以避免对您的场景进行不必要的调整。

除了选择长变换窗口之外,您还可以使用 STFT 计算重叠窗口(或帧)的许多值(无论如何 librosa 就是这样做的),然后简单地平均结果值,如下所示:>

import numpy as np
import librosa

y,sr = librosa.load(librosa.ex('trumpet'))
cent = librosa.feature.spectral_centroid(y=y,sr=sr,center=False)
avg_cent = np.mean(cent)
print(avg_cent)

2618.004809523263

后一种解决方案符合 MIR 中通常所做的以及我的建议。请注意,这也允许您使用其他统计函数,例如 中值,这可能是您感兴趣的,也可能不是您感兴趣的。换句话说,您可以确定分布的质心,可以说具有更多的意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。