我建议您远离您的代码,并首先掌握执行 fft 调用并理解从该调用返回的结果的能力......要么读入已知频率的 sin 曲线,要么只编写一个函数来填充一个数组浮点正弦曲线(这是您的时域信号)...然后将该数组输入 fft 调用,该调用通常会返回给您一个新的复数数组...这个新数组的每个元素现在位于频域表示一个频率值...一个频率区间...该频率的幅度可以使用计算
nyquist_limit_index := int(number_of_samples / 2)
curr_freq := 0.0
incr_freq := flow_data_spec.sample_rate / number_of_samples
for index, curr_complex := range complex_fft {
if index <= nyquist_limit_index {
curr_real = real(curr_complex) // pluck out real portion of imaginary number
curr_imag = imag(curr_complex) // ditto for im
curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples
curr_theta = math.Atan2(curr_imag, curr_real) // phase shift of this freq
curr_dftt := discrete_fft { // populate a struct of current array element
real: 2.0 * curr_real,
imaginary: 2.0 * curr_imag,
magnitude: curr_mag,
theta: curr_theta,
}
// optionally stow curr_dftt for later
}
curr_freq += incr_freq
}
其中 number_of_samples 只是您输入 fft 调用的时域数组的长度
上面的代码向您展示了如何遍历从较早的 fft 调用返回给您的复数的频域数组......上面是伪代码而不是 python,但您的过程可能会非常相似
要识别具有最大幅度的频率( curr_freq ),只需跟踪在上述循环中哪个 curr_freq 具有最大幅度......在我们的玩具设置中,您可能很清楚源输入正弦曲线的频率,因此相同的频率应该弹出为上面最大量级的 curr_freq ......在你得到这个工作并且它的概念沉入之后,然后将你学到的东西应用到你手头的任务中 - 祝你好运
傅立叶分析及其各种咒语非常强大,可以打开许多门。这是一个需要思考的话题,但是如果我们允许自己简单地将一些 api 调用连接在一起以使某些东西正常工作,我们确实错过了一些非常神奇的东西