FFT的大小实际上是啥意思
Posted
技术标签:
【中文标题】FFT的大小实际上是啥意思【英文标题】:What actually does the size of FFT meanFFT的大小实际上是什么意思 【发布时间】:2013-03-20 05:53:05 【问题描述】:-
使用 Apple 文档中的 FFT 示例代码时,N、log2n、n 和 nOver2 究竟是什么意思?
N 是指 fft 的窗口大小还是给定音频中的样本总数,以及
如何从音频文件中计算 N?
它们与音频采样率(即 44.1kHz)有何关系?
此代码中的 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));
【问题讨论】:
【参考方案1】:-
N 或 n 通常是指元素的数量。 log2n 是 n 的以二为底的对数。 (32 的以二为底的对数是 5。)nOver2 是 n/2,n 除以 2。
在 FFT 上下文中,n 是输入 FFT 的样本数。
n 通常由多种约束条件决定。您需要更多样本以提供更好质量的结果,但您不希望样本太多以致处理占用大量计算机时间,或者直到用户注意到延迟才获得结果。通常,决定大小的不是音频文件的长度。相反,您设计一个用于处理的“窗口”,然后将音频文件中的样本读取到足够大以容纳窗口的缓冲区中,然后处理缓冲区,然后重复文件中的更多样本。重复继续,直到处理完整个文件。
更高的音频采样率意味着在给定的时间段内会有更多的样本。例如,如果您想将窗口保持在 1/30th 秒以下,那么 44.1 kHz 的采样率将少于 44.1•1000/30 = 1470 个样本。更高的采样率意味着您有更多的工作要做,因此您可能需要调整窗口大小以将处理保持在限制范围内。
该代码使用
N
代替log2n
,这很不幸,因为它可能会使人们感到困惑。否则,代码如我上面所述,FFT帧大小为n
。
当涉及到真实数据和复杂数据的混合时,FFT 的大小或长度可能会有些混淆。通常,对于实数到复数 FFT,实数元素的数量称为长度。在进行复数到复数 FFT 时,复数元素的数量就是长度。
【讨论】:
【参考方案2】:'N' 是样本数,即您的向量大小。对应的,'log2N'是'N'以2为底的对数,'nOver2'是'N'的一半。
要回答其他问题,您必须知道,您想用 FFT 做什么。 This document,即使是在考虑特定系统的情况下编写的,也可以作为对(D)FFT中参数的关系和含义的调查。
【讨论】:
鉴于有问题的代码包含log2n = N
,在这种情况下,log2N
似乎不是N
的对数。
@EricPostpischil:看下一行:移位 N 对应于 2 的幂,即 N 是 n 的对数。
您答案中的文字显示“'N' 是样本数”。在问题的代码中,n
是样本数,但N
不是,log2N
也不是N
的对数,nOver2
也不是N
的一半。我了解其他代码中的常见用法是N
是样本数,但问题中的代码根本不是这种情况,这意味着这个答案包含不正确的陈述。以上是关于FFT的大小实际上是啥意思的主要内容,如果未能解决你的问题,请参考以下文章