接收fft(signal, nfft)
信号时,nfft 如何改变结果,为什么?例如,我可以为 nfft 设置一个固定值2^18
,还是我需要去2^nextpow2(2*length(signal)-1)
?
我正在通过自相关的 FFT 计算两个信号的功率谱密度(PSD),我想比较结果。由于信号的长度不同,我担心如果我不修复 nfft,这会使比较变得非常困难!
接收fft(signal, nfft)
信号时,nfft 如何改变结果,为什么?例如,我可以为 nfft 设置一个固定值2^18
,还是我需要去2^nextpow2(2*length(signal)-1)
?
我正在通过自相关的 FFT 计算两个信号的功率谱密度(PSD),我想比较结果。由于信号的长度不同,我担心如果我不修复 nfft,这会使比较变得非常困难!
没有内在的理由使用二的幂(在某些情况下它可能会使处理更有效)。
但是,为了使两个不同信号的 FFT“相称”,您确实需要在进行 FFT 之前将一个或其他(或两个)信号补零到相同的长度。
但是,我不得不说:如果您需要问这个问题,那么您可能还没有到达 DSP 学习曲线上的某个点,您将能够对结果做任何有用的事情。你应该给自己买一本关于 DSP 理论的不错的书,例如this。
大多数现代 FFT 实现(包括基于 FFTW 的 MATLAB)现在很少需要将信号的时间序列填充到等于 2 的幂的长度。然而,几乎所有的实现都会为具有 2 次幂长度的数据向量的 FFT 提供更好的,有时甚至更好的性能。特别是对于 MATLAB,填充到 2 的幂或具有许多低素因子的长度将为您提供最佳性能(N = 1000 = 2^3 * 5^3 将是极好的,N = 997 将是一个糟糕的选择) .
零填充不会增加 PSD 中的频率分辨率,但它会减少频域中的 bin 大小。因此,如果将 NZeros 添加到长度为 N 的信号向量,FFT 现在将输出长度为 ( N + NZeros )/2 + 1 的向量。这意味着每个频率箱现在的宽度为:
Bin 宽度 (Hz) = F_s / ( N + NZeros )
其中 F_s 是信号采样频率。
如果您发现需要在频域中分离或识别两个紧密间隔的峰值,则需要增加采样时间。您会很快发现零填充对您没有任何好处 - 直观地说,这就是我们所期望的。在我们的输入中没有添加更多信息(更长的时间序列)的情况下,我们如何才能在我们的功率谱中获得更多信息?
最好的,
保罗