fftw分析来自PC

时间:2017-04-23 20:18:25

标签: c++ audio normalization fftw

我正在使用fftw来分析从麦克风输入到计算机的音频输入的频谱。我使用portaudio c ++库来捕获时域音频数据的窗口,然后fftw将这个数据的真实到复杂的r2c转换到频域。下面是我每次收到数据块时都会调用的函数。

采样率为每秒44100个样本,样本类型很短(有符号16位整数),我在每个窗口中占用250ms的数据块。因此fft分辨率为4Hz。

问题是,我不确定如何解释转换后我收到的数据。当没有播放音频时,对于每个频率分量,我获得大约1000到4000的幅度,例如,一旦从乐器播放音频,所有幅度都变为负。

我尝试在fft之前进行归一化,除以平均功率,然后数据更有意义。当没有播放时,所有幅度都从200到500,然后例如如果我播放76Hz的音调,该组件的幅度增加到大约2000.所以这是我所期望的,但仍然不确定是否这个过程可以更好地实施。

我的问题是,我在这里做对了吗?数据必须正常化吗?我做得对吗?为什么我仍然在未播放的频率上获得高振幅。有没有人做任何相似的事情的经验,也许给一些提示。非常感谢提前。

void AudioProcessor::GetFFT(void* inputData, void* freqSpectrum)
{
    double* input = (double*)inputData;
    short* freq_spectrum = (short*)freqSpectrum;

    fftPlan = fftw_plan_dft_r2c_1d(FRAMES_PER_BUFFER, input, complexOut, FFTW_ESTIMATE);

    fftw_execute(fftPlan);

    ////

    for (int k = 0; k < (FRAMES_PER_BUFFER + 1) / 2; ++k)
    {
        freq_spectrum[k] = (short)(sqrt(complexOut[k][0] * complexOut[k][0] + complexOut[k][1] * complexOut[k][1]));
    }

    if (FRAMES_PER_BUFFER % 2 == 0) /* frames per buffer is even number */
    {
        freq_spectrum[FRAMES_PER_BUFFER / 2] = (short)(sqrt(complexOut[FRAMES_PER_BUFFER / 2][0] * complexOut[FRAMES_PER_BUFFER / 2][0] + complexOut[FRAMES_PER_BUFFER / 2][1] * complexOut[FRAMES_PER_BUFFER / 2][1]));  /* Nyquist freq. */
    }
}

0 个答案:

没有答案