变形镜的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('驱动器间距')

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

其三维视图为:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值