matlab中的fft()函数中使用的NFFT是什么?

What is NFFT used in fft() function in matlab?

我有一个频率为 10Khz 的音频信号样本,我需要找到信号的傅里叶系数。我在 mathwork 的网站上看到一个示例,他们使用以下代码对信号 y 进行 fft 分解:

NFFT = 2^nextpow2(L);    
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

其中L是信号的长度,我不太明白为什么要按照上面代码中的方式定义变量NFFT?我不能只为 NFFT 选择任何值吗?另外,为什么我们在上面代码的第三行使用 Fs/2?

NFFT 可以是任何正值,但当样本数量可以分解为小质数时,FFT 计算通常会更有效。引用自 Matlab documentation:

The execution time for fft depends on the length of the transform. It is fastest for powers of two. It is almost as fast for lengths that have only small prime factors. It is typically several times slower for lengths that are prime or which have large prime factors.

因此,通常计算大于或等于信号样本数 y 的 2 的幂的 FFT。这就是 NFFT = 2^nextpow2(L) 所做的(在 Example from Matlab documentation 中,y 被构造为具有长度 L)。 当 NFFT > L 信号被零填充到 NFFT 长度。

fs/2而言,这仅仅是因为实值信号的频谱具有Hermitian对称性(这意味着fs/2以上的值频谱可以从复数中获得-fs/2 以下值的共轭),因此完全从第一个 NFFT/2+1 值指定(索引 NFFT/2+1 对应于 fs/2)。因此,example 没有显示 fs/2 以上的冗余信息,而是选择仅说明 fs/2.

的频谱

对于实值输入,FFT 的输出很复杂。这意味着对于以 Fs Hz 采样的信号,该信号的傅里叶变换将具有从 -Fs/2 到 Fs/2 的频率分量,并且在 0 Hz 处是对称的。 (奈奎斯特准则指出,如果您的信号在 f Hz 处具有最大频率分量,则需要至少以 2f Hz 对其进行采样。

你可能想知道负频率在这里是什么意思。如果你是数学家,你可能会关心负频率,但如果你是工程师,你可能会选择忽略负频率的概念,只关注从 0 到 Fs/2 的频率。 (以 Fs Hz 采样的信号的最大频率分量为 Fs/2)

使用 FFT 了解有关信号中存在的频率分量的更多信息非常麻烦。您可以使用 MATLAB 中的 pwelch 函数来了解信号中存在的更多频率以及这些信号的功率。 MATLAB 将自动计算所需的 NFFT 和 return 信号中存在的频率以及每个频率的功率。使用此语法:

[p,f] = pwelch(x,[],[],[],Fs)

查看 pwelch 的文档以获取更多信息。