24小时热门版块排行榜    

查看: 3681  |  回复: 2

wangzizii

银虫 (初入文坛)

[求助] 请教:关于matlab的菲涅尔衍射FFT计算仿真

菲涅尔衍射可看成 输入函数与相位因子乘积 的傅里叶变换,应用FFT方法可以快速计算输入函数的菲涅尔衍射。
但是在编程过程中遇到采样频率和衍射场的空间频率不知道怎么确定的问题,例如,在以下代码中,保持衍射狭缝宽度不变,改变采样数或者改变观察屏的范围都会导致衍射图样的变化,这是不正确的。
在这里想请教各位大牛,应该如何完善下面的菲涅尔衍射计算的程序才能得到正确的计算结果?
非常感谢

% 本程序用于计算宽度为0.2mm的狭缝的菲涅尔衍射
clear all;close all;
lamda = 0.635e-3;   % 波长
k = 2*pi/lamda;     % 波数
d = 200;            % 传播距离
N = 128;           % 采样数
x = linspace(-1,1,N);   % 衍射屏和观察屏
slit = zeros(1,N);      % 狭缝
slit(abs(x)<=0.1) = 1;  % 宽度为0.2mm的狭缝
coe = exp(1i*k/2/d*x.^2);   % 菲涅尔积分项
Efresnel = fftshift(fft(slit.*coe))*(x(2)-x(1));   % 菲涅尔衍射的傅里叶变换
Ifresnel = abs(Efresnel).^2;
plot(x,Ifresnel);  % 画图
grid on
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ygjianqiang

铜虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
夕阳西下: 金币+10, 奖励 2012-06-07 21:39:52
请问你采用的是菲涅尔衍射的哪个公式?卷积法吗?
没太理解你的意思,如果是想采用卷积法做菲涅尔衍射的话,贴个程序供你参考吧:
clc
clear all
close all
r=512,c=r; a=zeros(r,c);
a(257-1:257+1,257-128:257+127)=1;%调入图像
figure,imshow(a,[])
lamda=6328*10^(-10);k=2*pi/lamda;
L0=5*10^(-3);%给出衍射面的尺寸,单位:米
x0=linspace(-L0/2,L0/2,c);
y0=linspace(-L0/2,L0/2,r);
[x0,y0]=meshgrid(x0,y0);
z=0.1;%屏到衍射面的距离,单位:米
F0=exp(j*k*z)/(j*lamda*z);
F1=exp(j*k/2/z.*(x0.^2+y0.^2));
fa=fft2(a); fF1=fft2(F1);
Fuf=fa.*fF1;  %在观察屏上的光场分布
U=F0.*fftshift(ifft2(Fuf));
I=U.*conj(U); %在观察屏上的光强分布
figure,imshow(I,[0,max(max(I))]);
2楼2012-05-30 10:18:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangzizii

银虫 (初入文坛)

引用回帖:
2楼: Originally posted by ygjianqiang at 2012-05-30 10:18:02
请问你采用的是菲涅尔衍射的哪个公式?卷积法吗?
没太理解你的意思,如果是想采用卷积法做菲涅尔衍射的话,贴个程序供你参考吧:
clc
clear all
close all
r=512,c=r; a=zeros(r,c);
a(257-1:257+1,257-128: ...

学习了,谢谢。
3楼2012-06-08 22:43:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wangzizii 的主题更新
信息提示
请填处理意见