2013-03-12 119 views
0

我一直在试图找到导致峰值频率的DFT(或FFT)的简单实现。然而,我见过的大多数实现都会输出一个复数的数组。如何将这些基数为2的结果转换为具体的频率?在音频信号中寻找峰值频率?

例如,我有输入数据是500之间振荡的正弦波函数的16个样本 - 2000Hz的,像这样:

int n = 16;  
double[] input = { 1250, 1537, 1780, 1943, 2000, 1943, 1780, 1537, 
      1250, 963, 720, 557, 500, 557, 720, 963 }; 

现在,我假定从该峰值频率因为(2000 - 500)/ 2 = 750,所以它恰好是750赫兹。

我正在考虑我的采样率Fs = 2000 Hz,因为那是我限制正弦波的上限。每个bin k的中心频率定义为k * Fs/n,因此我的bin是125 Hz,250 Hz,375 Hz,500 Hz,625 Hz和750 Hz。但是因为我的振动下限是500赫兹,所以我假设我需要用500赫兹来抵消箱子,因此它们变成:750 Hz, 825 Hz, 1000 Hz, 1125 Hz, 1250 Hz, 1375 Hz, 1500 Hz

然后,使用jtransforms' DoubleFFT_1D类,我发现了一些FFT数据:

DoubleFFT_1D fft = new DoubleFFT_1D(n); 
fft.realForward(input); 

输入变量现在包含:

[20000.0, 0.0, -4.547473508864641E-13, -5999.381020591891, 0.0, 0.0, -1.6292522886374172E-14, 1.1183950775908065, 0.0, -0.0, 1.6292522886374172E-14, -0.7488526914476931, 0.0, 0.0, 4.547473508864641E-13, -1.2482683609296146] 

分组中的光的阵列值来更容易理解的形式(一些信息我得到了elsewhere在SO中):

20000.0           [sum of input array values] 
0.0,           [1625 Hz] 
-4.547473508864641E-13, -5999.381020591891,  [re1 and im1] [750 Hz] 
0.0, 0.0,          [re2 and im2] [875 Hz] 
-1.6292522886374172E-14, 1.1183950775908065, [re3 and im3] [1000 Hz] 
0.0, -0.0,          [re4 and im4] [1125 Hz] 
1.6292522886374172E-14, -0.7488526914476931, [re5 and im5] [1250 Hz] 
0.0, 0.0,          [re6 and im6] [1375 Hz] 
4.547473508864641E-13, -1.2482683609296146  [re7 and im7] [1500 Hz] 

Tw o问题:

  1. 我对频率点的假设是否正确?
  2. 我现在如何通过总结一些幅度从这些数据中获得峰值频率?

谢谢。

+3

注意:“基数-2”是FFT的内部实现细节。结果简单“复杂”。 – 2013-03-12 09:20:21

回答

0

用于每个频率段,你应该有两个值,实际(x)和虚部(Y)的平方和给你在这个频率幅度:

magnitude = sqrt(x*x + y*y); 

但如果你只是想发现高峰期,你不需要平方根,只要找到最高

magSquared = x*x + y*y 
+1

该OP想找到一个频率... – 2013-03-12 09:21:02

+0

@OliCharlesworth好点。 – 2013-03-12 09:22:50

1

根据定义的频率,输出值的FFT的不是频率; 变量(即图上的轴)是频率。你想要做的是找到复杂结果的大小来获得绝对值,但这些不是频率 - 相反,产生最大峰值的值是你想要的频率。

如果您不确定,复数的大小在Wikipedia上描述。它只是真实和复杂部分平方和的平方根,然而为了找到最大值,您显然不需要计算平方根。

+0

“输入是频率”充其量是误导性的。 – 2013-03-12 09:25:23

+0

同意。在我的脑海中似乎是正确的,我会尝试对它进行更好的说明。 – jazzbassrob 2013-03-12 09:25:55

+0

谢谢你的回答,但我仍然感到困惑。请参阅我对原始问题的编辑。 – Pompair 2013-03-12 10:26:39