【问题标题】:What is NFFT used in fft() function in matlab?matlab中fft()函数中使用的NFFT是什么?
【发布时间】:2015-06-08 23:57:17
【问题描述】:

我有一个 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?

【问题讨论】:

  • 最后一行应该是linspace(0, Fs/2, NFFT/2+1) -- 使用最小化舍入误差的函数,然后引入舍入误差有什么意义?

标签: matlab signal-processing fft


【解决方案1】:

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

fft 的执行时间取决于转换的长度。对于 2 的幂,它是最快的。对于只有小的素因数的长度,它几乎一样快。对于素数长度或具有大素数因子的长度,它通常慢几倍。

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

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

【讨论】:

    【解决方案2】:

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

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

    使用 FFT 来详细了解信号中存在的频率分量很麻烦。您可以使用 MATLAB 中的函数 pwelch 来了解信号中存在的更多频率以及这些信号的功率。 MATLAB 将自动计算所需的 NFFT,并返回信号中存在的频率以及每个频率的功率。使用此语法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多