我已生成以下时间信号:
现在我想使用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
这是我得到的情节:
令我困惑的是y
轴? y
轴不应代表频率成分的幅度吗?有没有办法获得所有频率成分的幅度?
谢谢!
编辑: 我发现有些人会做以下事情:
n = size(x,2)/2; %The number of components and second half can be neglected again
xdft2 = abs(xdft1)/n;
这样我似乎得到幅度谱,但为什么我必须将绝对值除以n?
答案 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值。 它通常是查看频谱的人们最感兴趣的项目。