用C语言编写简单的对数函数

作为一个图像处理芯片公司的工程师,支持不同sensor的曝光策略是一个ISP的基本功能,但是有的sensor曝光策略复杂,还需要加上sensor厂商自己添加的补丁,而ISP本身空间有限,不能引用math.h,或者大量定义数组来查表,所以有时候需要发挥自己的想象力。

比如`.

// An highlighted block
const unsigned int gain_table[225] = {1024, 1046, 1069, 1092, 1116, 1140, 1166, 1191, 1217, 1244, 1271, 1299, 1328, 1356, 1386, 1416, 1448, 1479, 1512, 1545, 1579, 1613, 1649, 1685, 1722, 1760, 1798, 1837, 1878, 1918, 1960, 2003, 2048, 2092, 2138, 2185, 2233, 2281, 2332, 2383, 2435, 2489, 2543, 2598, 2656, 2714, 2774, 2833, 2896, 2959, 3024, 3090, 3158, 3226, 3297, 3371, 3443, 3518, 3597, 3675, 3754, 3837, 3923, 4009, 4096, 4185, 4277, 4371, 4466, 4563, 4664, 4766, 4871, 4976, 5087, 5197, 5312, 5427, 5546, 5667, 5793, 5919, 6048, 6181, 6316, 6455, 6597, 6740, 6890, 7040, 7194, 7351, 7513, 7674, 7843, 8015, 8192, 8371, 8555, 8742, 8933, 9127, 9331, 9532, 9742, 9956, 10174, 10394, 10625, 10859, 11096, 11335, 11586, 11839, 12096, 12363, 12633, 12905, 13189, 13486, 13774, 14074, 14388, 14703, 15019, 15349, 15694, 16039, 16384, 16743, 17102, 17476, 17867, 18255, 18662, 19065, 19485, 19901, 20336, 20789, 21236, 21704, 22192, 22671, 23172, 23663, 24209, 24708, 25266, 25811, 26379, 26973, 27548, 28149, 28777, 29382, 30066, 30727, 31359, 32078, 32768, 33487, 34239, 34952, 35696, 36792, 37282, 38130, 38926, 39850, 40721, 41630, 42473, 43464, 44384, 45343, 46345, 47393, 48349, 49490, 50533, 51622, 52758, 53946, 55188, 56299, 57456, 58867, 60133, 61455, 62836, 64035, 65536, 66841, 68478, 69905, 71392, 72944, 74565, 76260, 78033, 79512, 81442, 83055, 85163, 86928, 88768, 90687, 92691, 94786, 96978, 98689, 101067, 103563, 105517, 107546, 110376, 112598, 114912, 117323, 119837, 122461, 125203, 128070, 131072,
};
void set_gain(unsigned int gain)
{unsigned int ret = 0, i;unsigned int gain_idx, sghd_patch = 1;   // Check gainif (gain > gain_table[224])gain = gain_table[224];else if(gain < gain_table[0])gain = gain_table[0];// search most suitable gain into gain tablefor (i=0; i<224; i++) {if (gain_table[i]> gain)break;sensor_i2c_write(0x83, i);
}

这个sensor的增益策略是一个典型的查表法。但是ISP的空间有限,无法设定那么多数组,于是我在excel表中将数据做了处理,先搞清楚数组和所求的i之间的关系。

发现对应表格数据除以32的平方增益倍数就比较容易看出来了。

大概的增益倍数 i = 32 x log2gain。
所以想要知道i,必须要计算一个对数函数,但是问题来了,ISP的固件里面不能引用math.h!所以只能自己编写一个求对数的函数!通过百度,在csdn上查出来一个自己编写的对数函数:

#include<stdio.h>double MYLOG(double a)
{int N = 15;//我们取了前15+1项来估算int k,nk;double x,xx,y;x = (a-1)/(a+1);xx = x*x;nk = 2*N+1;y = 1.0/nk;for(k=N;k>0;k--){nk = nk - 2;y = 1.0/nk+xx*y;}return 2.0*x*y;}int main()
{double b ;b = MYLOG(2);printf("%.10f",b);getch();return 0;
}

作者:starINsky_mike
来源:CSDN
原文:https://blog.csdn.net/mike190267481/article/details/7404702
版权声明:本文为博主原创文章,转载请附上博文链接!

现在vs上模拟验证了一下,当N大于30的时候,得出来的i精度相差不大,我以为看到了希望,导入服务器,编译,但是问题又来了!!!固件没有空间承载大量计算!!
所以只能自己想办法编写一个简单的对数函数!!!

unsigned short Math(unsigned gain)
{int i = 0,j = 0;while (gain > 3){gain = gain >> 1;i++;}j =  (i +1) + ((3 * (s_nCurGain - (2<<i))) / s_nCurGain);return j;
}

因为以2为底,所以先求出当前增益倍数为2的指数,然后将计算时省掉的低位部分算出来,当作简单的一次函数处理,来弥补之前只算指数的精度,通过vs模拟,精度差距竟然和百度到的差不多!!!哈哈哈哈哈!
第一篇博客,写的有些简单,希望能对大家有所帮助!

用C语言编写简单的求解对数函数相关推荐

  1. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  2. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc

    实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...

  3. c语言案例朗读工具源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  4. 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。

    展开全部 C语言编写一程序求解32313133353236313431303231363533e78988e69d8331333365643661一元二次方程的根: #include #include ...

  5. 心碎的图案怎么用c语言编出来,教案实验2用c语言编写简单程序.doc

    教案实验2用c语言编写简单程序 实验2 用C语言编写简单程序 2.1 基本数据处理1.调试示例 改正下列程序中的错误,求华氏温度100oF对应的摄氏温度?计算公式如下,其中:c 表示摄氏温度,f 表示 ...

  6. 用C语言编写简单的通讯录(大一课程作业)

    用C语言编写简单的通讯录(大一课程作业) 该系统概述: 因本人只学习了C语言的基础部分,所以编写该系统时只使用了一个C文件.存储通讯录信息以txt文件方式保存. 系统设计: 显示主菜单主函数:int ...

  7. c语言怎么自定义关机时间,C语言编写简单的定时关机程序

    搜索热词 写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机. 这里主要考察system()命令. 代码实现: #include #include #include int mai ...

  8. C语言编写简单实现淘宝购物功能 答辩课题实用

    C语言编写简单实现淘宝购物功能,并能够实现 登陆账号验证 添加购物车 l付密码 错误上限 支付成功 等.. #include <stdio.h> #include <string.h ...

  9. ubuntu系统中用c语言编写简单程序

    目录 (一):修改参数提高下载速度 (二):c语言入门编写helloworld (三):在ubuntu系统下编写简单程序 (四):在windows系统下编写简单程序 (五):在ubuntu系统下使用m ...

最新文章

  1. java--IO流(详)
  2. 反汇编教程及汇编命令详解(一)
  3. VMware下Windows2003R2虚拟机磁盘扩容方法
  4. 【干货合辑】+你有什么独家数据库优化技巧?
  5. Matlab Robotic Toolbox V9.10工具箱(四):常用函数
  6. 易经读书笔记11地天泰
  7. 欢乐纪中某A组赛【2019.7.11】
  8. 筛法求素数c 语言,位筛法求素数,有段代码看不懂,有大佬可以来说一下
  9. python爬取网上租房信息_Python爬虫入门 | 5 爬取小猪短租租房信息
  10. 著名程序员刘涛涛WinMount程序BUG
  11. Spring Boot 学习之,数据库一 Spring-Data-Jpa 初探
  12. ocs 2007 r2 服务体验
  13. 堆——神奇的优先队列(上)
  14. 无法创建 ActiveX 组件(转载)
  15. Easyrecovery12.0.0.2 官方版下载
  16. 蓝桥杯——鲁卡斯队列
  17. Android中播放音乐的几种方式
  18. 在线pdf转epub网站
  19. SpringBoot的幕后推手,五年Java开发者小米、阿里面经
  20. 电子邮件协议---SMTP,POP3,IMAP,MIME

热门文章

  1. 【excel】根据两个表中指定列合并两个表中相同的内容。
  2. excel横向纵向求和结果(均保留两位小数)相差1分的问题
  3. php updatexml,php操作XML增删查改
  4. inflater.inflate的理解
  5. vivo新系统originos和鸿蒙,再见Funtouch OS vivo全新系统OriginOS
  6. css实现文字/图标旋转90度/水平翻转/垂直翻转
  7. 01迷宫:有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
  8. nodejs入门--commonjs规范
  9. 庆祝自己的博客开张~~
  10. NOI2013快餐店【图上找环+线段树】