【二代示波器教程】第10章 示波器设计—数字信号处理

最新更新时间:2022-05-13来源: eefocus关键字:数字信号处理 手机看文章 扫描二维码
随时随地手机看文章

第10章      示波器设计—数字信号处理

本章节为大家讲解二代示波器中用到的FFT和FIR。单纯从应用上来说,比较省事,调用API函数即可,从学习的角度来说,需要大家花点精力。


10.1      FFT快速傅里叶变变换


10.2      FIR有限冲击响应滤波器


10.3      总结


10.1  FFT快速傅里叶变换

二代示波器中做了2048点的浮点FFT。具体实现是采用ARM的DSP库函数arm_rfft_fast_f32。


/*

 

*********************************************************************************************************

 

*    函 数名: DSO1_WaveProcess

 

*    功能说明: 波形通道1的FFT,FIR,最大值,最小值,平均值,峰峰值,频率和RMS的计算

 

*    形    参:无。

 

*    返 回值: 无

 

*********************************************************************************************************

 

*/

 

void DSO1_WaveProcess(void)

 

{

 

     uint16_t  i;

 

     uint32_t  uiCycle, uiCount = 0;

 

 

 

     /* 省略其它 */

 

    

 

     /* 自动触发模式才计算FFT */

 

     if(TriggerFlag== 0)

 

     {

 

         /* 前10种采样率计算FFT */

 

         if(TimeBaseId< 10)

 

         {

 

              /* 执行2048点浮点FFT运算 */

 

              for(i=0;i<2048; i++)

 

              {

 

                   testInput_fft_2048[i]= g_DSO1->usWaveBufTemp[i];

 

              }

 

             

 

              /* 2048点实序列快速FFT,浮点 */

 

              arm_rfft_fast_f32(&S,testInput_fft_2048, testOutput_fft_2048, ifftFlag);

 

             

 

              /* 求1204点的幅值 */

 

              arm_cmplx_mag_f32(testOutput_fft_2048,testInput_fft_2048, 1024);

 

             

 

              /* 获得最大的幅值和所在的位置 */

 

              uiCycle= testInput_fft_2048[1];

 

             

 

              for(i= 2; i < 1024; i++)

 

              {

 

                   if(uiCycle< testInput_fft_2048[i])

 

                   {

 

                       uiCycle=testInput_fft_2048[i];

 

                       uiCount= i;

 

                   }

 

              }

 

             

 

              /* 估算频率 */

 

              g_DSO1->uiFreq= uiCount * g_SampleFreqTable[TimeBaseId][0] / 2048;

 

         }

 

         /* 省略其它 */

 

     }

 

    /* 省略其它 */

 

}


上面的代码中对采集的2048点数据做浮点FFT处理,并求出幅频响应,方便示波器上频谱的展示。同时代码中也做了一个简单的波形频率估计,这个估计仅适合周期性的正弦波,方波。


(1)对于正弦波而言,它经过FFT后,理想的幅频响应就是一根线,所以根据这个特性,只要找出幅频响应中幅值最大的值即可,它所对应的频率位置就是波形的频率。


(2)对于方波而言,它经过FFT后,理想的幅频响应就跟手机信号一样(中间有间隔),方波是由无限多个正弦波叠加而成的,其中第一个幅值最高的就是基波,也是方波的频率。


当前提供的方法仅适合估算,要提高精度的话需要对更多的点做FFT,或者采样率正好是波形频率的整数倍,这样可以有效降低频谱泄露,准确率较高。当然,这种方法的操作难度有点大,因为我们不知道波形频率是多少,求得就是波形频率。


关于FFT的计算,大家可以直接看我们的DSP教程,有详细讲解,务必优先看第25章,对FFT变换结果的物理意义有个认识,然后再看其它章节:http://forum.armfly.com/forum.php?mod=viewthread&tid=3886。


10.2  FIR有限冲击响应滤波器

二代示波器的FIR滤波控制界面如下:

做了一个80阶低通FIR滤波器,分别可以在2Msps采样率,200Ksps采样率和20Ksps采样率下工作。每个采样率下做了7种截止频率。


FIR滤波在信号处理任务里面被调用:


/*

 

*********************************************************************************************************

 

*    函 数名: DSO1_WaveProcess

 

*    功能说明: 波形通道1的FFT,FIR,最大值,最小值,平均值,峰峰值,频率和RMS的计算

 

*    形    参:无。

 

*    返 回值: 无

 

*********************************************************************************************************

 

*/

 

void DSO1_WaveProcess(void)

 

