当我使用 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));
为什么结果不同?
为什么在第二种情况下不是矩形脉冲?
abs
和 real
有什么区别,我应该正确使用什么?
简答
在第二部分,替换你的行
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));
第一种情况:
%% 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));
为什么结果不同?
为什么在第二种情况下不是矩形脉冲?
abs
和 real
有什么区别,我应该正确使用什么?
简答
在第二部分,替换你的行
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));