opnet学习笔记

来源:互联网 发布:windows api有多少 编辑:程序博客网 时间:2024/04/28 04:07

最近一直在研究无线环境下两个节点的单工通信,和有线通信一样还是数字喷泉码,我就是想在发端生成一定数量的数据包,然后经过删除信道后在收端统计最终收到的包数,并将接收到的包的数据读出后解码。看似没什么难度还是浪费了我一周多的时间,我感觉自己主要卡在以下三个地方:

问题1:如何确定收端数据包已经接收完毕?

这是非常必要的,不然没法计算最终收到的包数。

我最初的想法是在发端设一个全局变量pk_count=10,假设发端一共发10个包,每发一次,pk_count--,这样的话当pk_count减为0时就意味着数据包已经发完,接收端就可以统计最终收到的包数了。但仿真试了一下发现不可行,因为发端发完了并不意味着收端也收完了,毕竟还有一定的传输和处理延时,可能最后的几个包还在收端排队着呢。

此路不通只好再想办法了,一个新的idea就是当且仅当满足pk_count=0 && op_strm_empty(IN_STRM) && 信道空闲的条件时认为数据包已经接收完毕,那么如何判断信道空闲呢?关于这个问题,我之前CSMA中仿真过,就是在收发通信机之间画一条统计线,然后调用op_stat_local_read()读取信道状态。按理说问题到这儿就解决了,可是新的问题又来了:无线怎么画统计线?我在百思论坛搜了一下,也有人问类似的问题,知道在无线环境中也是可以画统计线的,但具体怎么操作说实话没太看懂Orz……我试着在接收节点模型中添加了一个channel_test节点与收信机用统计线相连来读取信达状态,虽然仿真的时候没报错,但是仿真完了发现这个统计线加了和不加没什么区别,还是没法准确判断数据包全部接收完没有~~~~~~~~~

折腾了好久实在没招了,找师兄帮忙吧……师兄的建议是:设置一个定时中断,每隔几秒触发一次自中断后判断是否有数据包到达,有的话取消中断继续执行程序,否则条件转移到下一个状态。顿时茅塞顿开~~~回去试了一下,折腾了我好几天的问题瞬间解决!所以说师兄还是很牛的,多念两年书就是不一样~~~

OPNET学习小记(五)

这就是定时中断的那几行程序~~~

对了,还有一个unsolved problem:在我这个程序里定时的时间常数30的单位是秒还是毫秒?有一点比较诡异的是如果我把定时时间设为2,只读一个数据包就判断接收完毕了,只有设置的大一点儿才能确保所有数据包都接收结束。这是怎么回事儿呢?按理说只要能读出一个数据包说明这个定时间隔就是合理的啊……想不明白,纠结ing……

问题2:如何在接收到一定量(即能保证成功译码的数据包量)的数据包后终止仿真?

这个问题估计大家的第一反应都是采用仿真结束中断的办法吧。但是我没用过仿真结束中断,而且对于我这种菜鸟级别的人来说,每次新接触OPNET里的某个技术、哪怕只是一个函数我都要出很多错,然后费很大功夫去解决。所以为了省事儿,我改用c语言跳出程序的办法来结束仿真。先试的是return,因为按理说只要遇到return整个程序就会跳出,可使用了return后仿真报错,说什么void类型的程序不能有返回值,而且函数输入输出不匹配,我对这种问题最没耐心解决了,直接换break,结果发现break只能跳出一部分程序,当有新的数据包达到时还是会执行仿真的……

啊啊啊~~~~~~没招了,还是用endsim吧,在网上一顿查资料,然后再在自己的进程模型中修改,好像也没那么难……居然一次性仿真通过,问题解决了!

问题3:如何在无线链路中设置删除信道?

这个问题我认为最难解决了,我几乎把14个管道阶段程序都看了一遍,每个阶段具体做什么、实现什么功能也基本了然于心了,可就是不知道怎么修改管道程序。

重新整理一下思路:14个管道阶段与误码有关的主要有6个阶段,分别是:bkgnoise、inoise、snr、ber、error、ecc。先是计算bkgnoise和inoise,这两个阶段计算的结果又是snr计算的基础,snr计算存储好后又在ber阶段读出来计算ber,ber对error阶段错误的分配有影响,而error阶段计算的error_num又决定了该包能否被接收。纵观整个管道阶段模型,可以被修改的管道只有bkgnoise和error两个阶段,其中bkgnoise阶段影响其值大小的无非就那么几个参数:布尔曼常数、环境温度和rx_noisefig,布尔曼常数基本是不怎么改的,环境温度的话管道函数里设为290,想要噪声大点儿的话可以取一个更大的数(个人认为),rx_noisefig是在无线接收机属性里自己设的,rx_noisefig=1.0时噪声最小,逐渐增大其值时噪声逐渐增大。通过适当增大噪声理论上应该是可以产生合适的丢包率的,但我感觉这样太麻烦而且不好设置丢包率,干脆就在error错误分配阶段改了,直接产生一个0到1之间的随机数r,如果r>=0.2,error_num=0,否则error_num=1。这样的话就算设置丢包率为0.2的删除信道了,就是不太规范~~~~

问题解决完了,show一下最终的仿真成果:

OPNET学习小记(五)

1 0
原创粉丝点击