{

 

     uint16_t  i;

 

     uint32_t  uiCycle, uiCount = 0;

 

 

 

    

 

     /* 省略其它 */

 

 

 

     /*自动触发模式才计算FFT */

 

     if(TriggerFlag== 0)

 

     {

 

/* 省略其它 */

 

 

 

         /* 前10种采样率计算FFT */

 

         if(TimeBaseId< 10)

 

         {

 

              /* 执行650点,80阶Fir滤波器 */

 

              /*单通道2Msps */

 

              if((TimeBaseId== 1)&&(g_DSO1->ucFirFlter_Step100KHz !=0 ))

 

              {

 

                   DSO_FirFilter_Step100KHz();

 

              }

 

                  

 

              /* 单通道200Ksps */

 

              if((TimeBaseId== 4)&&(g_DSO1->ucFirFlter_Step10KHz !=0 ))

 

              {

 

                   DSO_FirFilter_Step10KHz();

 

              }

 

                  

 

              /* 单通道20Ksps */

 

              if((TimeBaseId== 7)&&(g_DSO1->ucFirFlter_Step1KHz !=0 ))

 

              {

 

                   DSO_FirFilter_Step1KHz();

 

              }

 

         }

 

     }

 

     /* 省略其它 */

 

}

根据不同的采样率,分别做了个处理,我们这里以函数DSO_FirFilter_Step100KHz()为例进行说明。这个函数的实现如下:


#define FIR_LENGTH_SAMPLES   650   /* 采样点数 */

 

#define BLOCK_SIZE           650   /* 调用一次arm_fir_f32处理的采样点个数 */

 

#define NUM_TAPS             81     /* 滤波器系数个数*/

 

#define FIR_StateBufSize     BLOCK_SIZE + NUM_TAPS - 1

 

 

 

/*

 

*********************************************************************************************************

 

*                                     滤波器系数

 

*********************************************************************************************************

 

*/

 

/* 80阶FIR低通滤波器系数通过fadtool获取系数 Fs = 2Msps, Fc = 100KHz*/

 

const float32_t firCoeffs32LP_100KHz[NUM_TAPS] = {

 

 -3.126438727e-19f,-0.0002058673272f,-0.0004228431499f,-0.0006468905485f,-0.0008642434841f,

 

 -0.001048665727f,-0.001161655295f,-0.001156177954f,-0.0009838859551f,-0.0006050768425f,

 

 8.391786605e-19f,0.0008203662583f, 0.00180617522f, 0.002865221584f, 0.003865677863f,

 

  0.004645895679f, 0.005031134468f, 0.004856021609f,  0.00399050815f, 0.002366269007f,

 

 -2.110346192e-18f,-0.002989985514f,-0.006377025973f,-0.009831513278f,-0.01293939352f,

 

   -0.0152332196f, -0.01623356342f, -0.01549717132f, -0.01266706176f,   -0.007519159f,

 

 3.381513724e-18f, 0.009749332443f,  0.0213866625f, 0.03438147902f,  0.04804687202f,

 

   0.06158847734f, 0.07416618615f, 0.08496309072f, 0.09325480461f,  0.09847255051f,

 

    0.1002533659f, 0.09847255051f, 0.09325480461f, 0.08496309072f,  0.07416618615f,

 

    0.06158847734f,  0.04804687202f,  0.03438147902f,   0.0213866625f, 0.009749332443f,

 

 3.381513724e-18f,   -0.007519159f,-0.01266706176f, -0.01549717132f, -0.01623356342f,

 

   -0.0152332196f,-0.01293939352f,-0.009831513278f,-0.006377025973f,-0.002989985514f,

 

 -2.110346192e-18f, 0.002366269007f, 0.00399050815f, 0.004856021609f, 0.005031134468f,

 

  0.004645895679f, 0.003865677863f, 0.002865221584f,  0.00180617522f,0.0008203662583f,

 

 8.391786605e-19f,-0.0006050768425f,-0.0009838859551f,-0.001156177954f,-0.001161655295f,

 

 -0.001048665727f,-0.0008642434841f,-0.0006468905485f,-0.0004228431499f,-0.0002058673272f,

 

 -3.126438727e-19f

 

};

 

 

 

/* 其它截止频率对应的系数未贴出 */

 

 

 

/*

 

*********************************************************************************************************

 

*    函 数名: DSO_FirFilter_Step100KHz

 

*    功能说明: FIR滤波器。

 

*    形    参:无          

 

*    返 回值: 无

 

*********************************************************************************************************

 

*/

 

void DSO_FirFilter_Step100KHz(void)

 

