我知道有很多关于从 FFT 中找到音高的主题,并且我已经对从时域 -> 频域转换数据样本的整个过程有了不错的理解,但是仍然有一些领域(可能更高级) 我有点坚持。
我将逐步完成我当前的流程,希望有人可以帮助我了解我哪里出错了!
在开始之前,我在这里使用的示例是我在 Logic 中创建的 Wav 文件,它只是A 音阶中的钢琴预设,从Key A4开始,它只是向上移动音阶(A4、B4、C# 5, D5...) 每半个小节以120 bpm共4 秒。如果有帮助,这是 wav 的链接:[a https://www.dropbox.com/s/zq1u9aylh5cwlmm/PianoA4_120.wav?dl=0]
第 1 步:
我解析出元数据和实际的样本数据。元数据:
channels => 2,
sample_rate => 44100,
byte_rate => 176400,
bits_per_sample => 16,
data_chunk_size => 705600,
data => ...
第 2 步: 由于有 2 个通道,我有一个左右数组,其中包含相应的样本数据,然后将它们中的每一个都通过 FFT。每个 FFT 的结果给出了给定频率的幅度和相位
第 3 步:
我现在需要找到每个 FFT 的最大值。我通过找到真实/复杂结果的所有大小然后找到最大值来做到这一点。我正在使用 Matlab 来帮助我,所以我运行max(abs(fft(data)))
. 我从找到每个 FFT 的最大值中得到的值是1275.6和1084.0。
第 4 步: 从它们各自的 FFT 中找到这些最大值的索引,然后在映射的频域值的该索引处找到频率。这给了我1177.0 Hz和1177.5 Hz。
这就是我困惑的地方!我已经绘制了时域图,并通过查看 Period 并知道 A4 的周期是如何发现音高是A4,但我试图了解如何通过快速傅里叶变换。任何帮助/指向我的地方将不胜感激!