【第28期】查表法(Look-Up Table, LUT)与空间换时间

图像超分算法SRLUT: Practical Single-Image Super-Resolution Using Look-Up Table图像超分辨率重建 这篇文章是首次将查表法引入SR领域。将SR网络训练好的缩放像素值存在表中,在测试阶段只需要在表中查找对应值,就能完成图像重建任务。由于该方法不需要大量的浮点运算,因此可以非常快速地执行。 原文链接:SRLUT: Practical Single-Image Super-Resolution Using Look-Up Table 【CVPR2021】 参考目录: 超分之SR-LUT 超分之SR-LUT源码解析 源码(Pytorch) SRLUT: Practical Single-Image Super-. 阅读详情

在嵌入式领域,我们经常面临一个资源不对等的矛盾:Flash 空间很大(通常几百 KB),但 CPU 算力很弱(几十 MHz)。

如果你在单片机里写了 y = sin(x) 或者 temp = log(r), 编译器会生成几百行汇编代码来做泰勒级数展开。你的主循环周期瞬间就会被拉长。

查表法 (Look-Up Table, LUT) 就是解决这个问题的终极武器。

核心思想:“与其现场算,不如提前抄答案。” 利用廉价的存储空间(Flash)来存储预先计算好的结果,换取 CPU 的极速响应。

1. 场景一:三角函数与波形生成

假设你要做一个 SPWM 逆变器或者步进电机 S 型加减速,需要频繁计算 sin(x)。

笨办法:实时计算

#include <math.h> // 引入了庞大的数学库
float val = sin(angle * 3.14 / 180.0); // 浮点运算,耗时几十微秒,且需要 FPU 支持

查表法: 我们把 0~90 度的正弦值放大 1024 倍(定点化,避免浮点运算),提前算好存入数组。

// 放在 Flash (.rodata) 中,不占 RAM
const int16_t SinTable[91] = { 
    0, 17, 35, 53, ... 1024 // 对应 sin(0) ~ sin(90) * 1024
};

int16_t Fast_Sin(uint8_t angle) {
    // 利用对称性,只需存 0-90 度,涵盖 0-360 度
    if (angle <= 90) return SinTable[angle];
    if (angle <= 180) return SinTable[180 - angle];
    if (angle <= 270) return -SinTable[angle - 180];
    return -SinTable[360 - angle];
}

收益:运算时间从 ~50us 降到 ~0.1us (几次内存读取)。

2. 场景二:NTC 热敏传感器 (非线性映射)

NTC 电阻随温度变化的曲线是非线性的,对应的 Steinhart-Hart 方程包含自然对数 ln,单片机算起来非常吃力。

查表策略: ADC 读到的电压值(0~4095)与温度是一一对应的。我们可以生成一张 “ADC值 -> 温度” 的映射表。

问题:如果做一个 int TempTable[4096] 的全表,太占空间了(4096 * 2 = 8KB)。如果 Flash 只有 32KB,这就很奢侈。

优化策略:分段查表 + 线性插值 (Linear Interpolation)

我们不需要存每一个 ADC 值,我们每隔 64 个点存一个温度数据。

// 假设 ADC 步长为 64
// Table[0] 对应 ADC=0 的温度
// Table[1] 对应 ADC=64 的温度...
const int16_t NTC_Table[] = { -40, -10, 25, 60, ... }; 

int16_t Get_Temp(uint16_t adc_val) {
    uint8_t index = adc_val / 64;       // 算出在哪两个点之间 (整数部分)
    uint8_t remainder = adc_val % 64;   // 算出偏移量 (小数部分)
    
    int16_t y0 = NTC_Table[index];      // 左边的温度
    int16_t y1 = NTC_Table[index + 1];  // 右边的温度

    // 核心算法:线性插值 (y = y0 + slope * dx)
    // 假设两点之间是直线,算出中间值
    return y0 + (y1 - y0) * remainder / 64;
}

