2013-05-21 42 views
0

阅读没有找到后音频信号的频率和幅度。这里的帖子本身我已经在录制的音频(.wav)文件上应用了一种FFT算法,将其从时域转换到频域。爪哇 - 利用FFT

因此,我已经得到含有一些值数组作为

magnitude[i] = sqrt(re*re+im*im); 

现在,作为标题说我有使用这种大小阵列找到信号(复杂的声音即语音)的频率和幅度,但是我不知道如何使用这个阵列做进一步的处理。FFT的大小是1024,采样率是48000Hz。 请帮我进一步处理。

回答

0

如果你只是希望对单一最大(正弦)分量然后通过大小阵列扫描,直到找到最大值,那么这个值的指数转换成其对应的频率,即

mag_max = magnitude[0]; 
i_max = 0; 
for (i = 1; i < N; ++i) 
{ 
    if (magnitude[i] > mag_max) 
    { 
     mag_max = magnitude[i]; 
     i_max = i; 
    } 
} 

您现在拥有mag_max峰值和i_max索引值。你可以得到的频率是这样的:

f_max = i_max * Fs/N; 

其中Fs是采样率(和N当然是FFT的大小)。

当然,如果你正在寻找的东西像一个复杂的声音(例如语音或乐器)的间距那么事情就会变得很多更加复杂。您可能需要查看一般的谐波产品频谱算法和pitch detection algorithms

+0

感谢您的快速帮助保罗,是因为你说,我想找到频率。和一个复杂的声音幅度。那么我应该如何处理它与这个幅度数组呢? – Panky90

+0

如果你想做* pitch *检测,那么你真的需要回到绘图板。使用基于FFT的方法是可能的,但它不是微不足道的(参见“谐波产品谱”),并且有更好的方法。以[维基百科页面上的音高检测](https://en.wikipedia.org/wiki/Pitch_detection_algorithm)为出发点。 –

+0

好的保罗,我会通过该wiki页面。但是,你有一些Java实现的任何这样的算法或Java库,可以为我的目的吗? – Panky90