首页 > 解决方案 > 返回 Numpys FFT 的数据并在音频文件中找到每秒的幅度和频率

问题描述

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

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

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

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

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

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))

标签: pythonnumpyaudiofft

解决方案


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

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

basis_vector_frequency = index * sample_rate / FFT_length

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


推荐阅读