%菲涅耳积分傅里叶变换方法
function [f1,dx1,dy1,x1,y1]=fresnell(f0,M,N,dx0,dy0,z,lambda)
k=2*pi/lambda;
x0=ones(N,1)*[-M/2:M/2-1]*dx0;
y0=[-N/2:N/2-1]'*ones(1,M)*dy0;%Input f0 is in natural order
g=f0.*exp(i*0.5*k*(x0.^2+y0.^2)/z);%First phase factor
G=fftshift(fft2(fftshift(g)));%Fourier transform
du=1./(M*dx0);
dv=1./(N*dy0);
dx1=lambda*z*du;
dy1=lambda*z*dv;
x1=ones(N,1)*[-M/2:M/2-1]*dx1;
y1=[-N/2:N/2-1]'*ones(1,M)*dy1;%Baseline for output
f1=G.*exp(i*0.5*k*(x1.^2+y1.^2)/z);%Second phase factor
f1=f1./(i*lambda*z);
function [f1,dx1,dy1,x1,y1]=fresnel(f0,M,N,dx0,dy0,z,lambda)
k=2*pi/lambda;
du=1./(M*dx0);
dv=1./(N*dy0);
u=ones(N,1)*[0:M/2-1 -M/2:-1]*du; %Noteo order of points for FFT
v=[0:N/2-1 -N/2:-1]'*ones(1,M)*dv;
H=exp(-i*2*pi^2*(u.^2+v.^2)*z/k); %Fourier transform of kernel
f1=ifft2(fft2(f0).*H);%Convolution
dx1=dx0;
dy1=dy0;
x1=ones(N,1)*[-M/2:M/2-1]*dx1;%Baseline for output
y1=[-N/2:N/2-1]*ones(N,l)*dy1
%菲涅耳全息图的生成与再现
clear;
clc;
cm=0.01;
um=1e-6;
N=128;%全息图分辨率
%原始图大小
hx=1*cm;
hy=1*cm;
%原始图各方向增量
dhx=hx/N;
dhy=hy/N;
x=dhx.*(ones(N,1)*[-N/2:N/2-1]);
y=(dhy.*(ones(N,1)*[-N/2:N/2-1]))';
p1=imread('logo.bmp');
figure;
imshow(p1);%原始图
z=4;%菲涅尔传输距离
w=0.63*um;%波长
k=2*pi/w;%波数
[f,dx1,dy1,x1,y1]=fresnel(p1,N,N,dhx,dhy,z,w);
sit=pi/6;%参考光角度
ur=exp(-j*k*y*sin(sit));%参考光的复波函数
f1=f+ur;
f1=abs(f1).^2;
f1=mat2gray(f1);
figure;
imshow(f1);%全息图
rp1=f1.*conj(ur);%再现光照射
a=0.002;
b=0.3;
rp1=pure(rp1,a,b,x1,y1);%消除零级和共轭像
[f2,dx2,dy2,x2,y2]=fresnell(rp1,N,N,dx1,dy1,z,w);
f2=abs(f2).^2;
f2=mat2gray(f2);
figure;
imshow(f2);
运行:
??? Error using ==> fresnel
Too many input arguments.
Error in ==> feinieerhologram at 21
[f,dx1,dy1,x1,y1]=fresnel(p1,N,N,dhx,dhy,z,w);
[本帖最后由 mooni 于 2009-4-14 11:12 编辑]