FFT不会在matlab中返回幅度?

时间:2014-02-25 08:39:25

标签: matlab fft

我已生成以下时间信号: enter image description here

现在我想使用matlab命令fft

执行离散傅立叶变换

这是我的代码:

function [ xdft, omega ] = FastFourier( t, fs )

%% Inputs from other functions %%
[P_mean, x, u] = MyWay( t )   %From here comes my signal x(t)

%% FFT %%
xdft1 = fft(x);                  % Perform FFT
xdft2 = abs(xdft1);              % Take the absolute value of the fft results
xdft = xdft2(1:length(x)/2+1);   % FFT is symmetric, second half is not needed
freq = 0:fs/length(x):fs/2;      % frequency axis

plot (freq(1:100),xdft(1:100));

end

这是我得到的情节: enter image description here

令我困惑的是y轴? y轴不应代表频率成分的幅度吗?有没有办法获得所有频率成分的幅度?

谢谢!

编辑: 我发现有些人会做以下事情:

n = size(x,2)/2;      %The number of components and second half can be neglected again
xdft2 = abs(xdft1)/n;   

这样我似乎得到幅度谱,但为什么我必须将绝对值除以n?

3 个答案:

答案 0 :(得分:2)

FFT在每个频率仓中为您提供复杂的对。 FFT中的第一个bin就像信号的DC部分(大约0 Hz),第二个bin是Fs / N,其中Fs是采样率,N是窗口大小FFT,下一个bin是2 * Fs / N,依此类推。 你使用abs()这样一对来计算的是bin中包含的能力。

你可能还想看一下:Understanding Matlab FFT example

答案 1 :(得分:1)

大多数(并非所有)FFT库保留总能量(Parseval定理),这意味着对于更长的FFT窗口(更长的静止波形 - >更多能量),幅度必须变得更大。因此,您必须将结果除以N,以便在频谱中获得更“自然”的正弦波高度。

答案 2 :(得分:0)

如果需要谐波幅度,则需要绘制real(xdft1)和imag(xdft1)。 Real(xdft1)为您提供信号中存在的所有余弦谐波的系数,从-Fs / 2到+ Fs / 2(我们假设您的Fs足够大,可以覆盖信号中的所有频率)和imag(xdft)给出正弦的振幅。 您正在做的是给您信号的幅值,它是实数和虚数频率分量中某个bin处的总能量的RMS值。 它通常是查看频谱的人们最感兴趣的项目。

基本内容:(https://www.youtube.com/watch?v=ZKNzMyS9Z6s&t=1629s