前两天实验课完成一个自己比较满意的项目,给大家分享一下,主要是思路方面。
基本要求: (1)信号源为方波,频率为400Hz (2)利用 timer,实现ADC采样,采样频率为8kHz (3)PC机通过UART控制DSP,命令如下: “0”:对采集到的波形不滤波,输出原始波形 “1”:对采集到的波形进行带通滤波,提取1次谐波 “2”:对采集到的波形进行带通滤波,提取3次谐波 (4)滤波采用33阶FIR滤波器(系数自行用 matlab设计),要求在采样间隔内完成新样本采集、滤波处理、保存(及输出) (5)采用对内存画图方式对比原始输入和输出结果,采集总样本数为10000。 图1 系统框图 发挥之处: (2)信号的实时滤波处理利用DSPLIB库函数; (3)处理结果利用DAC实时输出至示波器上; (4)对定时器和ADC的控制 (5)利用DMA完成ADC样本采集存 分析:实验需要完成数据采集、存储和滤波功能,采用定时器计时,中断服务程序中触发ADC进行信号采集,并将采集到的信号经由DMA存入指定存储区域。然后根据串口接收的命令控制滤波算法提取方波中的奇次谐波,然后由DAC输出至示波器。因而主要由信号采集模块、DMA数据存储模块、串口通信模块、信号滤波模块、DAC模拟信号输出模块组成。 数据格式选取:由于最终信号处理成果经由DAC输出, 开发板搭载了12bit单极性DAC7617,因而我们最终数据类型应为12bit无符号型,为了避免信号各级处理强制转换带来的误差,我们统一定义数据类型为unsigned int。 1、串口通信模块 图2 串口控制DSP信号处理算法 在DSP收到PC发送的控制命令字后,进入中断服务程序中,判断接收到的字符型变量,分别置命令控制标志cmd为0、1、2,在进入主程序中就判断采用哪一种方法进行处理。 2、信号滤波模块 滤波器采用MATLAB的Filter Designer & Analysis Tool(fdatool)工具设计FIR滤波器。设计参数:带通滤波器,阶数33阶,hanming窗,采样频率8kHz,一次谐波提取滤波器通带300~500Hz,三次谐波提取滤波器通带1100~1300Hz。设计图见下图。
(a) 一次谐波提取滤波器 (b) 一次谐波提取滤波器 图3 fdatool设计FIR滤波器
图4 MATLAB仿真方波信号及频域波形 图6 MATLAB仿真三次谐波提取时域及频域波形
此外,MATLAB中还提供了C代码生成功能,直接将设计的滤波器参数导出为h文件。
图7 MATLAB生成滤波器参数h文件
3、实时实现
为了保证算法的实时性,也即需要在ADC采样时间间隔内完成数据存储、卷积、DAC输出,系统主频为456MHz,采样间隔为8kHz,因而可用的时钟周期为57000个。 1、数据在内存中的流动 图8 数据在内存中的流动 如图8所示为ADC采样数据在内存中的流动图,首先,在初始化过程中,向存储区1写入32个“0”,第一个ADC采样周期完成,DMA将数据存入内存1中的第33个地址处;接着第二个ADC采样周期完成,DMA将数据存入内存1中的第34个地址处,同时,DSP开始对第0~33个数据做卷积运算,结果存入存储区2中的第0个地址,再配置DAC输出此数据;接着第三个采样周期,DMA将数据存入内存1中的第35个地址处,时,DSP开始对第1~34个数据做卷积运算,结果存入存储区2中的第1个地址,再配置DAC输出此数据,按照如此顺序可以实现实时信号处理,输出模拟信号。
至于采用何种方法处理数据,如前所述,根据UART接收的命令控制字,置标志位为指定值,在算法循环开始就确定数据处理方法。 4、算法实现结果 输入信号为400Hz方波,幅度为±1V,偏置500mV。如图9所示。 图9 信号源设置 1、不进行滤波处理,直接输出处理结果。 图10 采样原始方波信号及存储方波信号 图11 频域作图属性配置(CCS3.3) 图12 方波信号频域图 图13 DAC输出采样信号 2、滤波处理,提取一次谐波,结果如下图所示。 图14 采样原始方波信号及一次谐波信号时域图 图15 一次谐波信号频域图 图16 DAC输出一次谐波信号 图17 采样原始方波信号及三次谐波信号时域图 图18 三次谐波信号频域图 图19 DAC输出三次谐波信号 图20 DAC输出三次谐波信号 总结:本次实验较好地完成了实验要求的基本部分和发挥部分,算法实时性好。如图12所示,频域图上方波能够看到多个奇次谐波的分量,方波、一次谐波在CCS作图、示波器上显示波形均较好,三次谐波卷积完成后在CCS中由于存在正偏置,导致动态范围小,我们在DAC输出信号之前适当减去一个直流分量,再乘以一个系数,放大输出信号的动态范围,波形有一定改善,但是由于信号频率提高,示波器采样率不够,导致波形不够连续(如图20所示)。
|