原创 示波器制作系列1:正弦插值算法

2009-5-13 01:20 6893 11 12 分类: 消费电子

?搞了半天,虽然学过 信号处理!

?先是一片茫然,然后开始看书,想写代码,发现自己还是不懂。做一下MATLAB的仿真,先分析一下matlab的代码 再去写C的。。。。
?代码:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%抽样
Ts = 0.04;
Fs = 1/Ts;
n = 1:1:60;
nTs = n*Ts;
x = sin(pi*10 * nTs);
subplot(2,2,1);
stem(nTs,x);
title('原始信号');
%%%%%%%%%%%%%%%%%%%%%%%
%重构
dt = 0.004;
t  = 0 :dt :0.1;
dn = length(t);
xa = ones(1,dn);
for i = 1:dn
    i
    s = sinc( i / 4  -  n )
    xa(i) = x * s';
end
subplot(2,2,2);
stem(t,xa);下图是仿真的结果,只要给便dt 就可以了
点击看大图

对你或许有用的资料;
DMF5001液晶显示器与波形显示技术https://static.assets-stash.eet-china.com/album/old-resources/2009/5/12/7c0953cf-5660-4d9b-8262-1c6aefc15463.rar

微型液晶显示数字存储示波器.pdfpdf


原理:rar



5-8号晚 补充:
我用单片机 C8051F020 24M的晶振在一块 640 *480 的液晶上显示采样回来的波形,采样时钟25M(用的FPGA),但是如果我用正弦插值,就像刚才使用Matlab的那种方法来实现,刷新一屏波形的时间间隔很长,也就是说算法的速度太慢了,尤其是在这种速度比较慢、内部存储空间比较小的设备上算法的优化显得格外的重要,我现在还没有找到合适的方法去减少算法的速度,希望有大侠可以帮俺一下啊 谢了
代码如下:
/*
pbuf    数据缓冲空间
buf_num 数据缓冲的大小     缓冲空间的大小 最好是WAVE_LEN的除数 按照正弦插值的理论算法,每个周期2.5采样点就可以重构一个正弦波形
color    线条的颜色
AD_CLK  AD采集时钟频率

///////////
数据点不能少于    SINP_LEN 个
*/
void GUI_Wave_SinP(uint8 *pbuf,uint16 buf_num,uint16 color)
{
    uint16  i = 0 ;     
    uint16  j = 0 ;
    float   sum      = 0;
    float   temp  = 0;
    uint8 data_buf[WAVE_LEN] = {0};           //存放插值以后的数据
    float sa_buf  [SINP_LEN] = {0};        // 正弦内插函数求得的系数

    uint16 interval = WAVE_LEN / buf_num ;
   
    for(i = 1 ; i < WAVE_LEN ; i++)      
    {
        temp = 0 ;      
        sum  = 0 ;        //不能少了啊
        for(j = 0 ; j < SINP_LEN ; j++) //计算内插系数
        {
         // sa_buf[j] =   sin(PI * ADC_CLK * (1/ ( ADC_CLK * interval) * i - j)       //原始计算式
            temp =     (float) ( PI *  ( (float) i / (float)interval - (float)j )) ;
            if (temp == 0)
                sa_buf[j] = 1.0000;
            else
                   sa_buf[j] =(float)((float) sin(temp) / (float)temp  );                                    //简化后的式子
        }

        //计算插值以后每个点的数据

    /*    if( i <= SINP_LEN )                    //如果计算的点小于SINP_LEN的一半,采用数据缓冲区的前60个点计算
        {
            for(j = 0 ; j < SINP_LEN ; j++)
                  sum +=  (float)sa_buf[j] * (float)(*(pbuf + j)) ;
        }
        else if( i >=  buf_num - SINP_LEN )   //如果计算的点大于buf_num - SINP_LEN / 2,采用数据缓冲区的后60个点计算
        {
            for(j = 0 ; j < SINP_LEN ; j++)
                  sum +=  (float)sa_buf[j] * (float)(*(pbuf + buf_num - SINP_LEN + j)) ;
        }
        else
        {
               for(j = 0 ; j < SINP_LEN ; j++)    //其余情况采用以这个点为中心的  SINP_LEN个点
                 sum +=  (float)sa_buf[j] * (float)(*(pbuf + i + j - (uint8)(SINP_LEN / 2) )) ;
        }   
          */
       for(j = 0 ; j < SINP_LEN ; j++)
               sum +=  (float)sa_buf[j] * (float)(*(pbuf + j)) ;
        data_buf  =   (uint8) sum ;
       }
   
    GUI_Wave(data_buf,color);
 
}               



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1668196 2013-8-21 16:59

参考一下~~谢谢啊
相关推荐阅读
zhangshaobing517_935512703 2011-03-21 01:28
KC24RT-300调试笔记
项目中需要使用LED驱动器,主要是为了让一串LED发出的光照一致,所以在试验中采用LED串联的方式比较好点,LED并联容易导致LED发光的 不均匀以及寿命减少。我在项目中采用金升阳公司的KC24RT-...
zhangshaobing517_935512703 2010-11-19 14:53
线程中CreateEvent和SetEvent及WaitForSingleObj
首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面.CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象.EVENT有两种状态:发信...
zhangshaobing517_935512703 2010-11-15 13:29
VS2008 BEGIN
Visual Studio 2008环境与VC6.0的环境存在着比较大的区别,下面就一些小小的区别在这里做一些探讨,欢迎指教!1、如果是调试控制台程序,很多时候点击“启动调试”后是一闪而过,此时可有两...
zhangshaobing517_935512703 2010-11-01 20:38
使用MFC的数组类
 MFC的数组类支持的数组类似于C++中的常规数组,可以存放任何数据类型。C++的常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,而MFC数组类创建的对象可以根据需要动态地增大或减小,数组的...
zhangshaobing517_935512703 2010-09-07 13:14
循环
 循环设计的注意的事情:(1)双重循环的跳出问题,break只挑出所在的循环,如果使用双层FOR循环,单个BREAK就不可能跳出所有的双层(2)在迭代的时候,注意起始和终止的条件,尤其是终止问题(3)...
zhangshaobing517_935512703 2010-09-02 01:09
图像处理改进
1.特征点提取的算法  标志点的提取算法对结果的影响虽然没有经过试验或者计算的推算,每1个pix的偏差对结果的影响有多大,但是不可避免的,要想获得高精度的  测量结果,高精度的提取对结果的影响还是很大...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /1 下一条