有人可以解释为什么 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);
Run Code Online (Sandbox Code Playgroud)
为什么他们包括这个操作:P2 = abs(Y/L);?
他们为链接中的每个示例执行此操作。
另外,如果他们必须在每次 fft 计算后执行该操作,他们为什么不直接在内置 fft 函数中包含该操作?在某些情况下,最好不要执行该额外操作吗?
谢谢!
从 DFT 及其逆的定义(来自维基百科)可以看出:
DFT 和它的逆之间的差异是指数中的符号和归一化项1/N。但请注意,将 this1/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
Run Code Online (Sandbox Code Playgroud)
但添加了规范化:
>> fft(ones(1,4))/4
ans =
1 0 0 0
>> fft(ones(1,8))/8
ans =
1 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)