【问题标题】:Matlab, DFT, FFT, frequency range;Matlab、DFT、FFT、频率范围;
【发布时间】:2014-10-27 15:45:18
【问题描述】:

我真的很难理解 MATLAB 中的 fft 函数是如何工作的。 根据:

http://www.mathworks.de/help/matlab/math/fast-fourier-transform-fft.html

fs/n 是频谱中采样点之间的距离,其中 fs 是采样频率,n 是信号的长度。他们提供的代码确实提取了频率(虽然我不知道为什么),但是根据 fft 的实现,他们提供了:

http://www.mathworks.de/help/matlab/ref/fft.html

频谱中点之间的距离应该是:1/fs。因为不是索引 j 而是插入 j*T,其中 T = 1/fs 是采样时间,然后您可以计算点之间的距离,它不应该是 fs/n。

如果有人能解释一下频域中点之间的距离是多少以及为什么会这样,我将不胜感激:)

[编辑]
这不是 Matlab 特有的问题。更多的是关于傅里叶变换和离散傅里叶变换之间的关系以及频率轴的缩放/单位的问题。在第 3 页的 PDF-Document 中可以找到一个很好的解释。

[/编辑]

【问题讨论】:

  • 你在说f = (0:n-1)*(fs/n)t = (0:L-1)*T;在哪里?你是否意识到有时间和频率——两个不同的东西?我感觉您对如何使用 f、Fs 和 T 完成绘图感到困惑。
  • 是的,我说的是 f = (0:(n-1))*(fs/n);即频率范围。时间范围是正确的,但频率范围对我来说没有意义。如果您查看 MATLAB 用于实现的 DFT 公式,您会在指数中看到:
  • (−2πi)/N*(j-1)*(k-1) 其中 j 是 x(j) 中和和时间索引的索引,k 是频谱。由于 x 在 x(jT) 处采样,因此应将其用于频率范围(以赫兹为单位,如果 T 以秒为单位):f = (0:n-1)*(1/fs);

标签: matlab fft dft


【解决方案1】:

频谱上频率点之间的距离在这两种情况下都是fs/n,这是正确的值。如果我们取http://www.mathworks.co.uk/help/matlab/ref/fft.html中的代码,我们有:

>> Fs = 1000;                    % Sampling frequency
>> T = 1/Fs;                     % Sample time
>> L = 1000;                     % Length of signal
>> t = (0:L-1)*T;                % Time vector
>> NFFT = 2^nextpow2(L); % Next power of 2 from length of y
>> f = Fs/2*linspace(0,1,NFFT/2+1);
>> f(2)-f(1)
ans =  0.97656
>> Fs/NFFT
ans =  0.97656

您可以仔细检查所有其他f(n+1)-f(n),它们都是一样的。

【讨论】:

  • 我说的是频率范围,单位:1/秒。请看我上面的评论(尤其是关于 DFT 的部分)
  • 即使在维度上,也没有意义:1/fs与时间[s]是同一个维度,那么它怎么可能是频率单位(即1/s)?
  • 但是你需要把这个值放在DFT公式中e函数的指数中,那么索引k就相当于赫兹了。
  • 不,你没有。 k 只是一个索引,没有任何关联的维度。正确的频率间隔是fs/n
  • 如果你看一下傅里叶变换的理论背景,指数看起来像这样:-2πi*(j-1)*Ts*f。现在 f 以 f = (k-1)/N, k in [1..N] 采样,其中 N 是信号的长度 (x(j)),因此您得到指数:-2πi*(j -1)*(k-1)*Ts/N。如果您将此指数与link 中 DFT/FFT 的 Matlabs 实现进行比较,您会发现您必须将 k 与 Ts 相乘才能使两个指数相等。所以以 1/s 为单位的频率范围的矢量应该如下所示:f = (0:n-1)*(1/fs);f = (0:n-1)*Ts;
猜你喜欢
  • 2023-03-25
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
  • 2011-12-16
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多