高截止频率光学合成孔径技术解析【附代码】

高截止频率光学合成孔径技术解析【附代码】 ✨ 长期致力于高分辨观测、光学合成孔径、新型多圆周阵列、相位误差理论、piston误差探测研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1非均匀多圆周阵列高截止频率优化设计提出一种改进型多圆周阵列构型记作IMCA-6-Cd由三个同心圆周组成内圈子镜直径50mm共6个中圈子镜直径40mm共12个外圈子镜直径30mm共18个各圈旋转角度分别为0°、15°和7.5°。遗传算法以最大化调制传递函数的实际截止频率为目标适应度函数定义为MTF曲线与频率轴包围的面积约束填充因子为12%。优化100代后得到的IMCA阵列截止频率为0.82λ/D比传统Golay-6阵列的0.68λ/D提高20.6%中频段MTF均值高出32%。在点扩散函数仿真中IMCA-6-Cd的旁瓣峰值比主瓣低18dB成像质量等效于环状光瞳结构。2任意光瞳相位误差通用模型及敏感度分析基于傅里叶光学推导出任意阵列的相位误差与斯特列尔比的解析关系表达式为SR 1 - (2π/λ)^2 * (σ_phi^2)其中σ_phi为相位误差均方根。将piston误差、tilt误差和离焦误差用泽尼克多项式展开建立敏感度矩阵。计算IMCA-6-Cd阵列对各类误差的容忍度piston误差容忍度为λ/14tilt为λ/8离焦为λ/6。引入中心遮拦比(30%)和次镜支撑柱(三根)后piston敏感度增加15%而彗差敏感度变化最大达40%。复色光入射时宽带光谱平滑了MTF次峰相干长度内的piston误差导致SR下降速度比单色光慢约23%。提出基于MTF次峰高度与光源带宽的联合piston探测方法利用双液晶延迟器产生已知piston构建标定曲线。在550nm中心波长、40nm带宽下探测范围达到80λ精度λ/30。3图像式共相算法实验验证搭建共用次镜的双子镜实验平台使用四个LED光源(红绿蓝白)带宽分别为20nm、30nm、45nm和全谱。采集不同piston误差下的PSF图像用MATLAB计算MTF并提取次峰高度与主峰比值。建立三阶多项式拟合关系R²达到0.997。在多圆周阵列验证中采用相位片模拟子镜面外平移通过图像处理器实时计算piston误差并反馈至压电陶瓷促动器。闭环控制后残余piston误差小于λ/25闭环带宽达到2.5Hz。成像实验表明校正后的阵列成像分辨率接近等效口径的单镜斯特列尔比从0.21提升至0.79。import numpy as np from scipy.optimize import differential_evolution from scipy.signal import convolve2d class IMCAArray: def __init__(self, radii, diameters, rotations): self.radii radii self.diams diameters self.rots rotations self.positions self._compute_positions() def _compute_positions(self): positions [] for r, d, rot in zip(self.radii, self.diams, self.rots): n_rings len(d) for i in range(n_rings): angle_step 2*np.pi / (2*n_rings) for j in range(2*n_rings): theta rot * np.pi/180 j * angle_step x r[i] * np.cos(theta) y r[i] * np.sin(theta) positions.append((x, y, d[i]/2)) return positions def mtf_cutoff(self, wavelength550e-9, D_eq1.0): max_spatial_freq 0 for x,y,rad in self.positions: freq 2*rad / (wavelength * D_eq) max_spatial_freq max(max_spatial_freq, freq) return max_spatial_freq def mtf(self, u, v, wavelength): mtf_val 0 for x1,y1,r1 in self.positions: for x2,y2,r2 in self.positions: dx x1-x2 dy y1-y2 rad np.sqrt(dx**2dy**2) if rad (r1r2): mtf_val 2 * np.cos(2*np.pi*(u*dxv*dy)) * (r1*r2) / (np.pi*(r1r2)**2) return mtf_val / len(self.positions) class PistonErrorModel: def __init__(self, subaperture_positions, wavelength550e-9): self.positions subaperture_positions self.lam wavelength def piston_to_otf(self, piston_errors): n len(self.positions) OTF np.zeros((n,n), dtypecomplex) for i in range(n): for j in range(n): phase_diff 2*np.pi/self.lam * (piston_errors[i] - piston_errors[j]) OTF[i,j] np.exp(1j * phase_diff) return np.mean(OTF, axis(0,1)) def strehl_ratio(self, piston_errors): otf_avg self.piston_to_otf(piston_errors) return np.abs(otf_avg) def sensitivity_matrix(self, error_types3): H np.zeros((len(self.positions), error_types)) for i, (x,y,_) in enumerate(self.positions): H[i,0] 1 # piston H[i,1] x # tilt x H[i,2] y # tilt y return H class CoPhasingAlgorithm: def __init__(self, psf_image, wavelength, subap_positions): self.psf psf_image self.lam wavelength self.pos subap_positions def mtf_peak_ratio(self): ft np.fft.fft2(self.psf) mtf np.abs(ft) / np.abs(ft).max() center np.array(mtf.shape)//2 peak_main mtf[center[0], center[1]] side_peak np.max(mtf[center[0]-10:center[0]10, center[1]20:center[1]40]) return side_peak / peak_main def estimate_piston(self, calib_curve_coeffs): ratio self.mtf_peak_ratio() poly np.poly1d(calib_coeffs) piston poly(ratio) return piston def closed_loop_control(self, current_errors, setpoint0, bandwidth2.5, dt0.01): error setpoint - current_errors control_signal 0.8 * error 0.2 * np.diff(error) if len(error)1 else 0.8*error return control_signal class GeneticArrayOptimizer: def __init__(self, fill_factor0.12, n_rings3): self.ff fill_factor self.n_rings n_rings def objective(self, params): radii params[:3] diams params[3:6] rot params[6] array IMCAArray([radii], [diams], [rot]) cutoff array.mtf_cutoff() return -cutoff # maximize def optimize(self): bounds [(0.1,0.5), (0.2,0.6), (0.3,0.7), # radii (0.05,0.2), (0.08,0.25), (0.1,0.3), # diams (0, 30)] # rotation result differential_evolution(self.objective, bounds, maxiter100, popsize20) return result.x