微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > 用CCS画出信号时域图&在对信号进行傅里叶变换时遇到的问题

用CCS画出信号时域图&在对信号进行傅里叶变换时遇到的问题

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


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

        


                                                            图 2                                         图3
         ③在调试后,先查找函数(信号sin_Endd)的指针值,如图4,图形属性设置界面如图5
                  

         


                                          图 4                                                              图5
            
          ④画出图形如图6
                              


                                                      图 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的傅里叶变换程序以及效果图
        

                           





                                 




你可以在Ti官网下载DSPLIB库,里面有两个FFT的库函数。
DSPF_sp_fftSPxSP和DSPF_sp_fftSPxSP_cn  一个是经过优化的库函数,一个是没有经过优化的C程序两个输出是一样的,运行时间不一样。

恩,那个我知道,我就想看看我用的指针出了什么问题,一直不得其解

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

网站地图

Top