【问题标题】:Extra explanation concerning the mathwork example on using matlab fft关于使用 matlab fft 的数学示例的额外解释
【发布时间】:2019-12-16 22:38:14
【问题描述】:

有人可以解释为什么 fft 的结果需要除以采样点的数量(信号的长度)吗?

该示例可以在此页面上找到:https://fr.mathworks.com/help/matlab/ref/fft.html

Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
Y = fft(S);

P2 = abs(Y/L);

P1 = P2(1:L/2+1);

他们为什么包含这个操作:P2 = abs(Y/L);

他们为链接中的每个示例都这样做。

另外,如果他们必须在每次 fft 计算后执行该操作,他们为什么不直接在内置 fft 函数中包含该操作? 在某些情况下最好不要执行该额外操作?

谢谢!

【问题讨论】:

    标签: matlab fft


    【解决方案1】:

    从 DFT 及其逆的定义中可以看出(来自 Wikipedia):

    DFT 与其倒数的区别在于指数中的符号和归一化项1/N。但请注意,这个1/N 放置在哪里并不重要,它可以放入正向变换中,仍然可以保留IDFT(DFT(f))==f。事实上,有些人通过将1/sqrt(N) 放在两个变换的前面来使它们对称。

    通常将它放在逆变换前面的原因是您可以执行IDFT(DFT(f)DFT(g)) == f*g 之类的操作(使用* 卷积)。如果 DFT 具有1/N 归一化项,则通过频域计算卷积需要额外的操作。所以这只是方便。

    但是,当使用 DFT 检查信号功率等时,可能希望将此归一化添加到前向变换中。 DFT 产生的值取决于信号强度及其长度。归一化消除了对长度的依赖。例如:

    >> fft(ones(1,4))
    ans =
       4   0   0   0
    
    >> fft(ones(1,8))
    ans =
       8   0   0   0   0   0   0   0
    

    但添加了标准化:

    >> fft(ones(1,4))/4
    ans =
       1   0   0   0
    
    >> fft(ones(1,8))/8
    ans =
       1   0   0   0   0   0   0   0
    

    【讨论】:

    • 很好的解释!
    【解决方案2】:

    在 FFT 中不包括 1/N 允许 Parseval 定理为真。例如时域中两倍长的信号(因为 FFT 更长等)将在频域中显示两倍的功率。

    并非所有 FFT 实现都包含 1/N。有些人反而把这个因素放在IFFT中。有些人将差异分开并在两者中使用 1/sqrt(N) 。如果没有这个因素,IFFT 就不会是 FFT 的倒数。

    【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多