我正在 Matlab 中研究 IFFT,将其应用于高斯。根据Wikipedia表,傅里叶变换对将是
F(w) = sqrt(pi/a) * exp(-w^2/(4a))
频率,以及
f(t) = exp(-at^2)
及时。我修改了previous question中的代码加上 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?我定义线性/角频率的方式是否有错误?
编辑:出于某种原因,当我定义L=ts^2
时,解析解和数值解似乎一致(L
= no .采样点,ts
= 时间采样)。
最佳答案
从解析解开始,让我们重新表述一下。您有函数 f(t) = exp(-a*t^2)
的样本,以及构建您正在收集的分析答案的方式L=1000* ts=1e7
以 Ts=ts/L=1e-3
的采样率进行采样。这意味着您的采样频率为 Fs=1/Ts=1e3
。
由于您想要与 fft
/ifft
获得的结果进行比较,因此您应该考虑数字或离散 频率,这意味着您为变换定义的值将对应于数字频率
frd = (-L/2:L/2-1)/L;
将其映射到角频率,我们有:
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 倍。
关于matlab - Matlab 中 IFFT 的缩放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426377/