gpt4 book ai didi

c++ - 进一步理解portaudio信号的fftw处理

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:47 25 4
gpt4 key购买 nike

我想使用 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。

最佳答案

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

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

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

对于数据末尾大小 < N 的任何剩余样本 block ,您可以只用零填充。

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

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

关于c++ - 进一步理解portaudio信号的fftw处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35701407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com