回头想想,参加全国研究生电子设计大赛可能是研究生期间最重要的收获了。从组队,立项到执行,一路遇到不少困难,又一一化解,值得庆幸。遂将所遇问题简单记录。
基本环境
- 硬件环境:FPGA开发板,音频采样芯片,电容触摸屏,摄像头,GPRS模块
- 软件环境:NIOS
- 开发语言:FPGA,C
音频采样
问题
一开始的方案是将采样数据写入SD卡中,当回放时发现严重失真,采样率不足。
分析
分析瓶颈还是在IO上,SD卡的写入速度不及采样速度。
解决
为了解决这个问题,采样时先将数据写在RAM中,相当于开了一个缓冲区。采样结束后,再由RAM写入SD卡。考虑到留言结束后使用者通常也不再需要操作了,这时CPU额外处理一段时间也是可以接受的。
总结
空间换时间。
图像采样
问题
刚完成功能时,搭档跟我说采样结束后,把数据写入SD卡花费了五分钟,这太让人无法接受了。
分析
图像采样的瓶颈同样在IO。一方面是因为有几十万像素的数据量,另一方面搭档的描述是这样的:采样按从左上至右下将像素值写入缓存,缓冲区先入后出,读出时会先读出右下的数据。而要将数据保存成bitmap格式是又必须从左上开始写,这样就不得不翻转数据一次,因此用时加倍了。
对于问题一,有损压缩是可以减少数据量的,减少色彩信息可以压缩,比如RGBA888转为RGB565;丢弃像素点也可以压缩,比如相邻2×2的四个像素只留取其中一个或计算四个点的平均值,这样数据就变为原来四分之一。
对于问题二,没接触过硬件编程的同学可能会想缓冲区也是个数组吧,倒着遍历不就完了吗?其实读缓冲区是读取一个寄存器,取走一个数据才能取下一个,是串行的过程。那么先全都读到内存中,再倒序写入SD卡不就好了吗?这确实是一个办法。
解决
问题一,诚如分析所言,两种方法一起用效果更佳。
问题二,把摄像头倒过来……
总结
想要解决一个问题不要迷失于别人对问题的描述和解决思路,也不要迷失于解决其子问题。后退一步,也许你会找到简单的非技术角度的解决方案。