CCS5.2 Graph的使用方法及步骤 FFT

CCS5.2  Graph的使用方法及步骤 FFT
     最近在做一个新项目,正好用到CCS,说实话从KEIL过渡到CCS真的有点不习惯,但CCS的某些功能还是非常实用的,在使用过程中,想对AD采集的数据进行波形仿真,要使用CCS的Graph功能,在网上找了半天没找到一个像样的资料,所以在这里将本人使用的一个具体步骤与大家分享。
     1、保证程序编译及test connection无error
     2、点击debug(绿色的小甲壳虫),然后点击Resume(F8)

     3、选择你要通过Graph查看的
#include "myapp.h" #include "scancode.h" #include <math.h> #define PI 3.1415926 #define SAMPLENUMBER 128 void InitForFFT(); void MakeSquareWave(float duty_cycle); void FFT(float dataR[SAMPLENUMBER], float dataI[SAMPLENUMBER]); void SynthesizeSquareWave(float duty_cycle, float output[SAMPLENUMBER]); // 定义全局变量,便于在CCS中观察 int INPUT[SAMPLENUMBER], DATA[SAMPLENUMBER]; float fWaveR[SAMPLENUMBER], fWaveI[SAMPLENUMBER], w[SAMPLENUMBER]; float sin_tab[SAMPLENUMBER], cos_tab[SAMPLENUMBER]; float synthesized[SAMPLENUMBER]; // 合成波形 float synthWaveR[SAMPLENUMBER], synthWaveI[SAMPLENUMBER]; // 合成波形FFT分析用 float synthSpectrum[SAMPLENUMBER]; // 合成波形频谱 float originalSpectrum[SAMPLENUMBER]; // 原始波形频谱 main() { int i; float duty_cycle = 0.5; // 占空比50% InitForFFT(); // 原始方波生成与FFT分析 MakeSquareWave(duty_cycle); for(i=0; i<SAMPLENUMBER; i++) { fWaveR[i] = INPUT[i]; fWaveI[i] = 0.0f; } FFT(fWaveR, fWaveI); // 保存原始方波的频谱到单独数组,便于在Graph中比较 for(i=0; i<SAMPLENUMBER; i++) { originalSpectrum[i] = w[i]; DATA[i] = w[i]; } // 傅里叶逆变换合成方波 SynthesizeSquareWave(duty_cycle, synthesized); // 合成波形的FFT分析 for(i=0; i<SAMPLENUMBER; i++) { synthWaveR[i] = synthesized[i]; synthWaveI[i] = 0.0f; } // 执行合成波形的FFT分析 FFT(synthWaveR, synthWaveI); for(i=0; i<SAMPLENUMBER; i++) { synthSpectrum[i] = w[i]; } // 计算误差 float errorSignal[SAMPLENUMBER]; for(i=0; i<SAMPLENUMBER; i++) { // 归一化后计算误差 float normOriginal = INPUT[i] / 1024.0f; float normSynth = synthesized[i] / 1024.0f; errorSignal[i] = normOriginal - normSynth; } while(1); // 断点 - 在此处可以使用CCSGraph工具查看各个数组 } void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]) { int x0,x1,x2,x3,x4,x5,x6,xx; int i,j,k,b,p,L; float TR,TI,temp; /********** following code invert sequence ************/ for ( i=0;i<SAMPLENUMBER;i++ ) { x0=x1=x2=x3=x4=x5=x6=0; x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01; xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; dataI[xx]=dataR[i]; } for ( i=0;i<SAMPLENUMBER;i++ ) { dataR[i]=dataI[i]; dataI[i]=0; } /************** following code FFT *******************/ for ( L=1;L<=7;L++ ) { /* for(1) */ b=1; i=L-1; while ( i>0 ) { b=b*2; i--; } /* b= 2^(L-1) */ for ( j=0;j<=b-1;j++ ) /* for (2) */ { p=1; i=7-L; while ( i>0 ) /* p=pow(2,7-L)*j; */ { p=p*2; i--; } p=p*j; for ( k=j;k<128;k=k+2*b ) /* for (3) */ { TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b]; dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p]; dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p]; dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p]; dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p]; } /* END for (3) */ } /* END for (2) */ } /* END for (1) */ for ( i=0;i<SAMPLENUMBER/2;i++ ) { w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]); } } /* END FFT */ void InitForFFT() { int i; for ( i=0;i<SAMPLENUMBER;i++ ) { sin_tab[i]=sin(PI*2*i/SAMPLENUMBER); cos_tab[i]=cos(PI*2*i/SAMPLENUMBER); } } void MakeSquareWave(float duty_cycle) { int i; int period = SAMPLENUMBER; // 一个完整周期的采样点数 int high_samples = (int)(period * duty_cycle); // 高电平采样点数 for(i=0; i<SAMPLENUMBER; i++) { // 生成方波:在占空比范围内为高电平,其余为低电平 if(i % period < high_samples) { INPUT[i] = 1024; // 高电平值 } else { INPUT[i] = -1024; // 低电平值 } } } void SynthesizeSquareWave(float duty_cycle, float output[SAMPLENUMBER]) { int i, k; int harmonics = 31; // 使用前31个奇次谐波 float dc_offset = (2 * duty_cycle - 1) * 1024; // 直流分量 for(i = 0; i < SAMPLENUMBER; i++) { output[i] = dc_offset; // 添加直流分量 for(k = 1; k <= harmonics; k += 2) { float phase = 2 * PI * k * i / SAMPLENUMBER; float amplitude = (4.0f / (PI * k)) * sinf(PI * k * duty_cycle); output[i] += amplitude * 1024 * sinf(phase); // 幅度缩放整合 } } } //ccs中生成方波,基于傅里叶变换进行分解,分析50占空比下频率分量,并绘制频谱图;基于傅里叶逆变换,对多个频率正弦波进行叠加,输出一个方波,并进行分析。优化代码
最新发布
06-26
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值