收益:

  • 空间:表的大小缩小了 64 倍(仅需 100 多字节)。

  • 精度:虽然略有误差,但对于测温来说通常足够(误差 < 0.5度)。

  • 速度:依然只有简单的加减乘除,没有 log。


3. 场景三:状态压缩与位操作

查表法不仅能查数值,还能查“逻辑”。

案例:流水灯花样。 你需要控制 8 个 LED 亮灭,有很多种花样模式。 与其写一堆 if (mode == 1) LED = 0x55;,不如直接查表:

const uint8_t LED_Patterns[] = {
    0x01, 0x02, 0x04, 0x08, // 流水左移
    0x10, 0x20, 0x40, 0x80,
    0x81, 0x42, 0x24, 0x18, // 两边向中间聚合
    0xFF, 0x00, 0xFF, 0x00  // 闪烁
};

void LED_Task() {
    static int i = 0;
    PORTA = LED_Patterns[i]; // 直接输出,毫无逻辑负担
    i = (i + 1) % sizeof(LED_Patterns);
}

这其实就是一种极简的微指令 (Microcode) 思想。


4. 查表法的工程原则

  1. 数据必须 const:一定要加 const 关键字,确保数组存放在 Flash (.rodata) 中。如果不加,启动代码会把它们搬运到 RAM (.data),瞬间撑爆你本来就不富裕的 RAM。

  2. 越界保护:查表意味着用输入作为索引。如果输入是外部传来的(比如串口数据),必须先检查是否超过了数组下标,否则会读取到随机乱码甚至引发 HardFault。

  3. 生成工具:对于大的表格(如 CRC 表、正弦表),不要手写。用 Python 脚本或 Excel 生成 CSV,然后复制进 C 代码中。


本章关键知识点

  1. 本质:用预处理(编译时计算)代替运行时计算。

  2. 权衡:如果计算太复杂(三角、对数、除法),或者逻辑太繁琐(花样控制),请优先考虑查表。

  3. 插值:是平衡表格大小和精度的关键技巧。

/***************************************************
 * 本文为作者《嵌入式开发基础与工程实践》系列文章之一。
 * 关注即可订阅后续内容更新,翻阅往期信息,采用异步推送机制,无需主动轮询。
 * 转发本文可视为一次网络广播,有助于更多节点接收该信息。
 ***************************************************/

 

ALG(Atmospheric Look-up table Generator)大气查找表生成器下载、配置及6sV2.1生成LUT(学习笔记1) ALG(Atmospheric Look-up table Generator)大气查找表生成器下载、配置及模型参数设置、6sV2.1生成LUT示例 阅读详情

相关推荐

图像LUT

显示查找表(Look-Up-Table)简称为LUT,LUT   LUT 本质上就是一个RAM。它把数据事先写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。   LUT(Look-Up Table)实际上就是一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之

jackmacro的专栏 6457

一文看懂LUT(Lookup Table)查找表

对于ReLU激活函数,公式如下: ReLU(x)=max⁡(0,x)\text{ReLU}(x) = \max(0, x)ReLU(x)=max(0,x) 可以看到,ReLU函数将输入值变成非负值(负值变为0,正值保持不变)。对于激活函数(例如ReLU),使用LUT可以在一定范围内通过查找预计算的值来近似函数计算,从而提高计算效率。LUT的基本原理是将函数值预先计算并存储在一个数组或字典中,然后在需要计算函数值时,通过查找这个表格来快速获得近似值。假设激活函数relu,想要通过LUT方法来做,该怎么做?

性感的小君君 3630

嵌入式三角函数查表法:原理、实现与工业优化

三角函数是电机控制、信号处理等实时系统的基础数学运算,但在资源受限的MCU上,浮点计算存在高延迟、高功耗、高内存开销等问题。查表法(Look-Up Table, LUT)通过将连续函数离散化为预计算数值序列,实现O(1)时间复杂度的定点快速访问,显著规避浮点运算瓶颈。其核心在于精度、内存与索引效率的工程权衡,典型采用2^N长度表、Q15定点格式及位运算索引。在FOC矢量控制、SPWM生成、CORDIC协同等场景中,查表法支撑毫秒级环路稳定与微秒级响应,已成为嵌入式实时系统的关键基础技术。

