+结项报告
时间:10-02
整理:3721RD
点击:
经过两个月的摸索,对创龙TMS320C6748的试用即将告一段落,首先是有很多不舍和遗憾,因为这两个月来特别忙,结果没有花太多时间在开发板试用上,对于结项报告也不知道写点什么,那我就将在开发板上的一些实现总结一下,这包括之前发的一些贴的总结,还有一些新的实现,一并在这贴出来!
1、通过事件来触发EDMA的传输,实现矩阵的转置。(详见http://bbs.elecfans.com/jishu_518898_1_3.html)
实现的功能:由底板按键触发事件中断,使得EDMA开始传输,将StringScr的值复制到StringDst,同时实现矩阵的转置;由按键事件触发的还有底板LED灯,用来指示按键触发
2、用定时器实现EDMA3的数据定时传输(或搬移)。(详见http://bbs.elecfans.com/jishu_520939_1_1.html)
实现的功能:实现用定时器实现EDMA3对数据的定时搬移,这种方法可用于将来在使用AD采集数据的时候,可以定时对采集的数据通过EDMA3传输到相应位置,然后对其进行数据处理,处理完成后,同样可以用这种方法将数据传送至上位机。
3、FFT的实现和验证。
利用DSP的库函数来实现FFT的运算,针对一个构造信号,我调用matlab中的FFT实现,对比结果;另外对一个实际信号,再用两种方法实现对比结果
(1)FFT算法在DSP中的实现
①首先产生旋转因子,这里是将旋转因子的实部和虚部放在一个数组的相邻位置,在用到旋转因子时,可以成对出现
void tw_gen(float *w, int n)
{
int i,j,k;
double x_t,y_t,theta1,theta2,theta3;
for(j=1,k=0;j >2;j=j >2;i += j)
{
theta1=2*PI*i/n;
x_t=cos(theta1);
y_t=sin(theta1);
w[k]=(float)x_t;
w[k+1]=(float)y_t;
theta2=4*PI*i/n;
x_t=cos(theta2);
y_t=sin(theta2);
w[k+2]=(float)x_t;
w[k+3]=(float)y_t;
theta3=6*PI*i/n;
x_t=cos(theta3);
y_t=sin(theta3);
w[k+4]=(float)x_t;
w[k+5]=(float)y_t;
k+=6;
}
}
}
②产生一个待测信号。
for (i=0;i<Tn;i++)
Input=5*sin(2*PI*150*(i/Fs))+15*sin(2*PI*350*(i/Fs));
③调用计算FFT的库函数。
DSPF_sp_fftSPxSP(Tn,CFFT_In,Cw,CFFT_Out,brev,rad,0,Tn);
//Tn采样点数 CFFT_In输入信号 Cw旋转因子 CFFT_Out:FFT计算结果
//brev二进制位翻转 rad变换基 0输出结果数据偏移量 Tn输出结果数据长度
这里要注意到CFFT_Out即为FFT的计算所得到的结果,为一复数。
④计算FFT输出结果的振幅。
for(i=0;i<Tn;i++)
Cmo=0.0;
for(i=0;i<Tn+2;i++)
{
//对信号输出结果(CFFT_Out)求模
Cmo=sqrtsp(CFFT_Out[2*i]*CFFT_Out[2*i]+CFFT_Out[2*i+1]*CFFT_Out[2*i+1]);
Cmo=Cmo*2/Tn;//这里对模乘以2除以Tn是为了得到模真实值
}
(2)将上述计算结果在CCS中用Graph工具画图
①待测信号为5*sin(2*PI*150*(i/Fs))+15*sin(2*PI*350*(i/Fs)),采样点数为Tn=4096时,可作出以下图形
图1
继续增加Tn为8192,待测信号不辨,可画出图形为
图2
可以看出所画出的图形并不是我们计算所得到的结果
②为了验证计算结果的正确性,将计算结果上传至.txt文件中然后用在matlab中画图
分两种情况,一种是验证Tn=4096时,在matlab中用FFT计算得到的结果与CCS中的结果对比,在MATLAB中画的图如下所示
图3
可以发现图一和图3结果一样,故对于已知的构造信号,FFT运算是正确的。另一种是验证Tn=8192时,对于已知的构造信号,在CCS中将结果计算出来,写到.txt文件中,由matlab画图,程序如下
将结果写到outdata1.txt文件中
writedatatonewtxt("F:\\writedata\\outdata1.txt",Cmo,Tn);
void writedatatonewtxt(const char *filename,float *Cmo,int n)
{
FILE* wc =fopen(filename,"w");
int i;
for(i=0;i<n;i++) {
// fprintf(stdout,"%.16f\n" ,data);
fprintf(wc,"%.16f\n" ,Cmo);
}
fclose(wc);
}
然后在matlab中直接读取outdata1.txt中的数据进行画图
matlab读取.txt文件数据画图程序
s='F:\writedata\outdata1.txt';
fidin=fopen(s);
data=fscanf(fidin,'%f');
plot(data);
图4
与图2对比可以知道,当Tn=8192时,FFT的运算结果是正确的,只是在CCS中没有将结果正确显示出来,但是这并不影响程序的可靠性。
(3)对于一段实际待测信号,用FFT运算又会得到什么样的结果呢?
①在CCS中,将准备好的一段2048个点的实际信号读取到一个数组中
void Array_1D()//读取一维数组
{
double temp;
//int i;
int count = 0; //计数器,记录已读出的浮点数
if((fp=fopen(file_name, "rb")) == NULL)
{
printf("请确认文件(%s)是否存在!\n", "F:\\writedata\\indata.txt");
exit(1);
}
while((1==fscanf(fp, "%lf", &temp))&&(count<Tn))
{
data[count] = temp;
count++;
}
②将原来的已知的构造信号替换为data[ ](即实际信号)
// 产生待测试信号
unsigned int i;
for (i=0;i<Tn;i++)
Input=data;
③运行后画图,如下所示
图5
④同样,将上述实际信号在matlab中画图,matlab程序如下
fs=2000; % 采样频率
N=2048; % 数据点数
n=0:N-1;t=n/fs;
s='F:\writedata\indata.txt';
fidin=fopen(s);
data=fscanf(fidin,'%f');
x=data; % 信号
subplot(3,1,1),plot(t,x); grid on; % 绘制时域信号图
y=fft(x,N); % 对信号进行快速傅里叶变换
mag=abs(y)*2/N; % 振幅,这里讲振幅*2/N是为了让振幅和真实值一样
f=n*fs/N; % 频率序列
subplot(3,1,2),plot(f,mag); % 绘制振幅图
xlabel('频率/Hz');
ylabel('振幅');title('N=2048');grid on;
subplot(3,1,3),plot(f(1:N/2),mag(1:N/2));
xlabel('频率/Hz');
ylabel('振幅');title('N=2048');grid on;
可以得到下图
图6
对比图5和图6可以发现二者结果一样。
综上所述,在CCS中调用DSP库函数实现FFT,针对构造的已知信号和实际信号均作了计算,其结果可靠准确,可应用于实际。
---------------------------------------------------------------------------------------------------------------------
分 界 线
---------------------------------------------------------------------------------------------------------------------
以上就是我试用创龙开发板TMS320C6748能写出来的东西,当然我还在继续学习在DSP上实现TCP/IP协议(LwIP协议栈),可是由于时间所限,还没来得及将LwIP协议栈在DSP上完全实现。
对开发板的试用,由于我自己没有安排好时间,结果开发板上的很多功能我还没试用到,很遗憾没有好珍惜这来之不易的试用机会,同时也向给予我开发板试用机会的广州创龙致以衷心的感谢,和说一声抱歉,如果还有机会,我一定会好好试用开发板,并完成一个含金量高的结项报告。
哈哈,原来是广告君啊!
好强!
小编能不能分享下光盘资料呢,谢谢了!我是新手入门学习
光盘资料可以在创龙的云盘里面下载
这个不完整,能不能把光盘里的demo文件夹打包发我邮箱1521966988@qq.com,谢谢了!
写的很细的资料啊 不错不错
极好极好的东西 下来看看那
支持!好东西,找了好久了!谢谢!
朋友,我们现在也在鼓捣创龙6748这块板子,遇到一点小困难,小编能否提供一下qq,方便请教一下。