{

 

     arm_fir_instance_f32S;

 

     uint16_ti;

 

    

 

     /* 获取要滤波的数值 */

 

     for(i =0; i < BLOCK_SIZE; i++)

 

     {

 

         FirDataInput[i]=g_DSO1->usWaveBufTemp[i+g_DSO1->sCurTriPos+g_DSO1->sCurTriStep];

[1] [2]
关键字:数字信号处理 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/Test_and_measurement/ic571959.html

上一篇:【二代示波器教程】第16章 附件A---电阻屏触摸校准
下一篇:最后一页

推荐阅读

二代示波器教程】第16章 附件A---电阻屏触摸校准
第16章 附件A---电阻屏触摸校准二代示波器的触摸校准比较简单,随时随地都可以做触摸校准,按下K1按键即可校准。有时候我们做触摸校准界面,需要在特定的界面才可以进入触摸校准状态,非常繁琐,这里采用的方法就非常省事了,也推荐大家在项目中使用。不管当前示波器打开的是哪个界面,都可以按下K1按键做触摸校准,实现方法如下:hTouchWin = WM_CreateWindowAsChild(0, 0, 800, 480, WM_HBKWIN, WM
发表于 2022-05-13
【<font color='red'>二代</font><font color='red'>示波器</font>教程】第16章 附件A---电阻屏触摸校准
【二代示波器教程】第11章 示波器设计—功能模块划分
11.1 主界面上的五个按钮为了方便各个功能的配置,主界面右侧做了五个按钮,用于实现五个不同功能的配置。代码如下:/* 创建需要的按钮*************************************************************/hButton0 = BUTTON_Create(670, 40, 100, 44,GUI_ID_BUTTON0, WM_CF_SHOW);BUTTON_SetText(hButton0, "Measure");WM_SetHasTrans(hButton0);WM_SetCallback(hButton0, _cbButton);hButton1 = BUT
发表于 2022-03-31
【二代<font color='red'>示波器</font>教程】第11章 <font color='red'>示波器</font><font color='red'>设计</font>—功能模块划分
二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
15.1 注意事项(重要必读)1、学习本章节前,务必保证已经学习完毕前面章节。另外,工程代码注释已经比较详细,了解了框架后,直接看源码即可。2、仅支持800*480分辨率显示屏,如果是电容屏,无需校准。如果是电阻屏,需要校准,按下按键K1即可进入校准界面。3、由于按键不够用,K1按键的消息处理做了三个条件编译,详情见本章15.6小节。默认K1按键执行触摸校准,也可以选择执行截图或者串口打印任务执行情况。另外,不管当前处于任何界面都可以进行触摸校准,仅电阻屏需要校准,电容屏无需校准。4、STemWin5.40版本的截图功能有bug,详情看此贴:http://forum.armfly.com/forum.php?mod=viewthre
发表于 2022-03-31
【<font color='red'>二代</font><font color='red'>示波器</font>教程】第15章 FreeRTOS操作系统版本<font color='red'>二代</font><font color='red'>示波器</font>实现
二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
14.1 注意事项(重要必读)1、学习本章节前,务必保证已经学习完毕前面章节。另外,工程代码注释已经比较详细,了解了框架后,直接看源码即可。2、仅支持800*480分辨率显示屏,如果是电容屏,无需校准。如果是电阻屏,需要校准,按下按键K1即可进入校准界面。3、由于按键不够用,K1按键的消息处理做了三个条件编译,详情见本章14.6小节。默认K1按键执行触摸校准,也可以选择执行截图或者串口打印任务执行情况。另外,不管当前处于任何界面都可以进行触摸校准,仅电阻屏需要校准,电容屏无需校准。4、STemWin5.40版本的截图功能有bug,详情看此贴:http://forum.armfly.com/forum.php?mod=viewthre
发表于 2022-03-31
【<font color='red'>二代</font><font color='red'>示波器</font>教程】第14章 uCOS-III操作系统版本<font color='red'>二代</font><font color='red'>示波器</font>实现
二代示波器教程】第18章 附件C---波形拟合
emWin5.44中新增的样条函数Spline可以实现波形拟合,即波形插补。不过当前可用于芯片的emWin库还没有升级到5.44,等升级到5.44后,大家可以做研究。下面知识点来自百度百科:在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义。样条的英语单词spline来源于可变形的样条工具,那是一种在造船和工程制图时用来画出光滑形状的工具。在中国大陆,早期曾经被称做“齿函数”。后来因为工程学术语中“放样”一词而得名。在插值问题中,样条插值通常比多项式插值好用。用低阶的样条插值能产生和高阶的多项式插值类似的效果,并且可以避免被称为龙格现象的数值不稳定的出现。并且低阶的样条插值还具有“保凸”的重要性质。在计算机科学的计算机辅助
发表于 2022-03-31
【<font color='red'>二代</font><font color='red'>示波器</font>教程】第18章 附件C---波形拟合
基于虚拟仪器技术实现网络虚拟示波器系统的设计
随着计算机软硬件技术不断发展与提高,虚拟仪器技术已成为当前测控领域内的关键性技术。在远程测控与仿真方面,虚拟仪器网络化,已成为急待解决的问题。通过利用SBS实时光网、虚拟仪器技术、ActiveX技术以及DCOM技术,实现了网络化虚拟示波器,从而使远程测控、数据共享成为了现实。网络虚拟示波器系统设计网络虚拟示波器系统总体上可分为两部分:数据采集网络、虚拟示波器。数据采集网络负责远程数据信息的采集和远程控制指令传送。虚拟示波器则通过数据网络将所获取的远程数据信息动态显示、存储。网络虚拟示波器系统总体结构框架如图1所示。图1 网络虚拟示波器系统结构由图可知,数据采集网络由远程信息数据源、数据源控制中心两部分组成。其中,远程信息数据源,通过
发表于 2022-04-20
基于虚拟仪器技术实现网络虚拟<font color='red'>示波器</font>系统的<font color='red'>设计</font>
小广播
换一换 更多 相关热搜器件

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 信号源与示波器 分析仪 通信与网络 视频测试 虚拟仪器 高速串行测试 嵌入式系统 视频教程 其他技术 综合资讯

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved