在 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
获得的结果进行比较,您应该考虑 digital 或 discrete 频率,这意味着您为变换定义的值将对应于数字频率
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 倍的差距结束。
我正在通过将 IFFT 应用于高斯来研究 Matlab 中的 IFFT。根据 Wikipedia 表,傅立叶变换对为
F(w) = sqrt(pi/a) * exp(-w^2/(4a))
频率,
f(t) = exp(-at^2)
及时。我修改了
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
获得的结果进行比较,您应该考虑 digital 或 discrete 频率,这意味着您为变换定义的值将对应于数字频率
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 倍的差距结束。