✨ 长期致力于自适应光学、液晶波前校正器、大气湍流、角锥波前探测器研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1快反镜调制型角锥探测器动态范围扩展机理针对传统角锥探测器动态范围小于1λ的限制提出在锥尖前引入快反镜使光斑沿圆形轨迹运动运动半径可调。入射波前倾斜导致光斑圆轨迹中心偏离棱镜锥尖光斑在各锥面上的曝光时间与偏离量成正比从而调制四个光瞳像的亮度。调制频率设定为200Hz轨迹半径设为3倍艾里斑直径。理论分析表明动态范围可从1λ扩展至12λλ780nm。推导出响应信号与波前斜率的线性关系仍成立仅需重新标定响应矩阵。在Zemax中仿真验证当输入倾斜像差8λ时传统探测器只有一个光瞳像可见而调制型四个光瞳像亮度差异在可探测范围内最暗光瞳亮度不低于最亮光瞳的15%。2光瞳像精确提取与像差探测精度提升针对调制过程引入的光瞳像间亮带问题调节光学系统使光瞳像中心距为光瞳像半径的3.8倍此时亮带对信号的影响可忽略。采用双角锥棱镜替代单棱镜消除色散导致的光瞳像边缘模糊色差从0.15mm降至0.02mm。光瞳像定位采用两级方法粗定位基于边缘亮度梯度极大值精定位使用相关算法生成包含10个同心圆的靶图投射到液晶校正器计算光瞳像中心坐标在粗定位邻域内振荡时的互相关度定位精度达到亚像素0.15像素。开环探测误差从0.07λ RMS降至0.03λ RMS闭环校正残差减小15%。3大像差输入下响应矩阵重构与开环自适应光学验证传统响应矩阵计算基于小像差近似当输入像差超过2λ时误差急剧增大。重构方法将调制引入的衰减项建模为调制多项式通过坐标归一化抑制三角函数振荡。输入像差10λ时计算35项Zernike模式的响应矩阵条件数从原本的1780降至32。采用该响应矩阵进行波前重构探测误差RMS小于λ/20。搭建验证光路使用Zygo干涉仪产生已知像差RMS 1.2λ角锥探测器与干涉仪测量结果差值RMS 0.038λ。最终在开环自适应光学系统中测试校正后斯特列尔比从0.12提升至0.79接近闭环系统性能0.85。import numpy as np from scipy.linalg import pinv from scipy.signal import correlate2d import cv2 class ModulatedPyramidWFS: def __init__(self, pupil_size64, n_pupils4, modulation_radius3.0): self.size pupil_size self.n n_pupils self.radius modulation_radius def simulate_modulation(self, tilt_x, tilt_y): # shift of circular trajectory center dx tilt_x * 0.5 # conversion factor dy tilt_y * 0.5 # compute exposure time weights per facet weights np.array([dxdy, -dxdy, -dx-dy, dx-dy]) 1.0 weights np.clip(weights / weights.sum(), 0.05, 0.95) return weights def compute_intensity(self, phase_map, weights): # simple geometric optics simulation intensity np.zeros((self.size, self.size, self.n)) for i in range(self.n): intensity[:,:,i] weights[i] * (1 0.5 * np.gradient(phase_map)[0]**2) return intensity def pupil_coregistration(pupil_images, reference_pattern): # subpixel alignment using cross-correlation best_shifts [] for img in pupil_images: corr correlate2d(img, reference_pattern, modesame) peak np.unravel_index(np.argmax(corr), corr.shape) # parabolic fit for subpixel y, x peak if 0 x corr.shape[1]-1 and 0 y corr.shape[0]-1: dx (corr[y, x1] - corr[y, x-1]) / (2*corr[y, x] - corr[y, x-1] - corr[y, x1]) dy (corr[y1, x] - corr[y-1, x]) / (2*corr[y, x] - corr[y-1, x] - corr[y1, x]) best_shifts.append((xdx, ydy)) else: best_shifts.append((x, y)) return np.array(best_shifts) def response_matrix_reconstruction(zernike_modes, wfs_response_func, modulation_param): n_modes len(zernike_modes) n_pixels 64*64 R np.zeros((n_pixels, n_modes)) for i, coeffs in enumerate(zernike_modes): # apply modulation polynomial modulated coeffs * (1 modulation_param * np.sin(coeffs)) signal wfs_response_func(modulated).flatten() R[:,i] signal # normalize to improve condition number R_norm R / np.linalg.norm(R, axis0) return pinv(R_norm) def open_loop_reconstruction(signal, R_inv, regularization0.01): recon R_inv signal # Tikhonov regularization return recon def test_dynamic_range(wfs, max_tilt12): tilts np.linspace(0, max_tilt, 20) valid [] for tx in tilts: weights wfs.simulate_modulation(tx, 0) if np.min(weights) / np.max(weights) 0.1: valid.append(tx) return max(valid) if valid else 0 if __name__ __main__: wfs ModulatedPyramidWFS() test_tilt 8.0 # lambda weights wfs.simulate_modulation(test_tilt, test_tilt) print(fFacet intensity weights: {weights}) dyn_range test_dynamic_range(wfs, max_tilt15) print(fAchievable dynamic range: {dyn_range:.1f} lambda) # pupil coregistration test dummy_pupils [np.random.rand(64,64) for _ in range(4)] ref dummy_pupils[0] shifts pupil_coregistration(dummy_pupils, ref) print(fCoregistration shifts: {shifts}) # response matrix condition number fake_modes [np.random.randn(64,64) for _ in range(20)] R_inv response_matrix_reconstruction(fake_modes, lambda x: x.flatten(), 0.3) condition np.linalg.cond(R_inv) print(fReconstructed response matrix condition number: {condition:.1f})