Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中函数的解析傅里叶变换与FFT_Matlab_Fft - Fatal编程技术网

Matlab中函数的解析傅里叶变换与FFT

Matlab中函数的解析傅里叶变换与FFT,matlab,fft,Matlab,Fft,我已经为这个问题修改了中的代码。我正在尝试进行FFT,并将结果与中的解析表达式进行比较 我的代码是: a = 1.223; fs = 1e5; %sampling frequency dt = 1/fs; t = 0:dt:30-dt; %time vector L = length(t); % no. sample points t = t - 0.5*max(t); %center around t=0 y = ; % original function in time Y = d

我已经为这个问题修改了中的代码。我正在尝试进行FFT,并将结果与中的解析表达式进行比较

我的代码是:

a = 1.223;
fs = 1e5; %sampling frequency
dt = 1/fs;
t = 0:dt:30-dt;     %time vector
L = length(t); % no. sample points
t = t - 0.5*max(t); %center around t=0

y = ; % original function in time
Y = dt*fftshift(abs(fft(y))); %numerical soln

freq = (-L/2:L/2-1)*fs/L; %freq vector
w = 2*pi*freq; % angular freq

F = ; %analytical solution

figure; subplot(1,2,1); hold on
plot(w,real(Y),'.')
plot(w,real(F),'-')
xlabel('Frequency, w')
title('real')
legend('numerical','analytic')
xlim([-5,5])
subplot(1,2,2); hold on;
plot(w,imag(Y),'.')
plot(w,imag(F),'-')
xlabel('Frequency, w')
title('imag')
legend('numerical','analytic')
xlim([-5,5])
如果我研究高斯函数,让

y = exp(-a*t.^2); % original function in time

F = exp(-w.^2/(4*a))*sqrt(pi/a); %analytical solution
在上面的代码中,当绘制函数的实部和虚部时,似乎有很好的一致性:

但如果我研究衰减指数乘以Heaviside函数:

H = @(x)1*(x>0); % Heaviside function
y = exp(-a*t).*H(t);

F = 1./(a+1j*w); %analytical solution
然后

为什么会有差异?我怀疑它与行
Y=
有关,但我不确定原因或方式

编辑:我将
ifftshift
更改为
fftshift
中的
Y=dt*fftshift(abs(fft(Y))。然后,我还拆下了
abs
。第二个图形现在看起来像:


“镜像”图形背后的数学原因是什么?我如何删除它?

问题底部的图没有镜像。如果你用线而不是点来绘制这些曲线,你会看到数值结果的频率非常高。绝对分量匹配,但相位不匹配。当这种情况发生时,几乎可以肯定的是,时间域发生了变化

和实际上,在中间定义源函数的时域函数。FFT期望原点位于第一个(最左侧)样本处。这就是

ifftshift
的作用:

Y = dt*fftshift(fft(ifftshift(y)));
ifftshift
将原点移动到第一个样本,为
fft
调用做准备,
fftshift
将结果原点移动到中间,以便显示


编辑

您的
t
没有0:

>> t(L/2+(-1:2))
ans =
  -1.5000e-05  -5.0000e-06   5.0000e-06   1.5000e-05
t(楼层(L/2)+1)
处的样本需要为0。这就是
ifftshift
移动到最左边的样本。(我在那里使用
floor
,以防
L
的尺寸是奇数,而不是这里的情况。)

要生成正确的
t
,请执行以下操作:

fs = 1e5; % sampling frequency
L = 30 * fs;
t = -floor(L/2):floor((L-1)/2);
t = t / fs;
我首先生成一个长度正确的整数
t
轴,0位于正确的位置(
t(楼层(L/2)+1)==0
)。然后我通过除以采样频率将其转换为秒

有了这个
t
,我上面建议的
Y
,剩下的代码,我看到了高斯示例:

>> max(abs(F-Y))
ans =    4.5254e-16
对于另一个函数,我看到了更大的差异,顺序是6e-6。这是因为无法对Heaviside函数进行采样。在采样函数中需要t=0,但H在0处没有值。我注意到真实分量有一个类似大小的偏移,这是由t=0时的样本引起的

通常。如果我这样做,偏移量将被完全移除,真实分量的最大差值将减少3个数量级(最大误差发生在非常接近0的值上,我看到的是锯齿形图案)。对于虚部,最大误差减小到3e-6,仍然相当大,并且在高频时最大。我将这些误差归因于理想和采样的Heaviside函数之间的差异


您可能应该将自己限制为带限函数(或接近带限函数,如高斯函数)。你可能想用一个小的sigma(<代码> sigma=0.8×fs< /代码>)代替一个误差函数(高斯积分),这是最小的sigma,我会考虑适当的采样)。p> 傅里叶变换虽然密切相关,但不是离散傅里叶变换(通过FFT算法实现)。因此,在某些特定条件下,你可能会得到非常接近的结果,但通常你也会得到明显的差异(正如你所观察到的),通过取
abs,你消除了虚部,所以它总是0。我想你需要的是
fftshift
而不是
ìfftshift
@Zep这只是一个MWE-最终我需要对没有解析形式的更复杂的函数进行FFT和IFFT。所以我做了一些类似于
FFT{IFFT[F(w)]*IFFT[G(w)]/IFFT[J(w)]}
的事情,我只知道
F,G,J
的频率向量。@Mylama Oblongata我删除了我的评论,因为我认为
ifftshift
会移位和逆变换,而它只会移位。我猜第一个实验,用高斯,因为abs的呼叫而工作?它将删除计算错误的相位分量。在第二个图中,您可以看到abs的效果:没有虚部,纯正实部。当您在第三个绘图中删除
abs
时,您会看到相位完全错误,但幅度是正确的。关于
ifftshift
,您是对的,现在绘图看起来正常。但当我用高斯函数测试这行代码时,FFT也给出了一个小的虚部,大约为10^(-6)。为什么会有它?有没有办法去除它?@Mymaloblongata:我猜是数字不准确。或者这可能是输入函数计算中的一个很小的变化。您的时间轴样本中是否有实际的
t==0
?使用
dt
增量计算
t
会引入错误,
t-0.5*max(t)
可能也不精确。尝试用整数生成一个
t
向量,然后除以
fs
。确保
t(loor(L/2)+1)=0
。有关冒号运算符与
linspace
之间的差异,请参见此处:@mymaloblongata:我已使用正确的形式更新了答案,以构建时间轴
t