【问题标题】:FFT does not return the amplitudes in matlab?FFT不返回matlab中的幅度?
【发布时间】:2014-02-25 08:39:24
【问题描述】:

我生成了以下时间信号:

现在我想使用 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?

【问题讨论】:

标签: matlab fft


【解决方案1】:

FFT 在每个频率区间中为您提供复数对。 FFT 中的第一个 bin 就像信号的 DC 部分(大约 0 Hz),第二个 bin 是 Fs / N,其中 Fs 是采样率,N是 FFT 的窗口大小,下一个 bin 是2 * Fs / N 等等。 你用这样一对的abs() 计算的是一个垃圾箱中包含的能量。

您可能还想看看这个:Understanding Matlab FFT example

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      基本情况:(https://www.youtube.com/watch?v=ZKNzMyS9Z6s&t=1629s)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 2011-12-07
        • 2015-11-09
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多