python - 返回 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))
解决方案
使用复数是因为这是表示每个 DFT 结果的幅度和相位的一种数学上优雅的方式。
FFT 结果向量的 bin 或元素索引与变换基向量的频率相关。通常,对于 FFT 结果向量的前半部分:
basis_vector_frequency = index * sample_rate / FFT_length
然而,由于窗口效应,每个变换基向量的频率可能与输入信号的某些成分的频率完全匹配,也可能不完全匹配。
推荐阅读
- javascript - 如何在 litelement 中实现 select2
- c# - arm64 无法使用 asp.net 内核
- java - 为什么 Web 应用程序的 Solr 搜索引擎在搜索“Spring Fertility”时会返回“Java Spring”结果?如何解决这个问题?
- python - Python 2.7:urllib2.urlopen(request) 不适用于 Django
- mysql - 如何计算具有特定值的数据库中的列数(查询)
- prometheus - Prometheus 中的实例标签问题
- plugins - 如何修复“异常 - 在 null 上调用成员函数 customdata()”错误?
- python - 如何持久化python字典?
- c++ - 解决编译器错误 C2678 时遇到问题
- python - 我想使用 aioredis 连接池,而不是在每个 AsyncWebsocketConsumer.connect 中创建新连接。我可以把代码放在哪里