0

读完一个没有。这里的帖子本身我已经在录制的音频(.wav)文件上应用了 FFT 算法,以将其从时域转换为频域。

结果,我得到了一个包含一些值的数组

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

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

4

1 回答 1

1

如果您只是在寻找单个最大(正弦)分量然后扫描幅度数组直到找到最大值,然后将该值的索引转换为其对应的频率,即

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;
    }
}

您现在有峰值 in 的值mag_max及其索引 in i_max。你可以得到这样的频率:

f_max = i_max * Fs / N;

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

当然,如果您正在寻找诸如复杂声音(例如人声或乐器)的音高之类的东西,那么事情会变得更加复杂。您可能想了解一下 Harmonic Product Spectrum 算法和音高检测算法

于 2013-05-21T08:38:39.530 回答