Python:如何使用Python从wav文件中计算随时间变化的频率?

6
我正在使用scipy的wavfile库读取wav文件。
rate, data = scipy.io.wavfile.read(filename)

这将返回给定wav文件名的速率和RAW数据。

我需要对数据数组进行什么转换才能从原始数据到频率?

我了解使用FFT可以转换到频域,但我想转换到时域。

非常感谢任何帮助! :)


“我想进入时域”是什么意思?是指在短时间间隔内的频率吗?是哪种频率?均值、中位数、众数、音高、峰值……?FFT 确实可以返回所有频率。 - Lukasz Tracewski
我猜测在频率与时间以及振幅与时间的表示中,最常用的是频率的平均值? - Eduardo Morales
我很高兴它能帮到你!请注意,如果您想了解声音的特性,可能还有许多其他功能需要计算。这超出了问题的范围,但您可以给我发送电子邮件或更多的SO音频问题 :)。 - Lukasz Tracewski
1个回答

3
这将为您提供给定信号的平均频率:
def spectral_statistics(y: np.ndarray, fs: int) -> float:
    """
    Compute mean frequency

    :param y: 1-d signal
    :param fs: sampling frequency [Hz]
    :return: mean frequency
    """
    spec = np.abs(np.fft.rfft(y))
    freq = np.fft.rfftfreq(len(y), d=1/fs)    
    amp = spec / spec.sum()
    mean = (freq * amp).sum()
    return mean 

正如您所说,您可以使用scipy读取波形。如果您想获得音频块的频率,只需将数组分成几部分,并将每个部分分别传递给函数。


谢谢!通常使用哪些块大小最常见? :) - Eduardo Morales
1
没有“适用于所有”的“大小”。它可以短至20毫秒或长达0.5秒。这完全取决于您的应用程序、采样频率(越大,您可能能够使用更精细的分辨率)、信号特性等。您可以从100和200毫秒开始。 - Lukasz Tracewski

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