匿名
发表于 2023-4-22 17:05:49
|阅读模式
可以帮我看看一下代码有什么问题吗?
clear all;clc
%% 定义参数
lambda=632.8e-006; %确定了波长 单位:mm
k=2*pi/lambda;
thetax=1.0;%参考光入射角 单位是°吗?
thetay=1.0;%
M=512;N=512; %全息面的像素数
z=1200; %记录距离 mm 1.2m
%z=810;
d=24e-006;%全息图上取样间隔 %全息图上的取样间隔 博奇编码?这个怎么确定?与空间光调制器有什么关系呢?
p=[10,10,-1200;5,5,-1000]; %设定一个点的空间坐标这里空间坐标用mm单位的话,后面的也用mm 点可以这样规定吧?
%全息平面的位置?这个直接可以通过记录面吗?
%确定全息面的尺寸 这个尺寸该怎么写呢?
%% 抽样?生成网格数据?最后是所抽样的点?
X=(-N/2+1)*d:d:N/2*d;%和linspace函数的作用一致
Y=(-M/2+1)*d:d:M/2*d;
[x,y]=meshgrid(X,Y);%生成网格数据
%% 博奇编码吗?
%--------先是一个点
h=0;
for i=1:size(p,1) %这里size(p,1)表示取的是p的第一个 算是按行取?
x0=p(i,1);
y0=p(i,2);
z0=p(i,3);
U0=1; %可以设成1吗?相位随机?%exp(1i*p0);
p0=rand(1)*2*pi %在0~1间随机产生一个数,2pi,随机得到一个相位
h_1=0.5*(1+U0.*cos(2*pi*x.*sin(thetax*pi/180)./lambda+2*pi.*y.*sin(thetay*pi/180)./lambda-p0-((pi/lambda)./z0).*((x.^2+y.^2)+(x0.^2+y0.^2)-2.*(x0.*x+y0.*y))));%U0.是一个double 类型的变量
h=h+h_1;
end
minh=min(min(h));
maxh=max(max(h));
I=(h-minh)./(maxh-minh);
imshow(abs(I));
imwrite(abs(I), 'hologram.bmp', 'bmp');
%% 再现?
t=24e-006; %时间取样间隔
theta=0.5; %入射光角度
lambda=632.8e-006; %波长
z=1200; %观察距离
I_1=double(imread('C:\Users\HP\Desktop\bs\hologram.bmp'));%读入全息图
I=I_1-mean(mean(I_1)); %均匀滤波 %一个点的话,不滤波的效果好像好一点
[m,n]=size(I); %全息图尺寸
[X,Y]=meshgrid(1:m,1:n); %构建网格
%% 取样步长
dx=lambda*z/(t*m); %取样步长
C=exp((i*2*pi/lambda)*(sin(theta*pi/180)*t.*X)); %参考光的振幅?取样间隔乘以X是什么意思呢?
%为什么这里的参考光可以写成这个样子,没有取共轭呀,好像也不需要取共轭
A=(exp(i*2*pi*z/lambda)/(i*lambda*z))*exp((i*pi/(lambda*z))*((dx)^2).*((X-m/2).^2+(Y-n/2).^2));%积分号前的因子
f=exp((i*pi/(lambda*z))*t^2.*((X-m/2).^2+(Y-n/2).^2)); %复振幅传输函数 f应该是相位调制因子
I_2=I'; %转置
B=C.*I.*f; %参考光*全息图*复振幅传输函数?或者相位调质因子?
%B=C.*I_2;
D=fftshift(fft2(B)); %转到频域里计算
U=A.*D; %乘以积分号前的衍射因子
I_3=abs(U);
I_4=I_3./max(max(I_3)); %归一化
I_5=flipud(I_4); %将数组从上向下翻转
figure,imshow(I_5,[]);
colormap(gray(256)); %灰度图
imwrite(I_5,'image.bmp','bmp');
|
|