我正在研究Matlab中的IFFT,将其应用于高斯分布。根据{{3}}表,傅立叶变换对将是
F(w) = sqrt(pi/a) * exp(-w^2/(4a))
频率和
f(t) = exp(-at^2)
及时。我在Wikipedia和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
=否。采样点,ts
=时间样本)。
答案 0 :(得分:2)
从分析解决方案开始,让我们稍微改写一下。您有一个函数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倍。