当我使用 FFT sinc(t) 时有不同的结果

There are different results when I take FFT sinc(t)

第一种情况:

%% Analytical calculation
syms t f
h = @(f) int(sinc(t)*exp(-1i*2*pi*f*t),t,-10,10);
subplot(2,1,1); fplot(real(h(f)),[-3 3]); grid; ylim([-3 3]);
subplot(2,1,2); fplot(imag(h(f)),[-3 3]); grid; ylim([-3 3]);

第二种情况:

%% Numerical calculation
N=100;
T = 10;
t = (2*(0:N-1)/N-1)*T;

x = sinc(t);
y = (fftshift(fft(x)));
figure;
subplot(2,1,1); plot((real(y)));
subplot(2,1,2); plot(imag(y));

为什么结果不同? 为什么在第二种情况下不是矩形脉冲? absreal 有什么区别,我应该正确使用什么?

简答

在第二部分,替换你的行

x = sinc(t);

来自

x = fftshift(sinc(t));

以便 sinc 函数以时间原点为中心,即 第一个 样本。

长答案

DFT (FFT) 假定时间原点位于第一个样本,与您定义的时间轴t无关。请注意,在您的代码中

t = (2*(0:N-1)/N-1)*T;
x = sinc(t);
y = (fftshift(fft(x)));

fft 函数对您的 t 变量一无所知。它简单地认为时间轴是[0, 1, ..., numel(x)-1]。由于您的 x 被定义为以观察 window 为中心的 sinc (它的主瓣在中间),DFT 将其解释为 sinc 不是以原点为中心,而是(循环地)偏移一半的观察值window。

如您所知,时间的偏移对应于在频域中乘以指数。对于 DFT,此 属性 适用于 循环 移位。

因此,您得到的图与您预期的不同,因为它已 乘以一半采样率的指数 ,减少为 [1, -1, 1, -1, ...] .请注意您的绘图中的值如何交替为正和负。

为了解决这个问题,需要定义sinc以原点为中心,即在第一个样本处。所以主瓣的峰值和右半部分将出现在观察的最左边区域window,而左半部分的主瓣将出现在最右边的区域。这可以通过将 fftshift 应用到您的 x:

来非常简单地完成
x = fftshift(sinc(t));
plot(x)

那么DFT就是

y = (fftshift(fft((x))));
subplot(2,1,1); plot((real(y)));
subplot(2,1,2); plot(imag(y));