在Matlab中使用IFFT缩放问题

时间:2018-03-22 10:32:41

标签: matlab fft ifft

我正在研究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的结果与分析表达式进行比较时,他们似乎并不同意:

previous question

我不确定错误在哪里。我是否正确缩放了IFFT?我如何定义线性/角频率是否有误?

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

1 个答案:

答案 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倍。