0

我正在使用 fftw3 lib 在 C++ 中计算傅立叶变换。我每次都必须用不同的输入数组反复调用它。我只用大小 MAX_ELEMS 初始化我的数组(在代码中称为“输入”),然后在每次调用时将其用作 fftw_plan 函数的输入(更改内容及其大小)。但是,我每次都会根据数组的实际大小(数组中有效数据样本的数量)更改我的 n_samples。我想知道这是否会在我的执行/准确性方面导致任何问题。

fftw_plan fftw_plan_dft_r2c_1d(int n_samples,
                                double *in, fftw_complex *out,
4

1 回答 1

2

理想情况下,您希望选择特定大小的 FFT 并坚持使用,原因有两个:

  • 相对于 FFT 本身,创建/销毁计划需要花费大量时间,因此如果您为执行的 evert FFT 创建/销毁计划,您将放弃使用 FFTW 的任何速度优势
  • 不同大小的 FFT 的频率分辨率会有所不同,这会给连续输出数据的解释带来麻烦。

理想情况下,您应该使用固定的 FFT 大小,以便您只创建/销毁一次计划。

如果您的数据流是连续的,则只需选择适当的 FFT 大小 N,并将样本累积在缓冲区中,直到您有 N 个样本要处理,然后保存其余样本,直到您再次有 N 个样本。

如果您的数据连续,则选择一个合理大小的 FFT,N,然后当您获得 < N 个样本时,您可以用零填充输入。当您获得 > N 个样本时,您可以丢弃额外的样本。

当然,在所有情况下,您都必须在 FFT 之前应用合适的窗函数。

于 2012-10-15T14:06:41.987 回答