先上视频,花了我一个多小时写的算法,主要是好久没碰这个程序了要重新熟悉,代码其实只增加了一二十行。由于本版讨论示波器多点就传到本版了,实际上使用的MCU是STM32F407
大概13年的时候开始利用业余时间来DIY虚拟示波器,采用STM32+FPGA+蓝牙/WFI+安卓(这是个玩具架构,非常不适合做示波器),当时安卓和STM32驱动WIFI方面的资料还比较少加上是用业余时间所以搞了一年多才算搞完。第一版噪声很大,小信号根本就被噪声淹没了。后面修修补补三个版本后就没搞了,因为对这东西没多大兴趣了,更没多大商业价值。近两三年只对高精度采样感兴趣,就像之前改模拟电源为数控电源主要也是为验证STM32F4的内置AD能达到个什么程度。 突然心血来潮验证这个数字荧光算法主要是因为站长最近在搞这个三代示波器沟起了我沉睡已久的兴趣,想验证一下这个算法到底是怎么样个效果,也想抛砖引玉引出更适合这个算法的平台来验证优化下。首先我是在安卓端实现数字荧光,并不能增加捕获率,代码也非常简单就一二十行的代码。主要是运算量和内存占用大。加上我是用的12位的ADC且是用的12位的数字荧光算法所以内存和运算量更大,每帧数据最大有8K,不同时基不同存储量。下面上算法源码,因为是从中间截取代码很乱,其实算法非常非常简单,但效果着实不错。 //tmp2每帧或每屏数据长度 //tmp3是波形数据12位需2字节合并 // DSOYingguangBuf[][]2维数组存储数字荧光波形数据,根据波形数据打点,视频中效果是纯打点不带插补的效果。至于颜色深浅采用透明度来控制这部分没参考价值就没传上来了。 for (int i = 0,j=0; i < (tmp2); i++) {
tmp3=((rUdpBuffer1[6+(i<<1)]&0xff)|((rUdpBuffer1[7+(i<<1)]&0xff)<<8));
for (j=0;j<4096;j++)//ADC为12位
{
if(tmp3==j)
{
if((DSOYingguangBuf[(tmp1)+40+i][j]+DSOYingguangAdd)<=(short)255)
{
DSOYingguangBuf[(tmp1)+40+i][j]+=DSOYingguangAdd;
}else {
DSOYingguangBuf[(tmp1)+40+i][j]=255;
}
}else {
if(DSOYingguangBuf[(tmp1)+40+i][j]>=DSOYingguangSub)
{
DSOYingguangBuf[(tmp1)+40+i][j]-=DSOYingguangSub;
}else {
DSOYingguangBuf[(tmp1)+40+i][j]=0;
}
}
}
}上传算法论文
基于SoC FPGA的数字荧光算法实现.pdf
(620.75 KB, 下载次数: 26)
|