Python FFT音频文件

Posted

技术标签:

【中文标题】Python FFT音频文件【英文标题】:Python FFT an audio file 【发布时间】:2021-10-18 22:37:23 【问题描述】:

我正在尝试从 wav 文件中绘制幅度频谱,文件的采样率为 44.1KHz,我只想计算前 100 个样本的 FFT,因为我正在使用 np.fft.fft()但是我得到了意想不到的结果,请参见图 1。

当我计算至少 2048 个样本的 FFT 时,我只会得到预期的结果。为什么?

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

def normalizeAudio(data):
    return np.float32((data / max(data)))

SAMPLE_FOR = 1 # in seconds
samplerate, data = scipy.io.wavfile.read(r'Recording.wav')
data = normalizeAudio(data[0:int(samplerate*SAMPLE_FOR)])


fft_out = np.fft.fft(data[0:100])
freq_vector = np.arange(0, 44100, 44100 / 100)
plt.plot(freq_vector, np.abs(fft_out))
plt.show()

【问题讨论】:

前 100 个样本中真的有什么有趣的东西吗?毕竟,音频文件以静音开始的情况并不少见 我明白你的意思,有没有办法解决这个问题并且仍然计算 100 的 FFT?也许是抽取? @哈罗德 另外,计算频率需要随着时间的推移进行测量。您拥有的时间越少,您可以覆盖的频域就越少,即使实际上在数据集的那一部分中存在除静默之外的其他东西 【参考方案1】:

看看librosa,它是一个非常好的python音频分析库,包括色谱图、频谱图、打击图和其他很酷的东西。

它有很好的例子,还有很多关于堆栈溢出的其他文档,所以我不会在这里复制它们。

此外,我见过的大多数应用程序都倾向于使用 STFT,即短期傅立叶变换(又名 DFT,离散傅立叶变换)。这仍然比普通的 FFT 快得多,并且对于建模和控制输入形状的东西更有用,并且还消除了 FFT 可以得到的大量噪声,因为它需要窗口而不是瞬时变化。

【讨论】:

以上是关于Python FFT音频文件的主要内容,如果未能解决你的问题,请参考以下文章

在将数据输入 FFT 用于音频频谱分析仪之前,使用 python 将 wav 文件转换为 csv 文件 [关闭]

Python:对音乐文件执行 FFT

如何使用python实现wave音频文件回放

使用 FFT Python 从音频信号中去除背景噪声

返回 Numpys FFT 的数据并在音频文件中找到每秒的幅度和频率

读取音频 wav 文件并绘制在 python 中平滑的音频频率响应