【发布时间】:2016-05-02 00:33:20
【问题描述】:
我在管理 FFT 数据时遇到了一点问题。我一直在寻找许多有关如何进行 FFT 的示例,但我无法从其中任何一个中得到我想要的。我有一个采样率为 44kHz 的随机波文件,我想每 X 毫秒获得 N 个谐波的幅度,假设 100 毫秒就足够了。我试过这段代码:
import scipy.io.wavfile as wavfile
import numpy as np
import pylab as pl
rate, data = wavfile.read("sound.wav")
t = np.arange(len(data[:,0]))*1.0/rate
p = 20*np.log10(np.abs(np.fft.rfft(data[:2048, 0])))
f = np.linspace(0, rate/2.0, len(p))
pl.plot(f, p)
pl.xlabel("Frequency(Hz)")
pl.ylabel("Power(dB)")
pl.show()
这是我使用的最后一个示例,我在 stackoverflow 的某个地方找到了它。问题是,这得到了我想要的幅度,得到了频率,但根本没有时间。据我所知,FFT 分析是 3D 的,这是所有谐波的“合并”结果。我明白了:
X-axis = Frequency, Y-axis = Magnitude, Z-axis = Time (invisible)
根据我对代码的理解,t 是时间 - 看起来是这样,但在代码中不需要 - 不过我们可能会需要它。 p 是幂(或幅度)数组,但它似乎是每个频率 f 的所有幅度的平均值,这是频率数组。我不想要平均值/合并值,我想要每 X 毫秒 N 次谐波的幅度。
长话短说,我们可以得到:所有频率的 1 个量级。
我们想要:N 个频率的所有幅度,包括存在某个幅度的时间。
结果应如下所示:[时间、频率、幅度] 所以最后如果我们想要 3 个谐波,它看起来像:
[0,100,2.85489] #100Hz harmonic has 2.85489 amplitude on 0ms
[0,200,1.15695] #200Hz ...
[0,300,3.12215]
[100,100,1.22248] #100Hz harmonic has 1.22248 amplitude on 100ms
[100,200,1.58758]
[100,300,2.57578]
[200,100,5.16574]
[200,200,3.15267]
[200,300,0.89987]
不需要可视化,结果应该只是上面列出的数组(或哈希/字典)。
【问题讨论】:
-
快速傅里叶变换 (FFT) 算法计算序列的离散傅里叶变换 (DFT) 或其逆。傅立叶分析将信号从其原始域(通常是时间或空间)转换为频域中的表示,反之亦然。一旦对原始信号应用傅立叶变换,我认为您不应该有时间。它被转换为频域。同样,当您对频域信号应用傅里叶逆变换时,您会得到时域信号。在这里阅读更多。 en.wikipedia.org/wiki/Fast_Fourier_transform
-
感谢您的评论,尽管您向我解释了算法是如何工作的,但我仍然不知道是否可以从中获得这样的输出,或者是否需要完全不同的方式。分别如何,如果不使用 FFT,你能得到我描述的输出。知道精确到一点 FFT 的工作原理并不能解决问题。
-
嗯..如果我逆傅立叶变换,我会得到时域信号,但那是原始的,不是吗?除此之外,我仍然不知道在哪里可以得到所有三个值。
标签: python numpy matplotlib scipy fft