DSP28xx作FFT波形变换(CCS4以上版本)
admin 于 2015年02月21日 发表在 数字信号处理

利用CCS4软件来创建FFT工程,实现DSP28335中的信号处理程序风仿真、下载等操作。

1. 创建工程 

加载TI官方附带CCS工程例程,并修改主程序(见附录),如图所示:

2. 添加配置

添加 .ccxml 文件为 F283x CPU Cycle… 并单击 Build 功能,然后进行 Debug,如下:

4. 配置输出文件

Tools ->Graph->Dual Time配置相应的输出文件,详细配置如下:

 

5. 运行仿真 

加载Load生成的.out文件,仿真输出波形如下图所示:

 

此时,通过给内部flash下载程序,开发板便可实现相应功能。

注:CCS3.3的程序在CCS4以上版本中编译,可能会出现未知错误,此时删除code_start便可,具体操作如下所示:

附工程代码:

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include <math.h>

#define pi 3.141593

//NL为合成信号点数,与N的值必须是一致的,即NL=N
#define NL 256

//FFT点数
int N=NL;

// 定义复数结构体
struct Complex
{
    float real,imag;
};

//定义复乘
struct Complex MUL(struct Complex a,struct Complex b)
{
    struct Complex c;
    c.real=a.real*b.real-a.imag*b.imag;
    c.imag=a.real*b.imag+a.imag*b.real;
    return(c);
}

struct Complex Wn;  //定义旋转因子
struct Complex Vn;  //每一级第一个旋转因子虚部为0,实部为1
struct Complex T;   //存放旋转因子与X(k+B)的乘积

float Input[NL]; //输入的信号序列,NL必须满足2的m次幂
float output[NL]= {0};  // 输出的FFT幅值(复数的模)
struct Complex Sample[NL]; // 采样输入的实数转化为复数

//输入为复数指针*xin,做N点FFT
void MYFFT(struct Complex *xin,int N);
//振幅序列变换
void ModelComplex(struct Complex *Sample,int N,float *output);

void main(void)
{
    Uint16 i=0;
    InitSysCtrl();

    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;

    //1.产生正弦三次谐波叠加而成的方波
    for(i=0; i<NL; i++) //产生正弦三次谐波叠加而成的方波
    {
        Input[i]=sin(2*pi*(5*i/(NL-1)))+sin(2*pi*(5*3*i/(NL-1)))/3+sin(2*pi*(5*5*i/(NL-1)))/5;
    }

    //2.输入实数信号转换为复数
    for(i=0; i<NL; i++)
    {
        Sample[i].real=Input[i];  //实序列值
        Sample[i].imag=0;    //虚序列0
    }

    //3.计算FFT
    MYFFT(Sample,NL);

    //4.求模
    ModelComplex(Sample,NL,output);

    while(1) {}
}


//输入为复数指针*xin,做N点FFT
void MYFFT(struct Complex *xin,int N)
{
    int L=0;   // 级间运算层
    int J=0;   // 级内运算层
    int K=0,KB=0;     // 蝶形运算层
    int M=1,Nn=0; // N=2^M
    float B=0;  // 蝶形运算两输入数据间隔

    //以下是为倒序新建的局部变量
    int LH=0,J2=0,N1=0,I,K2=0;
    struct Complex T;

    //以下是倒序
    LH=N/2;
    J2=LH;
    N1=N-2;
    for(I=1; I<=N1; I++)
    {
        if(I=K2)
        {
            J2-=K2;
            K2=K2/2;// K2=K2/2
        }
        J2+=K2;
    }

    //计算出N的以2为底数的幂M
    Nn=N;
    while(Nn!=2)
    {
        M++;
        Nn=Nn/2;
    }

    //蝶形运算, 级间
    for(L=1; L<=M; L++) //级间
    {
        B=pow(2,(L-1));
        Vn.real=1;
        Vn.imag=0;
        Wn.real=cos(pi/B);
        Wn.imag=-sin(pi/B);
        //级内
        for(J=0; J<B; J++)
        {
            //蝶形因子运算
            for(K=J; K<N; K+=2*B)
            {
                KB=K+B;
                T=MUL(xin[KB],Vn);
                //原址运算,计算结果存放在原来的数组中
                xin[KB].real=xin[K].real-T.real;
                xin[KB].imag=xin[K].imag-T.imag;
                xin[K].real=xin[K].real+T.real;
                xin[K].imag=xin[K].imag+T.imag;
            }
            /* 旋转因子做复乘相当于指数相加,得到的结果,
               和J*2^(M-L)是一样的,因为在蝶形因子运算
               层中M与L都是不变的,唯一变x化的是级内的J
               而且J是以1为步长的,如J*W等效于W+W+W...J个W相加
            */
            Vn=MUL(Wn,Vn);
        }
    }
}

// 取模。形参:*Sample指向需要取模的复数结构体;N为取模点数; *output存放取模后数值的数组
void ModelComplex(struct Complex *Sample,int N,float *output)
{
    int i;
    for(i=0; i<N; i++)
    {
        //输出幅度,利用sqrt函数求解
        output[i]=sqrt(Sample[i].real*Sample[i].real+Sample[i].imag*Sample[i].imag)*2/N;
    }
}
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:CCS4,信号处理,FFT