matlab - Matlab 中 IFFT 的缩放问题

标签 matlab fft ifft

我正在 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 的结果与解析表达式进行比较时,它们似乎不一致:

enter image description here

不知道错在哪里。我是否正确缩放了 IFFT?我定义线性/角频率的方式是否有错误?

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

最佳答案

从解析解开始,让我们重新表述一下。您有函数 f(t) = exp(-a*t^2) 的样本,以及构建您正在收集的分析答案的方式L=1000* ts=1e7Ts=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/

相关文章:

matlab - Matlab中的FFT,出乎意料的结果

image - MatLab - 使用 FFT 移动图像

matlab - 为什么傅立叶域中的零填充会导致复杂的逆变换?

matlab - 在 Matlab 中将朴素逆滤波器与维纳滤波器进行反卷积比较

image - 在matlab中裁剪图像

matlab - 如何在 MATLAB 中替换标志之间的字符

matlab - 为什么在 MATLAB 中尝试单声道音频会失败?

Matlab/Octave 数列

2d - fftw c2c : missing symmetry in transformed real data

asp.net - MATLAB Builder NE 在 IIS 7.5 上导致应用程序池崩溃