在 Matlab 中使用 IFFT 缩放问题

Scaling problems with IFFT in Matlab

我正在通过将 IFFT 应用于高斯来研究 Matlab 中的 IFFT。根据 Wikipedia 表,傅立叶变换对为

F(w) = sqrt(pi/a) * exp(-w^2/(4a))

频率,

f(t) = exp(-at^2)

及时。我修改了 中的代码加上 Cris Luengo 的答案以执行此 IFFT。

a = 0.333;

ts = 1e4; % time sampling
L = 1000*ts; % no. sample points
ds = 1/ts;
f = -floor(L/2):floor((L-1)/2); % freq vector
f = f/ts;

w = 2*pi*f; % angular freq
Y = sqrt(pi/a)*exp(-w.^2/(4*a));

y = ts*ifftshift(ifft(fftshift(Y)));

t = (-L/2:L/2-1)*ts/L; % time vector

f = exp(-a*t.^2); % analytical solution

figure; subplot(1,2,1); hold on
plot(t,real(y),'.--')
plot(t,real(f),'-')
xlabel('time, t')
title('real')
legend('numerical','analytic')
xlim([-5,5])
subplot(1,2,2); hold on
plot(w,imag(y),'.--')
plot(w,imag(f),'-')
xlabel('time, t')
title('imag')
legend('numerical','analytic')
xlim([-5,5])

当我将IFFT的结果与解析表达式进行比较时,他们似乎并不一致:

我不确定哪里错了。我是否正确缩放了 IFFT?我定义 linear/angular 频率的方式有误吗?

编辑: 出于某种原因,当我定义 L=ts^2 时,解析解和数值解似乎一致(L = 采样点数,ts = 时间样本).

从解析解开始,让我们改写一下。您对函数 f(t) = exp(-a*t^2) 进行了抽样,并且构建分析答案的方式以 Ts=ts/L=1e-3 的抽样率收集了 L=1000*ts=1e7 个样本。这意味着你的采样频率是Fs=1/Ts=1e3.

由于您想与使用 fft/ifft 获得的结果进行比较,您应该考虑 digitaldiscrete 频率,这意味着您为变换定义的值将对应于数字频率

frd = (-L/2:L/2-1)/L;

将其映射到 angular 个频率,我们有:

w = 2*pi*frd;

但是当您尝试计算这些值时,您还需要记住这些频率应该代表您期望的连续时间频谱的样本。因此,您可以通过采样频率缩放这些值:

Y = sqrt(pi/a)*exp(-(Fs*w).^2/(4*a));
y = Fs*ifftshift(ifft(fftshift(Y)));

当您比较分析答案和计算答案时,它们现在是匹配的。

鉴于此,对您的问题的简短回答是您在最后缩放 y 不正确。您按 ts 缩放它,即 1e4,但您需要按 Fs=1e3 的采样频率缩放它。这就是为什么你最终以 10 倍的差距结束。