weixin_30021053的博客 697

图像处理加速利器:查找表(LUT)的原理与应用详解(附C++代码)

​​查找表(LUT)​​ 的核心思想是 ​​“以空间换时间”​​。它的基本流程如下:​​预计算​​:在程序初始化阶段,预先计算出所有可能的输入值所对应的输出值,并将这些结果存储在一个数组(即“表”)中。​​查找替换计算​​:在实际处理过程中,当需要计算某个输入值x的输出时,我们不再执行复杂的计算,而是直接通过x的值作为索引,去表中查找对应的结果。​​为什么这样能提速?​​对于CPU而言,从内存中读取一个已知地址的数据(查找)通常比执行一个复杂的数学计算(如sinpow等)要快得多。

m0_51133195的博客 928

高效sin值计算方法:查表法实战指南

在深入探讨查表法计算正弦值之前,我们需要对正弦函数有一个全面的了解。正弦函数是三角函数中最基本的函数之一,它在数学、物理、工程等多个领域都有广泛的应用。正弦函数不仅在三角学中扮演着重要角色,还是描述周期性波动现象的基础工具。

weixin_35756130的博客 1594

基于Python批量获取过去某地某时的天气数据

此段代码为经Visual Weather API官网样例后修改。原代码返回数据格式为json,经测试json风速字段不可用,后改为返回数据格式为csv。若修改weather_api_endpoint,还可获取该地点的预测数据,但返回数据字段可能发生变化,请以官网文档为准。获取到的字段包括:平均温度、露点、湿度、风速、降雨量、能见度、云量、天气类型等。目的:已知某一地址,获取过去某一时间该地的天气数据,并能够批量运行。这一步也会有获取不到的时间和地点,因此为空白。此段代码为经百度地图api官网样例后修改。

wiseman1233的博客 903

stm32使用查表法将utf8转gbk,编码表数组存放在外部flash中

学习笔记:2019-07-13 XZJ 在使用stm32获取服务器下发的json数据时,解析出来的数据编码是utf8格式的,在串口或者LCD上显示都是乱码,为了解决这个问题,百度了一下,发现在stm32上转码的几乎没有,最后有一个用stm32+esp8266获取知心天气的例程中发现了这个转码,这是原文地址http://www.openedv.com/forum.php?mod=viewth...

xu_BK的博客 4864

SAP SD科目确定:从配置到凭证的财务集成核心

本文深入解析SAP SD科目确定的核心价值与配置实践,涵盖从主数据准备到财务凭证生成的全流程。通过六步配置法和KOFI00过程拆解,帮助企业实现销售与财务模块的高效集成,确保收入、成本等数据准确归集至对应会计科目,提升财务自动化水平与数据准确性。

weixin_33491377的博客 251

【OpenCV】查找表用法以及LUT函数的使用

参考的三篇博客的地址 http://blog.youkuaiyun.com/jameshater/article/details/50759650 http://www.voidcn.com/blog/qq_23968185/article/p-5810079.html http://xiahouzuoxin.github.io/notes/html/OpenCV%E5%9F%BA%E7%A1%80

Damu 3734

AI驱动Spine骨骼动画生成:从图像拆分到动画自动化的全流程解析

计算机视觉与生成式AI技术正深度赋能传统数字内容生产流程。在2D动画制作领域,骨骼动画技术通过模拟真实生物关节运动,实现了角色动画的高效制作与灵活控制。其核心原理在于将角色拆分为独立部件,通过骨骼层级关系驱动部件变换,结合关键帧插值算法生成流畅动作。这项技术的工程价值在于大幅降低动画制作门槛,提升内容生产效率,尤其适用于游戏开发、影视预演、广告设计等需要快速原型迭代的场景。本文聚焦于如何利用SIFT特征匹配、RANSAC几何验证等CV算法实现部件自动对位,并结合动画12原则的程序化实现,构建从单张角色立绘到

