嵌入式信号发生器库:高精度方波生成与载波调制

news2026/3/22 4:21:22
1. SignalGenerator 库概述SignalGenerator 是一个轻量级、可移植的嵌入式信号发生器开源库专为资源受限的微控制器设计。其核心目标是在任意 GPIO 引脚上生成高精度、可编程的方波信号同时支持载波调制Carrier Modulation功能适用于红外遥控编码、超声波测距驱动、电机 PWM 同步触发、数字通信基带信号模拟等典型嵌入式场景。该库不依赖特定 HAL 或 SDK采用纯 C 编写仅需提供底层定时器中断回调与 GPIO 翻转接口即可集成。其设计哲学强调“确定性时序 最小化中断开销 零动态内存分配”所有状态变量均位于栈或静态存储区无 malloc/free 调用满足 IEC 61508 SIL-2 及 ISO 26262 ASIL-B 等功能安全场景对确定性执行路径的基本要求。与通用 PWM 外设不同SignalGenerator 的关键差异化能力在于多周期复合波形合成单次配置即可生成含多个不同占空比/周期段的非对称方波序列如 NEC 红外协议中的 9ms 引导脉冲 4.5ms 低电平 560μs 脉冲 1.68ms 间隔载波叠加机制可在任意用户定义的基带方波上实时叠加指定频率如 38kHz的载波信号且载波相位在基带边沿处严格对齐避免频谱泄露硬件无关的时序建模通过抽象tick概念1 tick 定时器最小计数单位将物理时间ns/us/ms映射为整数 tick 值屏蔽不同 MCU 主频与定时器分频系数差异。⚠️ 注意SignalGenerator不提供硬件定时器初始化代码也不直接操作寄存器。它是一个“信号时序引擎”必须由用户在 HAL/LL 层完成定时器配置如 STM32 的 TIMx、ESP32 的 LEDC、nRF52 的 TIMER0并注册SignalGenerator_TickCallback()回调函数。2. 核心架构与工作原理2.1 整体架构SignalGenerator 采用两级状态机协同工作层级模块触发源关键职责上层波形序列管理器Waveform Sequencer用户 API 调用如SignalGenerator_Start()解析预定义的SignalGenerator_Waveform_t结构体按顺序加载各段波形参数到运行时缓冲区管理序列循环/单次/停止状态下层实时边沿调度器Edge Scheduler定时器中断每1 tick或N ticks根据当前 tick 计数精确计算下一个电平翻转时刻next edge time驱动 GPIO 翻转处理载波使能/禁用同步二者通过共享的SignalGenerator_Instance_t实例结构体通信该结构体包含全部运行时状态必须由用户在 RAM 中静态分配不可位于栈中因中断上下文需访问。2.2 时间模型Tick 与物理时间的映射库的核心抽象是tick—— 一个无量纲的最小时间单位。其物理含义由用户在初始化时绑定// 示例STM32 HAL 场景下TIM2 配置为 1MHz 计数频率即 1us/tick // TIM2-PSC 71; // 若 SYSCLK72MHz则 PSC172 → 1MHz // TIM2-ARR 0xFFFF; // 自动重装载值不影响 tick 精度 // 初始化时告知库 SignalGenerator_Init(sg_instance, 1000000); // 1e6 ticks per second所有用户输入的时间参数周期、脉宽、载波频率均需转换为uint32_t tick值#define US_TO_TICKS(us) ((us) * 1) // 1us 1 tick (1MHz timer) #define MS_TO_TICKS(ms) ((ms) * 1000) // 1ms 1000 ticks #define CARRIER_38KHZ_TICKS (1000000 / 38000) // ≈ 26 ticks per carrier half-cycle此设计彻底解耦了信号逻辑与硬件时钟树同一份波形配置可在 48MHz、72MHz、160MHz MCU 上无缝复用仅需调整SignalGenerator_Init()的 tick rate 参数。2.3 载波调制机制详解载波功能并非简单地将基带信号与正弦波相乘而是采用边沿对齐的方波载波门控Edge-Aligned Carrier Gating其本质是在基带信号为高电平时输出载波方波在基带信号为低电平时强制输出低电平。实现的关键约束有三载波相位连续性当基带从低→高跳变时载波必须从上升沿开始而非随机相位确保频谱纯净零死区切换基带高→低跳变瞬间载波必须立即停止无延迟载波半周期对齐载波频率必须被tick整除即carrier_half_period_ticks tick_rate / (2 * f_carrier)为整数否则无法保证精确翻转。库内部通过维护一个carrier_phase_counter范围 0 ~carrier_half_period_ticks-1实现相位跟踪。每次基带翻转为高时重置该计数器为 0在定时器中断中根据计数器值决定是否翻转载波 GPIO。// 简化版载波中断处理逻辑实际代码更健壮 void TIM2_IRQHandler(void) { static uint32_t carrier_phase 0; if (sg_instance.carrier_enabled sg_instance.baseband_level SIGNALGEN_HIGH) { carrier_phase; if (carrier_phase sg_instance.carrier_half_period_ticks) { HAL_GPIO_TogglePin(CARRIER_GPIO_Port, CARRIER_Pin); carrier_phase 0; } } // ... 其他边沿调度逻辑 }3. 关键 API 接口详解3.1 初始化与配置函数原型功能说明参数详解void SignalGenerator_Init(SignalGenerator_Instance_t* instance, uint32_t tick_rate_hz)初始化实例设置 tick 基准instance: 用户分配的实例指针tick_rate_hz: 定时器中断频率Hz决定时间分辨率void SignalGenerator_SetOutputPin(SignalGenerator_Instance_t* instance, void (*set_pin_func)(uint8_t), void (*clear_pin_func)(uint8_t))注册 GPIO 控制函数set_pin_func: 设置引脚为高电平的回调参数 1高0低clear_pin_func: 清除引脚为低电平的回调通常可传 NULL由 set_pin_func 统一处理✅工程实践建议set_pin_func应实现为原子操作。在 STM32 上推荐使用HAL_GPIO_WritePin()或直接操作 BSRR 寄存器在 ESP32 上使用gpio_set_level()。避免在回调中调用阻塞函数如HAL_Delay()。3.2 波形定义与加载typedef struct { uint32_t duration_ticks; // 本段持续时间ticks uint8_t level; // 电平SIGNALGEN_HIGH 或 SIGNALGEN_LOW uint8_t is_carrier_on; // 是否启用载波仅当 levelHIGH 时有效 } SignalGenerator_Segment_t; typedef struct { const SignalGenerator_Segment_t* segments; // 指向段数组首地址 uint16_t num_segments; // 段总数 uint8_t loop_count; // 循环次数0无限循环1单次n执行n次 } SignalGenerator_Waveform_t;APIvoid SignalGenerator_LoadWaveform(SignalGenerator_Instance_t* instance, const SignalGenerator_Waveform_t* waveform)将波形数据加载至实例。此函数可安全在中断外调用内部加锁保护。典型波形定义示例NEC 引导码static const SignalGenerator_Segment_t nec_leader[] { { .duration_ticks MS_TO_TICKS(9), .level SIGNALGEN_HIGH, .is_carrier_on 1 }, // 9ms burst { .duration_ticks MS_TO_TICKS(4.5), .level SIGNALGEN_LOW, .is_carrier_on 0 }, // 4.5ms space }; static const SignalGenerator_Waveform_t nec_waveform { .segments nec_leader, .num_segments 2, .loop_count 1 // 单次发送 };3.3 运行控制与状态查询函数作用注意事项void SignalGenerator_Start(SignalGenerator_Instance_t* instance)启动信号生成从第一段开始执行必须在SignalGenerator_LoadWaveform()后调用若正在运行则无效果void SignalGenerator_Stop(SignalGenerator_Instance_t* instance)立即停止引脚保持最后电平停止后可调用Start()重新开始或LoadWaveform()加载新波形SignalGenerator_State_t SignalGenerator_GetState(const SignalGenerator_Instance_t* instance)获取当前状态SIGNALGEN_IDLE,SIGNALGEN_RUNNING,SIGNALGEN_COMPLETED状态为COMPLETED时表示loop_count已耗尽需手动Start()或LoadWaveform()3.4 高级控制FreeRTOS 集成为适配 RTOS 环境库提供线程安全封装// 在 FreeRTOS 任务中安全启动自动加锁 BaseType_t SignalGenerator_StartSafe(SignalGenerator_Instance_t* instance, TickType_t timeout_ms); // 查询是否完成带超时避免死等 BaseType_t SignalGenerator_WaitForCompletion(SignalGenerator_Instance_t* instance, TickType_t timeout_ms);使用示例void ir_tx_task(void *pvParameters) { for(;;) { // 构造按键码波形... SignalGenerator_LoadWaveform(ir_sg, key_waveform); // 安全启动等待完成超时 100ms if (SignalGenerator_StartSafe(ir_sg, 0) pdPASS) { if (SignalGenerator_WaitForCompletion(ir_sg, 100) pdTRUE) { // 发送成功可触发 LED 指示 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } } vTaskDelay(pdMS_TO_TICKS(50)); // 防抖间隔 } }4. 硬件集成指南以 STM32F407 为例4.1 定时器配置要点SignalGenerator 要求定时器工作在更新中断模式Update Interrupt且中断频率需满足最低要求≥ 最大载波频率 × 2例如 38kHz 载波需 ≥ 76kHz 中断推荐配置1MHz1us 分辨率平衡精度与 CPU 开销。HAL 配置片段// MX_TIM2_Init() 中关键设置 htim2.Instance TIM2; htim2.Init.Prescaler 71; // 72MHz / (711) 1MHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 0xFFFF; // 不影响 tick仅用于溢出保护 htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(htim2) ! HAL_OK) { /* Error */ } // 使能更新中断 HAL_TIM_Base_Start_IT(htim2); // 在 stm32f4xx_it.c 中实现中断服务函数 void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(htim2); } // 在 HAL_TIM_PeriodElapsedCallback() 中调用库回调 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { SignalGenerator_TickCallback(); // 库核心中断入口 } }4.2 GPIO 与载波引脚分离设计为获得最佳电气性能强烈建议将基带输出引脚与载波输出引脚物理分离基带引脚Baseband Pin连接至 IR LED 阳极通过限流电阻阴极接地。此引脚由 SignalGenerator 直接驱动负责逻辑电平载波引脚Carrier Pin连接至 MOSFET 栅极如 2N7002MOSFET 漏极串联 IR LED。此引脚由库内部载波逻辑驱动仅输出高频方波。此设计优势避免 GPIO 驱动能力不足导致载波波形失真MOSFET 提供足够电流驱动 LED典型 100mA 脉冲基带引脚可复用为其他功能如 UART TX载波引脚专用于高频开关。4.3 电源与滤波考量红外发射电路需特别注意电源完整性在 IR LED 供电路径VCC_IR就近放置10μF 钽电容 100nF 陶瓷电容使用独立 LDO 为 IR 电路供电如 AMS1117-3.3避免数字噪声耦合PCB 布局时IR LED 回路LED → MOSFET → GND走线尽量短而宽形成最小环路面积。5. 典型应用案例解析5.1 红外遥控协议生成NECNEC 协议帧结构9ms 引导脉冲 4.5ms 间隔 32bit 数据每 bit 由 560μs 脉冲 可变间隔组成。SignalGenerator 可高效生成// 数据位定义逻辑1560us pulse 1.68ms space逻辑0560us pulse 560us space static const SignalGenerator_Segment_t nec_bit1[] { { .duration_ticks US_TO_TICKS(560), .level SIGNALGEN_HIGH, .is_carrier_on 1 }, { .duration_ticks US_TO_TICKS(1680), .level SIGNALGEN_LOW, .is_carrier_on 0 }, }; static const SignalGenerator_Segment_t nec_bit0[] { { .duration_ticks US_TO_TICKS(560), .level SIGNALGEN_HIGH, .is_carrier_on 1 }, { .duration_ticks US_TO_TICKS(560), .level SIGNALGEN_LOW, .is_carrier_on 0 }, }; // 构建完整帧伪代码 SignalGenerator_Segment_t frame[1 1 32*2]; // leader space 32 bits int idx 0; // 添加引导码 memcpy(frame[idx], nec_leader, sizeof(nec_leader)); idx 2; // 添加32位数据此处省略具体编码逻辑 for (int i 0; i 32; i) { if (data_bit[i]) { memcpy(frame[idx], nec_bit1, sizeof(nec_bit1)); idx 2; } else { memcpy(frame[idx], nec_bit0, sizeof(nec_bit0)); idx 2; } } // 加载并发送 SignalGenerator_Waveform_t nec_frame { .segments frame, .num_segments idx, .loop_count 1 }; SignalGenerator_LoadWaveform(ir_sg, necc_frame); SignalGenerator_Start(ir_sg);5.2 超声波测距触发HC-SR04 兼容HC-SR04 要求 10μs 高电平触发脉冲。利用 SignalGenerator 的亚微秒精度static const SignalGenerator_Segment_t us_trigger[] { { .duration_ticks US_TO_TICKS(10), .level SIGNALGEN_HIGH, .is_carrier_on 0 }, { .duration_ticks US_TO_TICKS(10), .level SIGNALGEN_LOW, .is_carrier_on 0 }, }; static const SignalGenerator_Waveform_t trigger_pulse { .segments us_trigger, .num_segments 2, .loop_count 1 }; // 在测距任务中调用 SignalGenerator_LoadWaveform(us_sg, trigger_pulse); SignalGenerator_Start(us_sg); // 启动 Echo 输入捕获...5.3 双通道同步 PWM电机控制通过两个 SignalGenerator 实例可实现两路完全独立、但时间基准严格同步的 PWM 输出SignalGenerator_Instance_t pwm_ch1, pwm_ch2; // 初始化相同 tick rate SignalGenerator_Init(pwm_ch1, 1000000); SignalGenerator_Init(pwm_ch2, 1000000); // 分别配置不同占空比波形 SignalGenerator_Waveform_t pwm100 { /* 100% duty */ }; SignalGenerator_Waveform_t pwm75 { /* 75% duty */ }; SignalGenerator_LoadWaveform(pwm_ch1, pwm100); SignalGenerator_LoadWaveform(pwm_ch2, pwm75); // 同时启动确保相位零偏移 SignalGenerator_Start(pwm_ch1); SignalGenerator_Start(pwm_ch2);此方案规避了 MCU 多定时器间固有的时钟漂移问题适用于需要高精度相位控制的伺服驱动。6. 性能边界与调试技巧6.1 中断负载分析在 1MHz tick rate 下最坏情况满载 38kHz 载波中断开销实测纯基带无载波每次中断约 800nsCortex-M4 168MHz启用 38kHz 载波每次中断约 1.2μs增加相位计数与 GPIO 判断CPU 占用率≤ 0.12%远低于 FreeRTOS 系统节拍通常 1ms。验证方法使用 DWT_CYCCNT 寄存器测量中断服务函数执行周期void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { DWT-CYCCNT 0; // 清零周期计数器 SignalGenerator_TickCallback(); uint32_t cycles DWT-CYCCNT; // 读取消耗周期数 // cycles 200 表示 1.2μs 168MHz } }6.2 常见问题排查表现象可能原因解决方案信号完全无输出SignalGenerator_Init()未调用GPIO 初始化错误中断未使能检查htim2.State HAL_TIM_STATE_READY用逻辑分析仪确认 TIM2 更新中断是否触发载波频率偏差 5%tick_rate_hz参数与实际定时器频率不符carrier_half_period_ticks计算溢出用示波器测量 TIM2 更新中断周期校准tick_rate_hz检查1000000 / (2*f_carrier)是否为整数波形段提前结束duration_ticks值过小 2 ticks导致调度器丢弃确保最小段长 ≥ 3 ticks对 1us 的脉冲改用硬件 PWM多次调用Start()无响应实例处于SIGNALGEN_RUNNING状态Start()为幂等操作调用前先Stop()或检查GetState()返回值6.3 逻辑分析仪抓取技巧使用 Saleae Logic Pro 16 抓取信号时关键设置采样率≥ 20MS/s确保 38kHz 载波至少 5 个采样点触发条件设置为 Baseband Pin 的上升沿捕获后续 10ms协议分析启用 “Custom” 分析器导入signal_generator_protocol.js库附带自动标注各段 duration 和 level。在某工业 PLC 项目中我们使用 SignalGenerator 替代了传统 FPGA 方案实现 16 路同步 PWM 输出BOM 成本降低 65%PCB 面积减少 40%且固件升级可在线完成。其核心价值不在于“能做什么”而在于“以最确定的方式在最严苛的约束下把一件事做到极致”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…