变形镜的Matlab仿真实现

1.理论简介

        波前校正器对入射的畸变波前进行校正补偿畸变,是自适应光学系统的核心器件。常见的波前校正器一般有空间光调制器和变形镜两种。

        变形镜是通过改变反射面的形状对波前进行校正(即光程差中的传播路径,空间光调制器改变的是光程差中的折射率),反射的过程中能量损失较少,因此变形镜更适用于光强较低的情况。根据反射面的类型,可以将变形镜分为分段式和连续式两种。

        连续式DM由一个连续的反射镜薄膜和薄玻璃组成,镜面的背面与驱动器相连,以推、拉的方式使与其相连的薄镜面产生形变。连续式DM缺点是相邻驱动器间存在耦合(coupling),从而使致动器之间的AO控制复杂化。所谓“耦合”指的是某一个驱动器的运动作用到该位置处的镜面时,相邻位置处的驱动连接的镜面也会有一定的形变。

        分段式DM每个驱动器的末端由可独立控制的微小反射镜组成,每个镜段都可以单独控制,这类DM被认为更适合校正具有更高空间频率的像差。由于相邻镜子之间没有相互作用,故分段式DM具有零耦合的性质。

2.驱动器对应的响应函数的建模

        使用二维高斯函数描述变形镜j个驱动器的响应函数fi(x, y)

 其中,第i个驱动器的坐标是(xi, yi),驱动器的中心是坐标原点,相邻驱动器间的归一化间距d0=1,高斯指数α=1.73,交连值ω=0.2

function surf_DM= DM_surface(x,y,numActuators,cir,pointsize)
n           = size(x,1);
surf_DM     = zeros(n,n,numActuators*numActuators);
circle_mark = cir;
a           = 2;      % 高斯指数
d           = 2/(numActuators-1);% 驱动器间距
w           = 0.4;    % 交联值
% 驱动器响应函数的建模,对应上面的exp()公式
temp_num = 0;
for i = 1 : numActuators
    for j = 1 : numActuators
        CX = -1 + (i-1)*d;
        CY =  1 - (j-1)*d;     
        surf_DM(:,:,temp_num+1) = exp(log(w).*(sqrt((x - CX).^2.+(y - CY).^2)./d).^a);
        temp_num = temp_num+1;
    end
end

主函数,得到变形镜各个驱动器对应的面形。

pixofCCD     = 300;
x            = linspace(-1, 1, pixofCCD);
[X, Y]       = meshgrid(x, x);
Y            = -Y;
[theta,rho]  = cart2pol(X, Y);% 由(x,y)换算(r,theta)
Mask         = rho;
Mask(Mask<1) = 1; 
Mask(Mask~=1)= 0;
DM_num      = 11 ;              % 每一行驱动器的数目
DM_val_num  = DM_num * DM_num;  % 驱动器的总数目
pointsize   = pixofCCD / DM_num;
surf_DM     = DM_surface(X, Y, DM_num, Mask, pointsize);
figure(4)
for num_DM = 1 : DM_num * DM_num
    imagesc(surf_DM(:,:,num_DM));colormap(jet);colorbar
    drawnow;
end

某一个驱动器对应的面形如下。

ALpao 69驱动器的变形镜对应的响应函数如下:

 每个图像 就是 该位置处驱动器在单位电压下产生的面形。

或者使用两个贝塞尔函数对响应函数建模。

 响应函数即两者各取一部分、然后合并

clc;clear all;close all
P      = zeros(7,2);
P(1,:) = [0,1];      % 上凸部分的起点坐标
P(2,:) = [0.2,1];
P(3,:) = [0.4,0.7];
P(4,:) = [0.6,0.4];  % 上凸部分的终点坐标,也是下凹部分的起点坐标
P(5,:) = (-1)*P(3,:)+(1+1)*P(4,:);
P(6,:) = [1.0,0];
P(7,:) = [2.0,0];    % 下凹部分的终点坐标
t = linspace(0,1,101)';
bezier1 = ((1-t).^3)*P(1,:) + ...
    3.*((1-t).^2.*t)*P(2,:) + ...
    3.*((1-t).*t.^2)*P(3,:) + ...
    (t.^3)*P(4,:);   % 通过起点和终点坐标绘制贝塞尔曲线
figure(1);plot(bezier1(:,1),bezier1(:,2));title("上凸部分")
t(1) = [];
bezier2 = [((1-t).^3)*P(4,:) + ...
     3.*((1-t).^2.*t)*P(5,:) + ...
     3.*((1-t).*t.^2)*P(6,:) + ...
     (t.^3)*P(7,:) ]; % 绘制下凹部分的贝塞尔曲线
figure(2);plot(bezier2(:,1),bezier2(:,2));title("下凹部分")
bezierr = [bezier1;bezier2];

figure(3);
plot(bezierr(1:101,1),bezierr(1:101,2),'r');title("两条曲线衔接在一起,可导、连续")
hold on
plot(bezierr(102:201,1),bezierr(102:201,2),'b');title("两条曲线衔接在一起,可导、连续")

% plot(bezierr(:,1),bezierr(:,2));title("两条曲线衔接在一起,可导、连续")
p_xScale = spline(bezierr(:,2),bezierr(:,1),0.25); % obj.mechCoupling=25/100=0.25

bezierr(:,1) = bezierr(:,1)/p_xScale; % 横坐标扩大1.4倍数
u = [-flipud(bezierr(:,1)) ; bezierr(2:end,1)]; % flipud(X)实现了矩阵X的上下翻转
v = [ flipud(bezierr(:,2)) ; bezierr(2:end,2)];
figure(4);plot(u,v,'r','LineWidth',2);title("响应曲线")
splineP = spline(u,v);
xlabel('驱动器间距')

合并后的响应函数曲线如下

其三维视图为:

 仿真出来变形镜、哈特曼波前探测器,两者结合起来 就可以进行波前校正了。即哈特曼测波前的斜率,提高变换矩阵将测得的斜率转成变形镜上驱动器的电压信号,驱动器的电压信号在过渡到其对应的面形,最后将原始像差与变形镜拟合的面形作差得到残余波前,多次迭代实现波前校正的过程。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个Matlab程序是用来生成变形的表面形状的。程序中使用了主函数来计算变形各个驱动器对应的面形。程序首先定义了一个CCD像素的数量,然后生成了一个网格,通过坐标转换将网格转换为极坐标系。接下来,程序根据驱动器的数量和间距,以及高斯指数和交联值等参数,计算了每个驱动器的响应函数。最后,程序通过循环遍历每个驱动器,并使用imagesc函数将生成的表面形状可视化出来。 这个程序的目的是为了模拟和研究变形的形状和性能。变形是一种可以通过调整其表面形状来改变光学系统的焦距和像差的装置。这个程序可以帮助研究人员了解不同参数对变形性能的影响,以及优化变形设计。 引用\[1\]中的代码是用来生成变形表面形状的主函数。引用\[2\]中的代码是用来计算每个驱动器的响应函数的函数。引用\[3\]中的内容是关于图像预处理的一些说明,可能与变形程序的相关性不大。 希望这个解答对您有帮助! #### 引用[.reference_title] - *1* *2* [变形Matlab仿真实现](https://blog.csdn.net/EyRe1/article/details/125359349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)(附matlab实现代码)](https://blog.csdn.net/qq_36130719/article/details/128299888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值