在 Matlab 上应用 DFT(仅公式)和 FFT 的结果不同?

信息处理 matlab fft 采样 自由度
2022-02-22 16:08:08

在傅立叶变换后,我在时域和频域中有这个函数:

s1(t)=(t2)etu(t2)

S1(f)=e2(1+j2πf)(1+j2πf)2

首先,我分别创建一个时间向量和一个频率向量,范围为 [0s,8s) 和 [-50hz,50hz) 并使用这些行在我的函数上评估它们:

s1=(t1-2).*exp(-t1).*heaviside(t1-2);  %s1(t)
S1f=(exp(-2*(1+(2*pi*f1*1i)))./((1+(2*pi*f1*1i)).^2));  %S1(f)

我在绘制幅度/相位时得到的是:

在此处输入图像描述

之后,我想在 Matlab 中使用 FFT 命令比较这些结果,所以我这样做了:

S1k=fft(s1);
figure % creates a figure
subplot(2,1,1)     %creates a grid of 2 plots in one figure, selecting the   stem as the first plot
stem(k1,abs(fftshift(S1k,2)),'red') %plots magnitude of S1f
title('Magnitude vs Frequency')
subplot(2,1,2)      %selects the phase plot as the second one in the grid
plot(k1,angle(fftshift(S1k,1)),'blue') %plots magnitude of S1f

标题(“相位与频率”)

结果,令我惊讶的是:

在此处输入图像描述

如您所知,这两个图有很多差异,尽管“形状”至少在幅度图中是相似的,但在 y 轴上具有不同的值。

可能是什么问题?我确信我手动进行的傅立叶变换很好,但结果却不同。

为什么?FFT和DFT除了计算速度不一样吗?

任何提示将不胜感激。

1个回答

快速傅里叶变换 (FFT) 是一类有效实现离散傅里叶变换 (DFT) 的算法。但是,您手动计算的是连续时间傅里叶变换 (CTFT),它与 ​​DFT 大不相同。DFT 应用于有限长度离散时间序列,而 CTFT 应用于可能无限持续时间的连续时间函数:

X[k]=n=0N1x[n]ej2πkn/N(DFT)X(jω)=x(t)ejωtdt(CTFT)

但是,您可以使用 DFT 来近似计算 CTFT,但总会出现以下两个错误中的至少一个(通常两者都有):

  1. 截断错误:如果信号太长(或在您的示例中具有无限持续时间),则必须将其截断以适合 DFT 窗口。

  2. 混叠误差:必须对连续时间的信号进行采样,采样通常会引入混叠,除非信号是带限的并且满足采样定理。

由于您示例中的信号既不受频带限制也不受时间限制,您将得到上述两个错误。

有关通过 DFT 逼近 CTFT 的更多信息,请参阅此答案

以下 Octave 脚本显示了近似值如何适用于您问题中的示例。

% 选择参数(采样频率和时间间隔)
Fs = 50; % 采样频率
T1 = 2; % 下限和上限
T2 = 20;% 积分限制

Ts = 1/Fs;
DT = T2 - T1;
N = 轮次(DT/Ts);% DFT 长度

[T1,T2] 上的采样时域函数百分比
t = (0:N-1)*DT/(N-1) + T1;
xd = (t-2).*exp(-t);

% DFT 近似 CTFT
Xd = Ts * fft(xd);
fd = (0:N-1)*Fs/N;

偏移 T1 的 % 相位校正
Xd = Xd .* exp(-1i*T1*2*pi*fd);

% CTFT 的精确表达式
N2 = 圆形(N/2);
fc = fd(1:N2);
Hc = exp(-2*(1+1i*2*pi*fc))./(1+1i*2*pi*fc).^2;

% 绘图结果
子图(2,1,1),图(fc,20*log10(abs(Xd(1:N2))),fc,20*log10(abs(Hc)))
    标题('幅度(dB)'),xlabel('f'),图例('DFT','CTFT'),
    轴([0,Fs/2,-110,-10]),网格打开
子图(2,2,3), 图(fc,20*log10(abs(Xd(1:N2))) - 20*log10(abs(Hc)))
    title('幅度误差 (dB)'), xlabel('f'), grid on
子图(2,2,4),情节(fc,展开(角度(Xd(1:N2)))-展开(角度(Hc)))
    title('相位误差 (rad)'), xlabel('f'), grid on

下图显示了 CTFT 的幅度和 DFT 的近似值,以及幅度和相位的近似误差。

在此处输入图像描述