1
  1. 在使用 Apple 文档中的 FFT 示例代码时,N、log2n、n 和 nOver2 究竟是什么意思?
  2. N 是指 fft 的窗口大小还是给定音频中的样本总数,以及
  3. 如何从音频文件中计算 N?
  4. 它们与音频采样率(即 44.1kHz)有何关系?
  5. 此代码中的 FFT 帧大小是多少?

代码:

/* Set the size of FFT. */
log2n = N;
n = 1 << log2n;

stride = 1;
nOver2 = n / 2;

printf("1D real FFT of length log2 ( %d ) = %d\n\n", n, log2n);

/* Allocate memory for the input operands and check its availability,
 * use the vector version to get 16-byte alignment. */
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
originalReal = (float *) malloc(n * sizeof(float));
obtainedReal = (float *) malloc(n * sizeof(float));
4

2 回答 2

4
  1. N 或 n 通常是指元素的数量。log2n 是 n 的以二为底的对数。(32 的以二为底的对数是 5。)nOver2 是 n/2,n 除以 2。
  2. 在 FFT 的上下文中,n 是输入 FFT 的样本数。
  3. n 通常由多种约束条件决定。您需要更多样本以提供更好质量的结果,但您不希望样本太多以致处理占用大量计算机时间,或者直到用户注意到延迟才获得结果。通常,决定大小的不是音频文件的长度。相反,您设计一个用于处理的“窗口”,然后将音频文件中的样本读取到足够大以容纳窗口的缓冲区中,然后处理缓冲区,然后重复文件中的更多样本。重复继续,直到处理完整个文件。
  4. 更高的音频采样率意味着在给定的时间段内会有更多的样本。例如,如果您想将窗口保持在 1/30秒以下,那么 44.1 kHz 的采样率将少于 44.1•1000/30 = 1470 个样本更高的采样率意味着您有更多的工作要做,因此您可能需要调整窗口大小以将处理保持在限制范围内。
  5. 该代码使用Nfor log2n,这是不幸的,因为它可能会使人们感到困惑。否则,代码如我上面所述,FFT 帧大小为n.

当涉及到真实数据和复杂数据的混合时,FFT 的大小或长度可能会有些混淆。通常,对于实数到复数 FFT,实数元素的数量称为长度。在进行复数到复数 FFT 时,复数元素的数量就是长度。

于 2013-03-20T16:52:53.830 回答
2

'N' 是样本数,即您的向量大小。对应的,'log2N'是'N'以2为底的对数,'nOver2'是'N'的一半。

要回答其他问题,必须知道您想用 FFT 做什么。这份文档,即使是在考虑特定系统的情况下编写的,也可以作为关于 (D)FFT 中参数的关系和含义的调查。

于 2013-03-20T07:48:08.187 回答