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

Posted

技术标签:

【中文标题】返回 Numpys FFT 的数据并在音频文件中找到每秒的幅度和频率【英文标题】:Return data of Numpys FFT and finding amplitude and frequencies per second in audio file 【发布时间】:2020-04-26 20:44:40 【问题描述】:

在过去的几天里,我一直在学习如何为我在 python 中做的音频可视化项目读取 wav 文件。项目进展顺利,但我对读取 wavfile 所返回的数据以及从 np.fft.fft() 中返回的复数数组有一些疑问

所以刚开始复数代表什么?实部和虚部?

我真正的问题在这里: 我还被告知频率是复数的索引位置是真的吗?

加载音频文件并通过 FFT 运行后,例如,我可以得到一个长度为 10591232 的数组,这是一个非常大的数字,我的想法是取该数字并按顺序除以音频采样率获取每秒使用的频率列表

这种想法是错误的吗?如果是这样,应该怎么做?我将在下面发布我的代码以展示我的想法,对不起,我一直在搜索无数 *** 帖子并得到了很多不同的答案。再次感谢阅读!

sample_rate, data = wavfile.read(sound_file)

channel_num = data.shape[1]
audio_length = data.shape[0] / sample_rate
time = np.linspace(0., audio_length, data.shape[0])

frequencies = np.fft.fft(time)
frequencies_per_second = np.array_split(frequencies, len(frequencies) / sample_rate)

pprint(len(frequencies_per_second[1]))
print(len(frequencies))

【问题讨论】:

这个问题显示了对 FFT 和音频分析的广泛误解,以至于需要一些教科书的简短介绍性章节来修复您的知识,这个评论框不适合。此外,我敢打赌你实际上对音高感兴趣,而不是 FFT 频率,它们不是一回事。 您是否愿意至少解释一下与该问题相关的内容?你告诉我我对这个主题一无所知,这太棒了,这很明显,但我至少想要一个起点。谢谢 【参考方案1】:

使用complex number 是因为这是一种表示每个 DFT 结果的幅度和相位的数学上优雅的方式。

FFT 结果向量的 bin 或元素索引与变换基向量的频率相关。通常,对于 FFT 结果向量的前半部分:

basis_vector_frequency = index * sample_rate / FFT_length

但是,由于窗口效应,每个变换基向量的频率可能与输入信号的某些成分的频率完全匹配,也可能不完全匹配。

【讨论】:

以上是关于返回 Numpys FFT 的数据并在音频文件中找到每秒的幅度和频率的主要内容,如果未能解决你的问题,请参考以下文章

将 FFT 转换为频谱图

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

Python FFT音频文件

FFTW 从 numpy.fft 产生不同的结果

OS X 环境中的音频文件 FFT

我如何获得定义频带中的所有 fft bin 数量?