打印

adc 按钮的简单和复杂问题----最大信息熵法

[复制链接]
2592|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 smartmcu 于 2013-3-22 22:16 编辑

    偶尔翻到一个贴 https://bbs.21ic.com/icview-43053-1-1.html 灰常热闹!

    在下从另外一个角度,把这个问题转换成:如何在adc受到强干扰时,有最低的识别错误率。那么可以把问题转换成最大信息熵的问题,即,使各电压分段能够最大地容忍干扰。
(只是在下偶然的一个想法,时间仓促,难说会有根本错误,奢望指正,谢谢啦)

代码如下:

/*用最大信息熵求最优AD 按钮         by smartmcu@gmail.com*/
#include <math.h>
void main()
{
long double max_ent,ent;
long double r1,r2, best_r1, best_r2;
long double v1,v2,v3;
long double p0,p1,p2,p3,p4;

max_ent=0;
for (r1=0.001;r1<10000;) //从1欧姆到10兆
  {
  for (r2=0.001;r2<=r1;)  //从1欧姆到r1,r2应该小于r1
   {
   v1=1/(r1+1);
   v2=1/(r2+1);
   v3=1/(1/(1/r1+1/r2)+1);
   p0=v1/2;                  //此是0到V1/2之间的占比,状态0
   p1=v1/2+(v2-v1)/2;        //此是V1/2到(V2-V1)/2 之间的占比,状态1
   p2=(v2-v1)/2+(v3-v2)/2;   //此是(V2-V1)/2到(v3-v2)/2 之间的占比,状态2
   //p3=(v3-v2);
   p3=1-p0-p1-p2;            //剩下的算状态3
   p4=1;
   //p4=1-p0-p1-p2-p3;
   ent=-(p0*log(p0)+p1*log(p1)+p2*log(p2)+p3*log(p3)+p4*log(p4)); //各段所占比例可以看作概率,以此求出信息熵
   if (max_ent<=ent)
    {
     max_ent=ent;
     best_r1=r1;
     best_r2=r2;
     printf("The best Ent=%f R1=%f R2=%f\n", max_ent, best_r1, best_r2);
     printf("V1=%f V2=%f V3=%f\n", v1,v2,v3);
     printf("p0=%f p1=%f p2=%f p3=%f\n\n", p0,p1,p2,p3);
    }
    r2+=r2*0.005; //按0.5%的比率递增电阻值,应该算得快一些
   }
   r1+=r1*0.005; //按0.5%的比率递增电阻值,应该算得快一些
  }
}

/*
+-----1         |
+                  |
+                  |
+                  |
+------V3     +p3
+                 |
+--------------
+                |
+------V2     +p2
+                |
+--------------
+                |
+------V1     + p1
+                |
+--------------
+                |
+             +p0
+                |
+------0      |

下个小巧的watcom c编译一下,运行结果如下:
p3=1-p0-p1-p2 的结果
The best Ent=1.349672 R1=1.574371 R2=0.411563
V1=0.388444 V2=0.708434 V3=0.753994
p0=0.194222 p1=0.354217 p2=0.182775 p3=0.268786
这个结果应该是最优值,在adc受干扰严重时,应该识别错误率最低

p3=(v3-v2); p4=1-p0-p1-p2-p3; 的结果
The best Ent=1.547272 R1=1.127148 R2=0.995015
V1=0.470113 V2=0.501249 V3=0.654243
p0=0.235056 p1=0.250625 p2=0.092065 p3=0.152994
此结果有点离谱,有点疑惑
*/

/*
转述 ljm810010 原帖内容如下:
单片机AD口检测按键S1,S2,要求 单独按下S1/单独按下S2/两者都同按下,三种情况下OUT端得出的电压 两两间的差距最大,那么R1,R2要多大才能达到要求?
很简单的电路,计算却很难,我就不会算了,求教高手们出招,不在乎结果,只在乎过程。


转述完毕。*/
沙发
smartmcu|  楼主 | 2013-3-22 22:31 | 只看该作者
本帖最后由 smartmcu 于 2013-3-22 22:34 编辑

结果 R1=1.574371 R2=0.411563,
非常接近1+0.618和1-0.618,很黄金!!!

蚁力神的直觉确实厉害,一看就想到了黄金分割,牛!

https://bbs.21ic.com/forum.php?mo ... e=5&authorid=525576

使用特权

评论回复
板凳
tsj1992| | 2013-4-30 13:33 | 只看该作者
本帖最后由 tsj1992 于 2015-10-15 16:53 编辑

不明觉厉

使用特权

评论回复
地板
smartmcu|  楼主 | 2013-5-1 11:24 | 只看该作者
tsj1992 发表于 2013-4-30 13:33
我的直觉跟你讲讲,假设R1>R2,那么闭合S1的时候U1应该要最小,同时闭合S1、S2的U3要最大,那么闭合S2时的U2 ...

很有意义的思路!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

199

帖子

2

粉丝