【问题标题】:Further understanding of fftw processing of portaudio signals进一步理解对portaudio信号的fftw处理
【发布时间】:2016-06-12 14:26:24
【问题描述】:

我想使用portaudiofftwpp 分析从我的麦克风端口获得的信号。为此,我遵循了here 提供的解释。我现在的问题是:
那里说我应该从传入的数据中分块一个窗口。我的数据已经被分块了,我只记录了很短的时间,然后处理它。因此,我假设一个矩形窗口已经应用于我的数据。对吗?
现在我得到了 200k 个数据点,我是否应该直接将它们放入数组中:

    Array::array1<Complex> F(np,align);
    Array::array1<double> f(n,align);               // For out-of-place transforms
    //  array1<double> f(2*np,(double *) F()); // For in-place transforms

    fftwpp::rcfft1d Forward(n,f,F);
    fftwpp::crfft1d Backward(n,F,f);
    qDebug() << "Putting " << numSamples << " into an array!";
    for(int i = 0; i < numSamples; i++)
        f[i] = this->data.recordedSamples[i];

或者我应该把它们分开吗?如果我都将它们放在一个数组中,那么我会得到哪种分辨率?我的采样率设置为 44.1 kHz。

【问题讨论】:

    标签: c++ audio fft fftw portaudio


    【解决方案1】:
    因此,我假设已经将矩形窗口应用于我的数据。对吗?
    在某种程度上,窗口通常用于过滤输出信号的突然开/关状态,或减少或重新排序频谱泄漏(https://en.wikipedia.org/wiki/Spectral_leakage

    建议使用窗口,尤其是(非矩形),如果要可视化FFT。查看https://en.wikipedia.org/wiki/Window_function#Hann_.28Hanning.29_window for选项。

    请注意您在 em> fft之前应用窗口

    或者我应该把它们分开吗?

    嗯,这取决于您的要求。但一般来说,它最好不要因为窗口,样品越长,这段时间越准确,虽然那种技术并不罕见,以加快速度。

    我会得到哪个分辨率?

    分辨率是样品速率除以样本计数。

    【讨论】:

    • 我应该在每种情况下应用窗口,即使我不想可视化数据? span>
    • 嗯,这取决于应用程序。应用窗口的主要原因是减少(或重新定位)光谱泄漏(参见en.wikipedia.org/wiki/Spectral_leakage)。如果需要,它完全取决于应用程序。一个说,如果你想象化它不想要的频谱。如果您需要测试1个频率分量的存在,则将执行矩形窗口。根本不应用窗口,从而为您提供相同的结果(提供了确保2 ^ N-FFT规则)。 span>
    • 此处提及替代方法:stackoverflow.com/questions/4082358/… span>
    • 2 ^ n-fft规则意味着我的样本输入大小应等同于2 ^ n? span>
    • @ arc_lupus:是的,这就是我的意思。顺便说一下,与FFT相比,应用窗口并不多CPU努力。我会去窗口,也许可以创建一个选择打开或关闭它的选项,因此您可以看到您的Algotihm的不同结果; - ) span>
    【解决方案2】:

    假设您的数据不是固定的(换句话说,频谱内容是随时间变化的,例如语音或音乐就是这种情况),那么您会通常希望选择一个窗口大小,在此期间数据可以被认为是有点静止的。对于语音和音乐,典型的窗口大小可能是 20 毫秒的数量级。对于 44.1 kHz 的采样率,这对应于 882 个样本,因此 1024 的 FFT 大小可能是一个很好的起点。

    重叠连续窗口也很常见,以便为信号的时变分量获得更好的时间分辨率。通常使用 50% 的重叠,因此您的第一个样本块为 0..1023,第二个块为 512..1535,依此类推。

    正如@Stefan 的回答中已经建议的那样,您应该在 FFT 之前对每个样本块应用合适的窗口函数。常用的窗户是 Hamming 和 von Hann(又名 Hanning)。显然,窗口函数需要与 FFT 的大小相同(例如 N = 1024)。

    对于数据末尾的任何剩余大小

    上述操作的常用术语是生成spectrogram。它本质上是时间 v 频率 v 幅度/相位的 3D 数据结构,可以以各种不同的方式显示或用于进一步的频域处理。

    另请参阅这些密切相关的 StackOverflow 问题和答案:

    【讨论】:

    • 如果我的窗口小于 20 毫秒,我会削减低于某个频率的所有内容。对吗?
    • 嗯,不——你没有“切割”任何东西——窗口大小决定的主要因素是频率分辨率。较长的窗口允许您以较差的时间分辨率为代价获得更高的频率分辨率 - 这始终是一种权衡。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多