2013-03-20 416 views
1
  1. 使用Apple文档中的FFT示例代码时,实际上N,log2n,n和nOver2是什么意思?
  2. N是指fft的窗口大小还是给定音频中样本的整个数量,并且如何从音频文件中计算N?
  3. 它们与音频采样率(即44.1kHz)有什么关系?
  4. 这段代码中的FFT帧大小是多少?

代码: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
  1. N或n通常指的是元素的数量。 log2n是n的基数二对数。 (32的基数为2的对数为5.)nOver2为n/2,n除以2。
  2. 在FFT的上下文中,n是馈送到FFT中的样本的数量。
  3. n通常由各种约束条件决定。你想要更多的样本提供更好的质量结果,但是你不需要太多的样本,处理过程需要大量的计算机时间,或者结果直到如此迟才会出现,以至于用户注意到滞后。通常,它不是音频文件的长度决定大小。相反,您设计了一个您将用于处理的“窗口”,然后从音频文件中将样本读取到足以容纳窗口的缓冲区,然后处理缓冲区,然后再从文件中重复更多样本。重复继续,直到整个文件被处理。
  4. 较高的音频采样率意味着在给定的时间段内会有更多的采样。例如,如果你想保持你的窗口在1/30秒以下,那么44.1kHz采样率将小于44.1×1000/30 = 1470个采样。较高的采样率意味着您有更多的工作要做,所以您可能需要调整窗口大小以使处理保持在限制范围内。
  5. 该代码使用N代替log2n,这很不幸,因为它可能会让人迷惑。否则,代码如上所述,FFT帧大小为n

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

2

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

要回答其他问题,你必须知道,你想用FFT做什么。 (D)FFT中的参数的关系和意义的调查,即使它是用一个特定的系统记录的,也可以作为一个调查。

+0

考虑到有问题的代码包含'log2n = N',在这种情况下'log2N'似乎不是'N'的对数。 – 2013-03-20 17:24:00

+0

@EricPostpischil:看看下一行:移位N对应于2的幂,即N是n的双对数。 – Matthias 2013-03-20 19:57:51

+0

答案中的文字说“'N'是样本的数量”。在问题的代码中,'n'是样本的数量,但是'N'不是,'log2N'也不是'N'的对数,也不是'NOver2'的一半。我知道其他代码中的常见用法是'N'是样本的数量,但问题中的代码并非如此,这意味着此答案包含不正确的语句。 – 2013-03-20 20:00:59