dsp高速数字处理系统设计总结与实验报告
(2017-2018 学年第 1 学期) 题 目 :_高速数字处理系统设计__ 专业班级 :___电子15-2班_______ 学生姓名 :________ 王 宇_________ 学 号 :__ 1505020223_______ 指导教师 :____宋华军、周卫东_____ 设计成绩 :_________________________
一设计目的通过对基于TMS320VC5416的信号采集处理与控制系统的设计掌握PCB设计软件AD(Altium Designer) 的使用方法,以及卷积、FFT、FIR 滤波器等数字信号处理算法并熟悉 TI 的 DSP 集成开发环境 CCS软件的使用,掌握基于 DSP的系统设计流程。
二系统分析2.1 设计要求①设计一个功能完备,能够独立运行的精简 DSP 硬件系统。绘制出系统的功能框图、使用AD(Altium Designer)绘制出系统的原理图和PCB 版图。 ②利用实验箱的模拟信号产生单元产生不同频率的信号,或者产生两个频率的信号的叠加。在 DSP 中采集信号,并且对信号进行频谱分析,滤波等。通过键盘或者串口命令选择算法的功能,将计算的信号频率或者滤波后信号的频率在LCD 上显示。 主要功能如下: 一、 对外部输入的模拟信号采集到DSP 内存,会用CCS 软件显示采集的数据波形。 二、 对采集的数据进行如下算法分析: (1) 频谱分析:使用fft 算法计算信号的频率。 (2) 对信号进行IIR 滤波或FIR 滤波,并且计算滤波前后信号的频率。 三、 外部键盘或者从计算机来的串口命令选择算法功能,并且将结果在LCD 上显示。 2.2 主要任务①绘制出DSP系统的功能框图、使用AD(Altium Designer)绘制出系统的原理图和PCB 版图。 ②在 DSP 中采集信号,用CCS 软件显示采集的数据波形,以及对采集的数据进行算法分析。 三 硬件设计3.1 硬件总体结构
3.2 DSP 模块设计
3.3 电源模块设计将5V电源电压转换为3.3V和1.6V电源
3.4 时钟模块设计此处由外部晶振提供时钟信号 3.5 存储器模块设计3.6 JTAG模块设计
3.7 TMS320VC5416 最小系统 PCB 版图板上包括了支持TMS320VC5416独立运行的时钟电路、复位电路、Flash模块、JTAG仿真接口电路以及电源模块等。 四软件设计4.1 软件总体流程
4.3 程序运行效果①:采集的数据及其FFT计算结果:
②:51阶滤波器波形: ③:滤波前后信号频谱图: ④:采集数据波形和滤后波形比较:
LCD显示结果: 五课程设计总结 为期两周的课程设计结束了。此次课程设计包含硬件设计以及软件设计两个方面,从PCB板的绘制,到CCS软件的使用,利用软件实现卷积,FFT算法,滤波器等实验。 首先,感谢两位老师:宋老师,周老师的辛勤付出。 在此次课程设计中,在硬件设计部分,首先从硬件整体模块的设计,到PCB板原理图的绘制,再到最后PCB板的绘制,收获颇丰。真正的理解了实际中做一件东西的具体流程,也学会了些许步骤。在拿到一项设计任务时,首先应当了解实际目的,设计要求,从最终的要求出发,一步一步的去完成,同时也要查阅各种资料,找到对应的参照项目,这样会省去很多的时间。而一个典型的硬件设计应当包括复位电路,时钟电路,存储器接口,模数接口,通讯接口。在硬件设计的第一步整体模块的设计中,我们应当确定整体的芯片需求以及外围电路的设计,选择合适的芯片,设计恰当的外围电路已达到设计的最终要求。而在画PCB板原理图时,应当详细的画出各个模块,细节部分不能忽视,包括一个电阻,电容,学会新建元器件库,会画部分器件的封装,打到最后的编译无错误。在最后的绘制PCB板的过程中,首先确定元器件的封装无错误,然后进行元器件的摆放以及链接。而在此过程中,要注意规则的设置,以及层数的设计,到达利用最少的层数去完成所需的硬件。 在软件部分的设计中,从刚开始的熟悉CCS编译环境,到AD采样,再到对采样的数据进行快速傅里叶运算,进行频谱分析,以及后来的对采样的信号进行滤波,设计IIR和FIR滤波器对AD采样的信号进行处理,观察处理后的信号的频谱,掌握利用软件进行卷积运算,FFT运算,FIR滤波器的设计等。在这一部分的设计过程中,发现由于自己的C语言知识不够牢固,对软件部分的实现产生了很大的阻碍,一定的编程能力本来对于电子的学生来说是很重要的,但是在长期的学习中很多人只侧重于理论知识的学习,而忽略的实际的动手能力,我们都是这一群人中的一个,导致了最后的动手能力,编程能力急剧下降。 在这次的课程设计中,由于自己比较喜欢干货,不太喜欢理论知识的学习,所以在动手这一方面,自己是较为感兴趣的,也真正的全身心的投入进去,同时又学到了很多东西,接触之前未曾接触过的知识,不断地提升自己,在实践中成长。同时在此次设计中,发现了自己的许多不足,虽然自己对于动手方面比较感兴趣,但是自己的理论知识的储备不够完善,编程能力较为低下等,这都是对于自身发展的很大的阻碍,希望在今后的学习生活中能够不断地完善自己,充实自己,学习更多的知识,更大程度的增强自己的动手能力。最后,再次感谢两位老师的辛勤付出。 六参考文献【1】 吴镇扬.数字信号处理[J] 2009,(第1期). 【2】 邹理和.数字信号处理.上册.北京:国防工业出版社,1985. 【3】 张雄伟,曹铁勇.DSP芯片的原理与开发应用.第二版.北京:电子工业出版社 2000. 4.2 核心模块及实现代码FFT算法程序: - void kfft(double pr[LEN],double pi[LEN],int n,int k,double fr[LEN],double fi[LEN],int l,int il)
- {
- int it,m,is,i,j,nv,l0;
- double p,q,s,vr,vi,poddr,poddi;
- for (it=0; it<=n-1; it++)
- { m=it; is=0;
- for (i=0; i<=k-1; i++)
- { j=m/2; is=2*is+(m-2*j); m=j;}
- fr[it]=pr[is]; fi[it]=pi[is];
- }
- pr[0]=1.0; pi[0]=0.0;
- p=6.283185306/(1.0*n);
- pr[1]=cos(p); pi[1]=-sin(p);
- if (l!=0) pi[1]=-pi[1];
- for (i=2; i<=n-1; i++)
- { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
- s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
- pr[i]=p-q; pi[i]=s-p-q;
- }
- for (it=0; it<=n-2; it=it+2)
- { vr=fr[it]; vi=fi[it];
- fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
- fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
- }
- m=n/2; nv=2;
- for (l0=k-2; l0>=0; l0--)
- { m=m/2; nv=2*nv;
- for (it=0; it<=(m-1)*nv; it=it+nv)
- for (j=0; j<=(nv/2)-1; j++)
- { p=pr[m*j]*fr[it+j+nv/2];
- q=pi[m*j]*fi[it+j+nv/2];
- s=pr[m*j]+pi[m*j];
- s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
- poddr=p-q; poddi=s-p-q;
- fr[it+j+nv/2]=fr[it+j]-poddr;
- fi[it+j+nv/2]=fi[it+j]-poddi;
- fr[it+j]=fr[it+j]+poddr;
- fi[it+j]=fi[it+j]+poddi;
- }
- }
- if (l!=0)
- for (i=0; i<=n-1; i++)
- { fr[i]=fr[i]/(1.0*n);
- fi[i]=fi[i]/(1.0*n);
- }
- if (il!=0)
- for (i=0; i<=n-1; i++)
- { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
- if (fabs(fr[i])<0.000001*fabs(fi[i]))
- { if ((fi[i]*fr[i])>0) pi[i]=90.0;
- else pi[i]=-90.0;
- }
- else
- pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
- }
- }
复制代码
卷积程序:
- void Convolveok( //卷积函数
- double *x, // 原始输入数据
- double *h, // 冲击响应
- double *y, // 卷积输出结果
- UINT16 Leng, // 序列长度
- UINT16 h_Len)
- {
- UINT16 m,p,j;
- double r,rm;
- double xmean = 0.0;
- double xmid[100];
- for(m=0;m<h_Len;m++)
- {
- xmid[m] = 0.0;
- }
- for (m=0; m<Leng; m++)
- {
- xmean = x[m] + xmean;
- }
- xmean = 1.0*xmean/Length;
-
- for (m=0; m<Leng; m++)
- {
- x[m] = x[m] - xmean;
- }
- for (m=0; m<Leng; m++)
- {
- for (p=0; p<h_Len; p++)
- {
- xmid[h_Len-p-1] = xmid[h_Len-p-2];
- }
- xmid[0] = x[m];
- r = 0.0;
- rm= 0.0;
- for (j=0; j<h_Len; j++)
- {
- r = xmid[j] * h[j];
- rm = rm + r;
- }
- y[m] = rm;
- }
- }
复制代码
频谱函数,求最大值和次大值函数:
- void pinpu(double pr[Length])
- {
- num1=0;
- num2=0;
- v=0;
- for(k=0;k<128;k++)
- {
- value[k]=0;
- number[k]=0;
- }
- for(k=1;k<127;k++)
- {
- if(pr[k]>=pr[k-1]&&pr[k]>=pr[k+1])
- {
- value[v]=pr[k];
- number[v]=k;
- v++;
- }
- }
- max1=value[0];
- max2=value[0];
- for(k=1;k<=127;k++)
- {
- if(value[k]>=max1)
- {
- max2=max1;
- max1=value[k];
- num2=num1;
- num1=number[k];
- }
- else if(value[k]>=max2)
- {
- max2=value[k];
- num2=number[k];
- }
- fk1=250000/256*num1;
- fk2=250000/256*num2;
- if(fk1>fk2)
- {
- fk3=fk1;
- fk1=fk2;
- fk2=fk3;
- }
- }
- }
复制代码
FIR滤波器设计函数
void firdes(double npass) //FIR滤波器子程序
{
int t;
for (t=0; t<51; t++)
{
if (t == ((51-1)/2))
h[t]=2*npass;
else
h[t] = sin((t-(51-1)/2.0)*npass*2*pii)/(pii*(t-(51-1)/2.0));
}
}
LCD显示函数:
外部中断2服务函数(包含归一化函数):
- interrupt void ExtInt2() //中断2中断子程序
- {
-
- *(unsigned int*)IFR=0xFFFF; //清除所有中断标志,"写1清0" ,这个语句可以省略,响应中断自动清除中断标志
-
- //----读AD7822的转换结果----------------
-
- data_buff[i] = port8002 & 0x00ff;
-
- i++;
-
- if(i == 256)
- {sum=0;
- for(i2=0;i2<256;i2++) //归一化函数
- {sum=sum+data_buff[i2];}
- ave=sum/256;
- for(i3=0;i3<256;i3++)
- {pr[i3]=data_buff[i3]-ave;
- data_buff[i3]=pr[i3];
- pi[i3]=0.0;
- fr[i3]=0.0;
- fi[i3]=0.0;}
- kfft(pr,pi,256,8, fr, fi,0,1);
- pinpu(pr);
- npass=(fk1+fk2)/500000;
- firdes(npass);
- Convolvevok(data_buff,h,y,256,51);
- for(j=0;j<256;j++)
- {
- pi[j]=0;
- }
- kfft(y,pi,256,8,fr,fi,0,1);
- display();
- i = 0; //在此设断点
- }
- return;
- }
复制代码
完整的Word格式文档51黑下载地址:
DSP设计总结报告_电子1502王宇1505020223.docx
(941.1 KB, 下载次数: 96)
|