weixin_28696185的博客 1508

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1176

OpenCV中Look up table操作(LUT函数)详解--在颜色空间缩减中的应用

自己理解+参考网站

王博(Kings)的博客 3161

Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度

【代码】Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度。

weixin_41346436的博客 1797

OpenCv之查表法LUT

摘要:本文介绍了LUT(查表法)在图像处理中的应用。LUT通过预定义映射表实现像素值的快速转换,支持单通道或多通道独立处理。核心应用包括:1)色彩校正与滤镜效果;2)图像增强与缺陷检测;3)动态范围压缩(伪彩色成像);4)实时二值化处理。文中提供了过曝光修复和复古滤镜两个实例,展示了如何通过构建对数变换、伽马校正等LUT表实现高效图像处理。该方法计算速度快,适合工业视觉和实时处理场景。

WSTONECH的博客 685

Android Framework SurfaceFlinger面试题及参考答案

请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是 Android 系统中一个非常关键的服务。它主要负责将多个应用程序的 Surface 合成到一个屏幕显示内容中。 从应用程序的角度来看,每个应用都有自己的 UI 界面,这些 UI 界面实际上是由一系列的图层(Surface)构成。例如,一个应用可能有背景图层、按钮图层、文本图层等。应用通过向 SurfaceFlinger 提供这些 Surface 来请求显示。 SurfaceFl

大模型大数据攻城狮的专栏 1182

【3天快速入门WPF】8-数据绑定基础

以下是一个简单的 WPF 数据绑定示例,使用两个TextBox控件分别表示Name和Age来进行进行数据绑定试验。运行程序后,你会看到初始界面中TextBox 中显示初始名字 “张三”,TextBox 中显示初始年龄 “25”。在 XAML 中创建一个简单的界面,包含一个 TextBox 用于输入名字,一个 TextBox 用于显示年龄。当你在 TextBox 中修改名字时,Person 对象的 Name 属性会被自动更新,反之亦然。它的主要作用是为控件及其子控件提供一个默认的数据源,用于数据绑定。

Zy100Papa的博客 969

【LUT技术专题】SRLUT:Practical Single-Image Super-Resolution Using Look-Up Table

一种极轻量超分算法,提出了模型训练+LUT推理的创新性图像处理范式。用查表来代替模型推理,无需计算过程。适用于算力有限且有SR需求的端侧应用。

PixelMind的博客 2807

RK3588开发板NPU加速YOLO目标检测完整实战教程

🚀 RK3588开发板NPU加速YOLO目标检测实战 本文详细介绍了如何在瑞芯微RK3588开发板上利用内置NPU加速YOLO目标检测的全流程: 1️⃣ 环境准备:配置RKNPU2 SDK和aarch64交叉编译器,搭建Ubuntu开发环境 2️⃣ 模型转换:从ONNX格式转换为专用RKNN模型,适配NPU硬件特性 3️⃣ 性能对比:NPU推理将处理时间从833ms降至50ms以下,帧率提升16倍 4️⃣ 实战应用:支持图像/视频流/摄像头实时检测,提供完整编译和运行命令 关键优势:专为边缘AI设计的6T

FJN110的博客 928

LUT 3D知识

显示查找表(Look-Up-Table)简称为LUT,LUT   LUT 本质上就是一个RAM。它把数据事先写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。 LUT(Look-Up Table)实际上就是一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对

徐新华的专栏 9954

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【LUT技术专题】LUT空间的极致压缩-SPFLUT

