资讯动态

MATLAB光路仿真中的相位量化(PQ)实现与参数调优指南

发布时间:2026/9/17 2:00:51 来源:尧图企业网站定制
简介基于PQ分解法的MATLAB潮流计算源码面向电力系统分析学习者与工程技术人员用于求解电网各节点电压、有功无功分布。PQ分解法将负荷节点PQ与发电机节点PV分类处理通过线性化方程加快收敛在实际电网计算中兼顾精度与效率。资源包为rar压缩格式共1个m文件大小仅2KB代码结构紧凑涵盖网络拓扑定义、节点类型设置、基于基尔霍夫定律的方程组构建以及牛顿-拉弗森迭代求解等核心环节并带有计算结果输出逻辑。目前已有160人学习下载。通过研读与调试该程序可直观理解潮流计算中节点分类思想与迭代收敛过程掌握MATLAB矩阵运算、循环迭代等数值计算技巧该代码也可作为进一步扩展牛顿法、高斯-塞德尔法等电力系统算法的起点适合本科课程设计、研究生科研入门或实际工程中原型算法的快速验证。1. 相位量化光路程序源码你下载的是参数而不是魔法同样一段光路有人用 MATLAB 重建出来的焦平面是一个干净的目标图案有人跑出来的却是中心一团亮斑加一圈噪声。区别往往不在物理模型而在一个叫 PQ 的参数上。PQ 在光路仿真里绝大多数情况指 phase quantization也就是把连续的相位分布切成有限个离散台阶。SLM 的灰阶是 8 bit实际相位调制只有 256 级甚至更少仿真里如果不做量化算出来的光强分布就和实验对不上。这套 MATLAB 光路程序源码解决的就是从目标光场到相位分布、再从量化相位到重建光斑的完整链路适合做计算全息、激光整形、涡旋光束、成像系统仿真的工程师和研究生。读这套源码时要盯住三个量量化电平数 M、像素尺寸 dx、传播距离 z它们决定了仿真结果离实验有多远。2. 量化台阶如何进入光路传播模型PQ 的数学位置2.1 从复振幅到量化相位先搞清楚程序在哪一步做 PQ光路仿真程序的第一步不是算传播而是定义输入平面上的复振幅分布。常见的目标光场是振幅已知、相位待求比如一个目标图像A_target(x, y)程序通过 GS 算法或直接相位恢复得到连续相位phi(x, y)再把它交给 SLM 的相位调制函数。到这里为止没出现 PQ量化发生在生成 SLM 相位图之前% phi: 连续相位, 范围 [-pi, pi) % M: 量化电平数, SLM 8bit 时 M 256, 实验常见 M 16 或 32 phase_q round((phi pi) / (2 * pi / M)) * (2 * pi / M) - pi;这段代码把连续相位分成 M 个均匀台阶。round之后乘回台阶宽度得到的就是量化相位。注意phi pi再归一化是为了让 round 的输入落在正区间避免负数取整时的边界误差。量化之后的相位面在程序中以exp(1i * phase_q)参与后续传播。这一步直接改变了频谱分布量化是把理想相位加了一个锯齿状误差等效于在频域引入高阶衍射级。所以源码里如果只在最后显示目标图像、不检查频谱量化误差会被完全掩盖。2.2 角谱法里决定精度的三个数dx、λ、z传播过程在绝大多数开源光路程序里用角谱法实现。角谱法把输入场拆成平面波分量每个分量乘以一个传播因子再做逆傅里叶变换function U_out angular_spectrum_prop(U_in, dx, lambda, z) [Ny, Nx] size(U_in); fx (-Nx/2 : Nx/2-1) / (Nx * dx); fy (-Ny/2 : Ny/2-1) / (Ny * dx); [FX, FY] meshgrid(fx, fy); H exp(1i * 2 * pi * z / lambda .* sqrt(1 - (lambda * FX).^2 - (lambda * FY).^2)); U_out ifft2(ifftshift(fftshift(fft2(U_in)) .* H)); end这里H是角谱传递函数FX和FY是频域坐标。这段代码在采样满足奈奎斯特条件时是精确的但sqrt里出现负数时意味着倏逝波程序不会报错只会给你一个指数衰减的错误结果。检查这一项是否越界是源码下载后第一个要看的点。数值上更隐蔽的是采样率。角谱法要求频域间隔足够小否则重建面的观察范围不够。经验判据是z N * dx^2 / lambdaN 是单边像素数。这个关系在源码里通常写成注释但很少有人解释含义传播距离超过这个值时输出平面的采样间隔lambda * z / (N * dx)会变得比输入平面的物理尺寸还大结果就是重建图像明显缩小甚至折叠。参数典型值超限后果dx像素尺寸8 μm / 3.74 μm过大会频谱混叠过小则观察范围不足lambda波长532 nm / 633 nm波长偏差直接影响传播相位z传播距离满足 z ≤ N·dx²/λ超限后重建目标缩小M量化电平16 / 32 / 256太小则零级和高阶衍射明显2.3 量化误差的解析边界衍射效率和 M 的关系量化不是越细越好M 到一定程度后继续增加实验上根本看不到区别。原因是量化噪声功率随 M 平方下降而像素化、SLM 的 gamma 非线性、环境振动带来的误差远大于它。理论上一阶衍射效率随 M 的变化满足eta_M sinc(1/M)^2M 2 时效率约 40.5%M 4 时约 81%M 8 时约 95%M 16 时约 98.7%。把这个趋势和实验系统噪声放在一起看就能判断 8 bit 的 SLM 在上限上几乎不会成为瓶颈。很多源码把默认 M 设为 256这时量化噪声已经不是限制因素真正限制重建质量的是采样率和像素化本身。下面第 3 章直接给出可运行的源码结构和跑通方式。3. 在 MATLAB 里跑通 PQ 光路程序源码最小实现与文件组织3.1 源码下载后第一步确认入口文件和路径一套标准的 PQ 光路程序源码文件组织大致是main_quant_bench.m为主入口angular_spectrum_prop.m为传播函数quant_phase.m为量化函数utils/下放显示和评估工具。首次运行时很多问题出在路径和 MATLAB 版本兼容性上比如代码用了tiledlayout但你的 2026b 版本没问题而老版本会报错。下载后先在 MATLAB 里运行cd(你的源码目录); addpath(genpath(pwd)); % 检查当前 MATLAB 版本是否满足源码最低要求 disp(version);用genpath加所有子目录是为了避免util、lib这类目录没有被自动加入搜索路径。版本检查的意义在于源码如果用了arguments块或gpuArray相关的 API在 2023a 以下版本会出现运行时错误而不是解析错误。3.2 量化函数通用版本和 SLM 对齐版本前面给过一个简单量化实现但实际光路程序通常要求量化边界不是从-pi开始的而是和 SLM 的相位-灰阶曲线对齐。更通用的量化函数可以写成function phase_q quant_phase(phi, M, phase_min) % phase_min: SLM 最小相位, 默认 -pi if nargin 3 phase_min -pi; end L 2 * pi; % 相位区间宽度, 默认 2pi step L / M; phase_norm (phi - phase_min) / step; phase_q phase_min round(phase_norm) * step; % 归一到 [-pi, pi), 避免相位跳变点落在目标区域 phase_q mod(phase_q pi, 2 * pi) - pi; endnargin判断允许第二级调用方只传两个参数时走默认值。mod这一步很关键如果没有最后一行round可能把靠近pi的相位映射到pi之外导致重建相位面上出现一条人为的跳变线。这种跳变不会报错但会在重建图像里表现为一条暗线。参数上要注意M不一定是 2 的幂才能工作。SLM 的驱动灰阶是 8 bit但实际有效电平数可能只有 4 bit 左右这受制于液晶的电光曲线。仿真时设 M 16 是常见折中M 32 以上和 M 256 的结果差异在图像上几乎不可见但耗时增加有限因为量化本身是逐元素运算瓶颈永远在 FFT 上。3.3 主程序生成目标、量化、传播到焦平面完整的最小主程序如下它生成一个环形目标相位恢复后做 PQ再角谱传播到焦平面clear; clc; % 物理参数 lambda 532e-9; % 波长 532nm dx 8e-6; % 像素尺寸 8um, 接近常见 SLM 像素 N 1024; % 网格点数, 1024 在内存和速度上均衡 z 8e-3; % 传播距离 8mm % 目标场: 半径 100 像素的环 [x, y] meshgrid((1:N)-N/2, (1:N)-N/2); r sqrt(x.^2 y.^2); A_target double((r 90) (r 110)); % 随机相位作为初始猜测, 加一个小常数避免全零 phi0 2 * pi * rand(N, N); U0 A_target .* exp(1i * phi0); % 连续相位: 这里用简单的傅里叶约束迭代, 3 次就够看趋势 for iter 1:3 U_forward angular_spectrum_prop(U0, dx, lambda, z); % 保持振幅, 替换相位 U_forward A_target .* exp(1i * angle(U_forward)); U_back angular_spectrum_prop(U_forward, dx, lambda, -z); U0 A_target .* exp(1i * angle(U_back)); end % 取输入面相位并量化 phi_cont angle(U0); M_levels 16; phi_q quant_phase(phi_cont, M_levels, -pi); % 传播量化相位到输出面 U_q_out angular_spectrum_prop(exp(1i * phi_q), dx, lambda, z); I_out abs(U_q_out).^2; % 显示 figure(Name, PQ 光路仿真结果); subplot(1, 2, 1); imagesc(phi_q); axis image; colorbar; title(量化相位); subplot(1, 2, 2); imagesc(I_out); axis image; colorbar; title(焦平面光强);这段代码里angular_spectrum_prop在迭代中反向传播一个-z这是相位恢复的标准做法。三个迭代足够让环形目标成形但不会达到收敛。参数上注意A_target是逻辑数组直接和复数场相乘会隐式转为 double不影响结果但会增加内存拷贝在 N 2048 时要留意。exp(1i * phi_q)构造量化后的透射函数这一步在程序里是必须的。直接传播phi_q本身是错误的常见来源因为角谱传播假设输入是复振幅不是相位值本身。传导到subplot两张图时左右对比就能直观看到量化噪声。3.4 结果检查三级判断法程序跑完先做三级检查比直接看imagesc靠谱得多。第一级检查量化相位图上有没有从-pi到pi的锯齿线。正常的相位面允许跳变但跳变位置应该随机且细碎如果出现大面积平滑渐变说明quant_phase的mod处理有问题。第二级检查焦平面光强的中心区域。量化后出现中心亮斑是正常现象它对应零级衍射但亮斑能量占比超过 10% 就说明 M 太小或填充因子效应没处理。第三级用下面这段代码对比量化前后的衍射效率I_before abs(angular_spectrum_prop(exp(1i * phi_cont), dx, lambda, z)).^2; I_after abs(angular_spectrum_prop(exp(1i * phi_q), dx, lambda, z)).^2; target_mask (r 90) (r 110); eff_before sum(I_before(target_mask)) / sum(I_before(:)); eff_after sum(I_after(target_mask)) / sum(I_after(:)); fprintf(M%d, 连续相位效率%.3f, 量化后效率%.3f\n, M_levels, eff_before, eff_after);这两行fprintf输出的数值直接告诉你 M 的选取是否合理。连续相位效率一般能做到 80% 以上量化后如果掉到 50% 以下优先怀疑量化台阶和相位恢复迭代次数不够而不是 SLM 参数设错。4. 源码下载后必调的 4 个参数从仿真对齐到实验4.1 dx 和 N 的组合奈奎斯特判据与内存上限dx和N不能单独调。dx决定空间频率范围N决定频率分辨率两者乘积决定观察范围。常见错误是只把dx改小来对齐 SLM 的像素尺寸却忘了几何尺寸N * dx也随之缩小导致目标环的半径显得巨大传播到焦平面时直接出界。建议先用表格式对照确认三组数的关系目标观察范围 (mm)Ndx (μm)最大传播距离 (mm)8.2102481234.110244618.220484246z N * dx^2 / lambda这个判据决定角谱法能否直接用。超出时不要急着用 Fresnel 近似先把N翻倍把观察范围扩大或者把传播分成多段做分步传播。分段时的每段距离满足判据即可但要多做一次 FFT耗时大概增加一倍。4.2 量化电平数 M 和 SLM 灰阶之间的换算SLM 标称 8 bit 灰阶256 级不意味着相位调制就有 256 个有效电平。液晶的电压-相位曲线通常只在某段电压范围近似线性实际有效电平数是 32 到 64 的常见水平。对应到仿真里M 16到M 32就足够贴近实验。有人直接把M 256跑仿真得出漂亮结果实验却复现不了就是这个原因。如果源码里有 gamma 校正模块把M设成 SLM 厂商给的有效电平数而不是灰阶级数。没有 gamma 校正时在量化前加一个非线性映射更接近实验% gamma 校正近似: 将均匀量化映射到非均匀分布 phi_nonlinear sign(phi_cont) .* abs(phi_cont).^1.2; phi_q_nonlin quant_phase(phi_nonlinear, M_levels, -pi);abs(phi_cont).^1.2模拟液晶在中段过饱和的响应特性。这个近似只适用于定性评估定量对标还是要用厂商实测的相位响应曲线。4.3 填充因子和零级衍射的仿真化处理真实 SLM 像素间有死区填充因子通常在 0.9 到 0.97 之间。死区的相位不变化等价于一个恒定背景光在焦平面形成零级亮斑。源码里如果完全没有这个环节仿真会把零级理想化地压制掉。一个折中做法是在输入面叠加一个低振幅平面波fill_factor 0.93; % 常见 LCOS 填充因子 U_slm fill_factor * exp(1i * phi_q) (1 - fill_factor) * ones(N, N); U_out angular_spectrum_prop(U_slm, dx, lambda, z);这里的fill_factor * exp(1i * phi_q)表示有效调制区域(1 - fill_factor) * ones(N, N)表达死区反射的背景。两个分量相干叠加在焦平面中心产生的亮斑强度大约是(1 - fill_factor)^2的量级。对应到实验里要把中心亮斑挡住或用离轴设计避开。4.4 用 MATLAB 优化工具箱自动寻找最优参数手动改M、dx验证效率太低。源码下载后可以直接用fminsearch包一层标量目标函数自动扫描 M 和 z。% 目标函数: 给定 M 和 z, 返回量化后效率 function neg_eff target_func(params) M_t round(params(1)); z_t params(2); phi_t quant_phase(phi_cont, M_t, -pi); U_t angular_spectrum_prop(exp(1i * phi_t), dx, lambda, z_t); I_t abs(U_t).^2; neg_eff -sum(I_t(target_mask)) / sum(I_t(:)); end % 从 M16, z8mm 开始 opt_params fminsearch((p) target_func(p), [16, 8e-3]);fminsearch不要求梯度适合这个离散和连续混合的小规模问题。注意M_t用round后数值不连续优化器可能收敛到局部极值所以要多试几组初始值。结果里z如果明显偏离判据比如超出N * dx^2 / lambda说明优化器在补偿采样不足这不是物理上的最优传播距离。5. 验证 PQ 光路仿真结果的三个可执行技巧5.1 零级能量占比一眼看出量化噪声的严重程度零级能量占比是判断 PQ 仿真是否可信的最快指标。取输出面中心半径 5 个像素的区域计算这部分能量占全平面的比例center_region zeros(N, N); center_region(N/2-2:N/22, N/2-2:N/22) 1; zero_order_ratio sum(I_out(center_region 1)) / sum(I_out(:));占比小于 5% 时量化噪声处于可接受范围超过 10%优先把 M 翻倍再看变化。注意这个指标对目标图案的复杂度不敏感即使目标环半径再大零级亮斑始终在中心不会因为你把目标移出中轴就消失。5.2 用一个数值确认 M 的边际收益把 M 从 2 依次按 2 倍往上取算出每个 M 下的重建相关度看曲线的拐点。这个技巧能直接告诉你源码里 M 该设多少M_list [2, 4, 8, 16, 32, 64, 256]; corr_list zeros(size(M_list)); for k 1:length(M_list) phi_k quant_phase(phi_cont, M_list(k), -pi); I_k abs(angular_spectrum_prop(exp(1i * phi_k), dx, lambda, z)).^2; corr_list(k) corr2(A_target, I_k / max(I_k(:))); end semilogx(M_list, corr_list, o-);corr2直接比较目标振幅和归一化光强数值在 0 到 1 之间。曲线在 M 16 到 32 之间的抬升幅度通常已经很小再往上增加 M相关度提升不到 0.5%但源码里的内存开销和计算时间并没有明显变化。用这条曲线作为实验前的依据比直接套 8 bit 灰阶更有说服力。5.3 把量化误差可视化为差异图最后把量化和未量化的输出光强放在同一坐标系下做差能定位噪声的分布规律而不是只看一个相关性数值I_before_norm I_before / max(I_before(:)); I_after_norm I_after / max(I_after(:)); diff_map I_after_norm - I_before_norm; imagesc(diff_map, [-0.2 0.2]); axis image; colorbar;差异图里如果噪声呈规则网格状说明是像素化效应主导如果是随机散斑状说明是量化台阶带来的频谱泄漏。这两种噪声的压制手段不同前者需要减小像素尺寸或增大死区补偿后者只需要提高 M。跑完这组对比再回到源头检查量化函数的mod边界确定最终 M 后整套源码在实验和仿真之间的衔接就具备可复现的基础了。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价