【创龙TMS320C6748开发板试用】用CCS画出信号时域图&在对信号进行傅里叶变换时遇到的问题

2019-07-15 19:25发布

本帖分为两个部分,一个是用CCS的图形工具,画出仿真信号的时域图,另一部分是相对这个信号进行傅里叶变换的时候遇到的问题。(当然这里面的算法中的命名规则、C的书写方式都不符合C标准,而且现在刚开始还只是考虑算法的实现问题,还没来得及考虑效率的问题)        最近一直在尝试用C编写几个简单的算法,可是一到动手才发现,自己原有的那点C语言基础知识完全不够用,然后去看了看指针,发现还是不行,所以本想自己获得一个信号,然后对其进行傅里叶变换,结果只进行了前面简单的一步,后面的傅里叶变换的算法实在调试通不过。在这里,就让我班门弄下斧,和大家说一下这前面的工作,再来向大家求教一下后面傅里叶变换程序的解决方法,并附上该傅里叶变换的matlab程序(摘自《数字信号处理的MATLAB实现》,科学出版社)。

        1、获得一个x=sin(2*pi*t)+0.5*sin(2*pi*5*t)的信号
         ①为了使得程序能够顺利运行,应设置堆栈(stack)的大小,这里设置为0x100000,如图1所示
                                           1.jpg

                                                                  图 1
        ②图2为获得x=sin(2*pi*t)+0.5*sin(2*pi*5*t),并且在主函数中调用(图3),其中n为采样点数,dt为采样间隔
                2.png          3.png

                                                            图 2                                         图3
         ③在调试后,先查找函数(信号sin_Endd)的指针值,如图4,图形属性设置界面如图5
                   4.png           5.png
                                          图 4                                                              图5
            
          ④画出图形如图6
                               6.png
                                                      图 6
           2、傅里叶变换算法,贴上a[k],b[k],c[k]的代码,注意以下代码并不能实现需要的傅里叶变换,主要问题是:为什么得到的a[k]和b[k]均为0,贴出来是希望哪位能够指正以下。
  #define N 256
#defin #define PF(x)    ((x)*(x))
double *compute_ak()
{
        int n=256;
        float dt=0.02;
        double *a=(double *)malloc(128*sizeof(double));
        int k,j;

        int h;
                         for(h=0;h<128;h++)
                         {
                                 a[h]=0.0;
                         }
                         double *sin_ak=(sin_fun(n,dt));
        for(k=0;k<128;k++)
        {
                for(j=0;j<256;j++)
                {
                        a[k]=a[k]+(sin_ak[j])*(2/N)*cos(2*pi*k*j/N);
                }
        }

    return a;
}

double *compute_bk()
{
            int n=256;
                 float dt=0.02;
                 double *b=(double *)malloc(128*sizeof(double));
                 int k,j;
                 double *sin_bk=(sin_fun(n,dt));
                 int h;
                 for(h=0;h<128;h++)
                 {
                         b[h]=0.0;
                 }
                 for(k=0;k<128;k++)
                 {
                         for(j=0;j<N;j++)
                         {
                                 b[k]=b[k]+(sin_bk[j])*(2/N)*sin(2*pi*k*j/N);
                         }
                 }

             return b;
}

double *compute_ck()
{
        double *c=(double *)malloc(128*sizeof(double));
        double *a=compute_ak();
        double *b=compute_bk();
        int k;
        for(k=0;k<m;k++)
        {
                        c[k]=sqrt(PF(a[k])+PF(b[k]));
        }
        return c;
}

                        
                                                  
           3、上述希望得到的c即为经傅里叶变换后所得到的谱值(由于a和b均为0,得到的c也为0)。


            附MATLAB的傅里叶变换程序以及效果图
         10.png                             11.png







                                 


7.png
8.png
9.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
沈士杰
1楼-- · 2019-07-15 21:30
你可以在Ti官网下载DSPLIB库,里面有两个FFT的库函数。
DSPF_sp_fftSPxSP和DSPF_sp_fftSPxSP_cn  一个是经过优化的库函数,一个是没有经过优化的C程序两个输出是一样的,运行时间不一样。
jzhfighting
2楼-- · 2019-07-16 02:25
 精彩回答 2  元偷偷看……

一周热门 更多>