SPFLUT提出了一种基于查找表(LUT)的高效图像恢复方法,通过压缩策略减少LUT的冗余,提升性能并降低存储需求。该方法的核心是对角线优先压缩策略(DFC),针对LUT中对角线区域的高频使用特点,保留对角线部分并减少非对角线区域的采样,从而显著减小LUT尺寸。SPFLUT还设计了一个多LUT网络结构,增强了通道特征融合,进一步提升了恢复效果。实验表明,该方法在效果和存储效率之间达到了最佳平衡,尤其在LUT尺寸大幅减小的情况下,性能依然保持优异。

PixelMind的博客 1953

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OpenCV学习 查表函数LUT C++

一、概念 LUT(LOOK -UP-TABLE)查找表。简言之:通过事先建立的一张表对图像进行映射。这样可以起到突出图像的有用信息,增强图像的光对比度的作用对某图像中的像素值进行替换。 二、原理 函数原型: void LUT(InputArray src, InputArray lut, OutputArray dst); //src表示的是输入图像(可以是单通道也可是3通道) //lut表示查找表(查找表也可以是单通道,也可以是3通道; //...如果输入图像为单通道,那查找表必须为单通道; //...若

闫小亘的博客 1014

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

查找表(LUT,Look-up Table)的简单理解

查找表(LUT,Look-up Table)的简单理解 引入:假设有一个 4 输入(a,b,c,d) 1 输出(o) 的逻辑单元,想要了解其内部结构。 输入按照 0000-1111 去遍历,记录输出。得到真值表,运用卡诺图对其化简,得到最简 pos/sop 表达式,用门电路把结构画出来。 真值表的变化反映电路的结构变化,门/线越多,延迟越大,频率越低。也就是表格变化时,电路工作速度不确定,导致严重的时序问题(竞争冒险,亚稳定状态)。 总结:表格的不确定会引起延迟的不确定性和设计复杂的不确定性。 扩展:如果

LoneJade_的博客 6428

FPGA从入门到精通(1) - LUT:(look up table) 查找表

文章详细介绍了FPGA中的LUT(查找表)及其在可编程逻辑块(CLB)中的作用。通过分析Verilog代码和对应的门级电路图,解释了LUT如何通过真值表映射来替代传统的门电路,从而提高FPGA的灵活性和资源利用率。特别强调了LUT6的使用,包括其与两个LUT5和一个多路选择器(MUX)的关系,以及如何通过设置INIT值来实现不同的逻辑操作。

详解FPGA及硬件电路开发 2682

LUT(Look-Up Table,查找表)的定义与核心概念

在FPGA(现场可编程门阵列)中,LUT(查找表)是构成其基本逻辑单元(CLB,可配置逻辑块)的核心组件。LUT 是一种用“存储 + 查表”的方式来实现任意组合逻辑的硬件结构。它不是直接用物理门电路(如与门、或门)搭建逻辑,而是通过预先存储所有可能的输入组合对应的输出结果,再根据实际输入去“查表”得到输出。LUT 是 FPGA 的“逻辑积木”,它用存储查表的方式代替物理门电路,让 FPGA 能在硬件层面灵活实现任意组合逻辑,是 Zynq-7000 等可编程系统芯片实现高性能、高灵活性的核心基础。

weixin_46187287的博客 516

查找表(Look-Up-Table)的原理与结构(Xilinx Spartan-II)

一.查找表(Look-Up-Table)的原理与结构 采用这种结构的PLD芯片我们也可以称之为FPGA:如altera的ACEX,APEX系列,xilinx的Spartan,Virtex系列等。 查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。 目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的16x1的RAM。 当用户通过原理图或HDL...

一个早起的程序员 7973

显示查找表(Look-Up-Table)简称为LUT

  LUT本质上就是一个RAM。它把数据事先写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。   LUT的应用范围比较广泛,例如:LUT(Look-Up Table)可以应用到一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换。显示器的颜色也与其有关。 ...

wydbyxr的博客 3838
上一篇: 【第27期】有限状态机 (FSM):逻辑控制的灵魂
下一篇: C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎
一路往蓝-Anbo
博客等级 码龄8年 792粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路往蓝-Anbo

转发是最高褒奖,硬核打赏随心!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值