微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > +结项报告

+结项报告

时间: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,方便请教一下。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top