FFT频率分析似乎得到了错误的价值

时间:2013-11-12 14:10:34

标签: java android audio fft frequency-analysis

我在这里看到很多关于频率分析的帖子,似乎对我很有帮助, 然而我试图录制我的声音并打印出频率,似乎这些数值没有关系 录制的内容,试图上下调整我的声音音高,看看频率值会发生什么, 但是你在logcat上看到的印刷频率有自己的意愿,可能是造成背景噪音的原因:)

以下是我获取频率的代码:

fftArray = FFT.fft(fftTempArray);

MAX = 0;
int index= 0;
for (int i = 0; i < fftArray.length/2; i++) {   
    if (fftArray[i].magnitudes() > MAX) {
        MAX = fftArray[i].magnitudes();
        index = i;                      
    }
    double freq = index * sampleFreq / fftArray.length;
    System.out.println(freq);
}

这是logcat:

11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:40.678: I/System.out(23397): 150.0
11-12 16:01:41.409: I/System.out(23397): 0.0
11-12 16:01:41.409: I/System.out(23397): 0.0
11-12 16:01:41.409: I/System.out(23397): 0.0
11-12 16:01:41.409: I/System.out(23397): 0.0
11-12 16:01:41.409: I/System.out(23397): 0.0
11-12 16:01:41.409: I/System.out(23397): 0.0
11-12 16:01:41.409: I/System.out(23397): 64.0
11-12 16:01:41.409: I/System.out(23397): 75.0
11-12 16:01:41.409: I/System.out(23397): 75.0
11-12 16:01:41.409: I/System.out(23397): 75.0
11-12 16:01:41.419: I/System.out(23397): 107.0
11-12 16:01:41.419: I/System.out(23397): 118.0
11-12 16:01:41.419: I/System.out(23397): 118.0
11-12 16:01:41.419: I/System.out(23397): 118.0
11-12 16:01:41.419: I/System.out(23397): 118.0
11-12 16:01:41.419: I/System.out(23397): 161.0
11-12 16:01:41.419: I/System.out(23397): 161.0
11-12 16:01:41.419: I/System.out(23397): 161.0
11-12 16:01:41.419: I/System.out(23397): 161.0

无论我做什么,它都会保持在这个值范围内。

有人可以尝试帮忙吗? 当我向麦克风发出高音或不同类型的噪音时,频率怎么会不变?

2 个答案:

答案 0 :(得分:0)

您将错误地从FFT索引转换为第二行到最后一行代码中的频率。它应该是:

double freq = index * sampleFreq * 2 / fftArray.length;

除此之外,你的代码很好(据我所见)。尝试通过代码运行一些测试数据并通过麦克风测试一些测试音频来隔离错误。 Audacity是一个v.useful程序,用于查看音频谱图,BTW。

请记住,如果您的采样率对您正在分析的频率施加限制。这可能就是为什么你的价值似乎保持在这个范围内

答案 1 :(得分:0)

您可能会将音调与频谱峰值混淆。尽管它们都具有相同的维度单位(Hz),但是Pitch是一种心理声学现象,可能与频谱峰值(通常是音高更高且变化的音高,有时略微不和谐等)非常不同。因此,音调检测/估计方法不同于FFT频率峰值估计。