【发布时间】:2019-07-09 21:11:10
【问题描述】:
所以,我想弄清楚如何在实践中使用 DFT 来检测信号中的普遍频率。我一直在试图弄清楚傅里叶变换是什么以及 DFT 算法是如何工作的,但显然我还有很长的路要走。我编写了一些代码来生成信号(因为目的是处理音乐,所以我生成了一个大 C 和弦,因此产生了奇怪的频率值),然后尝试回到频率数字。这是我的代码
sr = 44100 # sample rate
x = np.linspace(0, 1, sr) # one second of signal
tpi = 2 * np.pi
data = np.sin(261.63 * tpi * x) + np.sin(329.63 * tpi * x) + np.sin(392.00 * tpi * x)
freqs = np.fft.fftfreq(sr)
fft = np.fft.fft(data)
idx = np.argsort(np.abs(fft))
fft = fft[idx]
freqs = freqs[idx]
print(freqs[-6:] * sr)
这给了我[-262. 262. -330. 330. -392. 392.]
,这与我编码的频率(261.63、329.63 和 392.0)不同。我做错了什么,我该如何解决?
【问题讨论】:
-
好吧,你还没有说你希望看到的,所以不可能说。
-
从我的描述中我认为这相当清楚。我希望看到我输入信号的频率,261.63、329.63 和 392
-
@MadWombat 因为您的存储桶(样本)与以 Hz 为单位的采样率一样多,因此最大理论分辨率为 1Hz - 因此,如果没有更多样本,这实际上是不可能的。
-
@MadWombat,您更新了代码,但没有更新您声明的输出。
-
@MadWombat 如果您没有足够的 samples,则更高的采样率没有任何影响。可用频率桶的最大数量为
number of samples / 2(也有负分量)