Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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的傅里叶变换衍射_Matlab_Fft - Fatal编程技术网

基于Matlab的傅里叶变换衍射

基于Matlab的傅里叶变换衍射,matlab,fft,Matlab,Fft,我对Matlab非常陌生,正在尝试使用傅里叶变换实现以下菲涅耳衍射: 这摘自以下维基百科页面: 我正在试一个5厘米宽的方形光圈 clc;clear; lambda=1*10^-6; w=.05; z=2.0; k=(2*pi)/lambda; x1=linspace(-0.2,0.2,2048); y1=linspace(-0.2,0.2,2048); U1=((abs(x1)<=(w)/2))&((abs(y1)<=(w)/2)); u1=double(U1); f

我对Matlab非常陌生,正在尝试使用傅里叶变换实现以下菲涅耳衍射:

这摘自以下维基百科页面:

我正在试一个5厘米宽的方形光圈

clc;clear;

lambda=1*10^-6;
w=.05;
z=2.0;
k=(2*pi)/lambda;

x1=linspace(-0.2,0.2,2048);
y1=linspace(-0.2,0.2,2048);

U1=((abs(x1)<=(w)/2))&((abs(y1)<=(w)/2));
u1=double(U1);

figure(1)
plot(x1,u1)

g=u1'*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
G=fftshift(fft2(g));

h=(exp(1i*k*z)/(1i*lambda*z))*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
H=fftshift(fft2(h));

u2=H*G;

figure(2)
plot(x1,abs(u2));
当我绘制场u2时,对于我尝试的任何距离z,它只是显示为一些随机图案,而不是方形光圈的预期衍射图案

就像我说的,我对MATLAB很陌生,很难理解。我想我把它弄得比实际需要的更复杂了,而且我没有正确地实现积分

有什么建议吗?我被卡住了


谢谢

看起来您想用此代码模拟菲涅耳衍射

只需稍作更改,即可查看实际图像。这里显示的是振幅。强度为u2.*2

但是请注意,对于您使用的物理参数,临界采样将发生在距离2米远的地方,更像100米

此外,还需要在输出平面上进行一些额外的重新缩放,而不是在这里进行。否则,对于低菲涅耳数,衍射图样将变得非常小

clc;clear;
N=1048;
L=0.4;
lambda=1*10^-6;
w=.05;
z=500.0;
k=(2*pi)/lambda;

src_delta = L/N;
critical_sampling_z = N*src_delta^2/lambda;

[x1 y1] = meshgrid((-N/2 : N/2-1) * src_delta);
X = double(abs(x1)<w/2);  Y = double(abs(y1)<w/2);
u1 = X.*Y;

figure(1);
colormap(gray); imagesc(mat2gray(u1));

g=u1'*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
G=fftshift(fft2(g));

h=(exp(1i*k*z)/(1i*lambda*z))*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
H=fftshift(fft2(h));
u2=H*G;

figure(2);
colormap(gray); imagesc(mat2gray(abs(u2)));