可以帮我看看一下代码有什么问题吗?

[复制链接]
匿名  发表于 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');



回复

使用道具 举报

全部回复11 显示全部楼层
机器人Gpt 发表于 2023-4-22 17:06:17 | 显示全部楼层
代码有些问题,例如:

1. 在第28行,`=meshgrid(X,Y);`这条语句前面应该加一个变量名,表示生成的网格数据。

2. 在第37行,变量 `p` 没有被初始化,需要给它赋值一个空间坐标。

3. 在第39行,变量 `Z` 没有被定义,应该将其改为 `z0`。

4. 在第48行,变量 `m` 和 `n` 没有被定义,应该将其改为 `M` 和 `N`。

5. 在第53行,变量 `dx` 的计算公式有误,正确的应该是 `dx=lambda*z/(t*(m-1))`。

6. 在第58行,变量 `I_2` 的赋值应该是 `I_2=I.';`,而不是 `I_2=I_1.';`。

7. 在第60行,变量 `B` 的计算公式中应该是相乘而不是相加,即 `B=C.*I.*f;`。

8. 在第68行,变量 `I_5` 的赋值应该是 `I_5=flipud(I_4);`,而不是 `I_5=fliplr(I_4);`。

另外,代码中有很多注释不太准确或者有点模糊,需要进一步确认。同时,建议在代码中添加更多的注释,让代码更易读懂。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-22 17:09:35
上面的代码报错,

错误使用 imageDisplayValidateParams
第 2 个输入, [LOW HIGH], 应为 非 NaN。

出错 images.internal.checkDisplayRange (line 10)
validateattributes(display_range, {'numeric'},...

出错 images.internal.imageDisplayValidateParams (line 58)
common_args.DisplayRange = images.internal.checkDisplayRange(common_args.DisplayRange,mfilename);

出错 images.internal.imageDisplayParseInputs (line 79)
common_args = images.internal.imageDisplayValidateParams(common_args);

出错 imshow (line 253)
    images.internal.imageDisplayParseInputs({'Parent','Border','Reduce'},preparsed_varargin{:});

出错 two_point (line 66)
figure,imshow(I_5,[]);
这是什么意思呢?
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-22 17:09:49 | 显示全部楼层
qianchezi 发表于 2023-04-22 17:09
上面的代码报错,

错误使用 imageDisplayValidatePar ...

这个错误提示说明参数传递有误,`imshow` 函数的第二个输入参数的值应该为一个不包含NaN的数字,但是你传入了一个NaN值。具体来说,可能是 `I_5` 数组中存在 NaN 值,导致无法显示。建议检查一下代码中是否有未处理好的NaN值。可以尝试使用MATLAB自带的函数 `isnan` 查找这些NaN值,并对其进行处理。另外,还有可能是在读取图片时出现了问题,建议检查一下读取图片的相关代码是否正确。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-22 17:40:32
为什么代码运行后,A的矩阵里的所有值是inf呢?
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-22 17:40:43 | 显示全部楼层
qianchezi 发表于 2023-04-22 17:40
为什么代码运行后,A的矩阵里的所有值是inf呢? ...

A矩阵的值为`Inf`,可能是由于分母中包含了0,导致分母为0,从而计算值为`Inf`。请检查代码中所有分母,尤其是涉及到变量`z`的分母是否出现了0,如果出现了0,则需要修改参数或代码,使分母不为0。在计算过程中,也可以加上一些判断和处理分母为0的情况的代码逻辑,以避免程序出现错误。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-22 18:50:22
机器人Gpt 发表于 2023-4-22 17:40
A矩阵的值为`Inf`,可能是由于分母中包含了0,导致分母为0,从而计算值为`Inf`。请检查代码中所有分母, ...

全息图再现的时候为什么要乘以衍射因子?
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-22 18:50:49 | 显示全部楼层
qianchezi 发表于 2023-04-22 18:50
全息图再现的时候为什么要乘以衍射因子? ...

在全息图再现过程中,光线从全息图穿过后照射在屏幕上,这个过程可以用夫琅禾费衍射公式来描述。在夫琅禾费衍射公式中,复振幅传输函数(或者称为传播函数)包含了屏幕的位置信息,它的值随着屏幕位置的变化而变化。因此,为了获得正确的再现图像,需要将全息图乘以一个衍射因子,以便与复振幅传输函数相乘,从而得到正确的夫琅禾费衍射结果。

衍射因子可以看作是一个衰减因子,它决定了在特定的屏幕位置上,从不同点处照射出来的光线对最终图像的贡献大小。如果没有衍射因子,那么照射到屏幕上的光线会产生自相应(即在自身位置上产生干涉),最终图像会失真。因此,添加衍射因子能够保证光线在传播过程中的干涉效应,从而得到正确的再现图像。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-22 18:54:28
还有,全息图显示的时候
相位调质因子是必须的吗?
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-22 18:54:39 | 显示全部楼层
qianchezi 发表于 2023-04-22 18:54
还有,全息图显示的时候
相位调质因子是必须的吗? ...

相位调制因子在全息图显示过程中是必须的,因为它包含了全息图的相位信息。如果忽略了相位调制因子,则无法得到全息图的正确信息。相位调制因子通常会在全息图记录的过程中由光束和参考光的干涉产生,在全息图再现的过程中需要将其加入计算。同时,全息图的再现也需要对相位调制因子进行调制,以保证再现的准确性。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

12下一页
发帖

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    148
  • 回答

    17
  • 积分

    150
联系客服 关注微信 访问手机版 返回顶部 返回列表