0

我在这里看到很多关于频率分析的帖子,似乎对我有很大帮助,但我试图记录我的声音并打印出频率,似乎这些值与记录的内容无关,试图提高我的音调和下来看看频率值会发生什么,但是您可以在发布的 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);
}

这是日志猫:

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

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

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

4

2 回答 2

0

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

于 2013-11-12T15:21:43.393 回答
0

您将 FFT 索引错误地转换为倒数第二行代码中的频率。它应该是:

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

除此之外,您的代码很好(据我所知)。尝试通过代码运行一些测试数据并通过麦克风运行一些测试音频来隔离错误。Audacity 是一个非常有用的程序,可以查看音频的频谱图,顺便说一句。

请记住,如果您的采样率对您正在分析的频率施加了限制。这可能就是您的值似乎保持在该范围内的原因

于 2013-11-12T14:29:02.253 回答