dsp方波谐波分析

上传人:博****1 文档编号:561346444 上传时间:2024-01-21 格式:DOCX 页数:12 大小:96.10KB
返回 下载 相关 举报
dsp方波谐波分析_第1页
第1页 / 共12页
dsp方波谐波分析_第2页
第2页 / 共12页
dsp方波谐波分析_第3页
第3页 / 共12页
dsp方波谐波分析_第4页
第4页 / 共12页
dsp方波谐波分析_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《dsp方波谐波分析》由会员分享,可在线阅读,更多相关《dsp方波谐波分析(12页珍藏版)》请在金锄头文库上搜索。

1、基于DSP的方波信号谐波分析(2010-07-24 18:59:06)转载标签:分类:技术杂谈 一切周期非正弦信号都是由某一频率的正弦波(基波)和若干数倍于此频率的正弦波(高次 谐波)叠加而成。谐波分析的工作就是了解一个信号的基波和谐波的组成及其占比。该设计使用基于TMS320C5509A的DSP实验箱,软件环境为CCS3.1。首先是对信号的采集。主要是对输入信号进行AD转换,采样率越高,则分析精度越高,但 硬件消耗同时加大。关于AD信号的参考程序不做列举。采信到信号后进行调整,主要是化为以弧度为单位的数值(比例关系)。之后进行FFT变 换即可得到信号频谱图。快速傅立叶变换的算法是蝶型算法,即

2、交叉排序后进行乘加运算, 关于算法的详细介绍和优点可以参考数字信号处理一类书。以下是FFT参考程序: void FFT(float dataRSAMPLENUMBER,float dataISAMPLENUMBER)int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p,L;float TR,TI,temp;for ( i=0;iSAMPLENUMBER;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)

3、&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataIxx=dataRi;for ( i=0;iSAMPLENUMBER;i+ )dataRi=dataIi; dataIi=0;for ( L=1;L0 )b=b*2; i-;for ( j=0;j0 )p=p*2; i-;p=p*j;for ( k=j;k128;k=k+2*b )TR=dataRk; TI=dataIk; temp=dataRk+b; dataRk=dataRk+dataRk+b*cos_tabp+dataIk+b*sin_tabp; dataIk

4、=dataIk-dataRk+b*sin_tabp+dataIk+b*cos_tabp; dataRk+b=TR-dataRk+b*cos_tabp-dataIk+b*sin_tabp; dataIk+b=TI+temp*sin_tabp-dataIk+b*cos_tabp;for ( i=0;iSAMPLENUMBER/2;i+ )wi=sqrt(dataRi*dataRi+dataIi*dataIi);运行后打来 Graphics 窗口观察信号其及频谱图如下:5?7-0.-2000.C102Z55IaIMag4S.C63.0(9(123; ID 17) nAD创Q574曲討团两圖斤他UDJ

5、TLCT”血丽加一.i b. 3 t I I I 1 I I I I I I I I C.1S733 3iiii0.49HCL21875. 3. 81837e- FFT - n xMs? Real FFTut SampleKa32C图注:左上为输入信号采样后的波形,可见为方波信号。右上为根据方波信号由系统自己转换的频谱图。右下为根据编写的程序计算得出的信号频谱图。可见计算结果与实际频谱的尖峰分布比较一致。不同的地方是成份较小的频率部分。个人认为原因可能有两点:一是计算 频谱图的精度取决于采样点数,采样点越大,谱频越精确;二是输入信号本身有噪声,因此 计算 FFT 时的对象信号实际上是一个方波信

6、号与高斯噪声信号的叠加,最后的频谱中有白 噪声的频谱。#include myapp.h#include ICETEK-VC5509-EDU.h#include scancode.h#include #define PI 3.1415926#define SAMPLENUMBER 256void InitForFFT();/void MakeWave();void FFT();void InitADC();void wait( unsigned int cycles );void EnableAPLL( );unsigned int nADC0256,nADC1256;/int INPUTSAM

7、PLENUMBER,DATASAMPLENUMBER;float fWaveRSAMPLENUMBER,fWaveISAMPLENUMBER,wSAMPLENUMBER;float sin_tabSAMPLENUMBER,cos_tabSAMPLENUMBER;main()int i,j;unsigned int uWork;InitForFFT();EnableAPLL();SDRAM_init();InitADC();PLL_Init(132);/ while ( 1 )/ for ( i=0;i256;i+ )ADCCTL=0x8000; / 启动 AD 转换,通道 0 douWork=

8、ADCDATA; while ( uWork&0x8000 ); nADC0i=uWork&0x0fff;/*for ( i=0;i256;i+ )ADCCTL=0x9000; / 启动 AD 转换,通道 1 douWork=ADCDATA; while ( uWork&0x8000 ); nADC1i=uWork&0x0fff;asm( nop); / break point*/ for ( j=0;jSAMPLENUMBER;j+ )fWaveRj=nADC0j;fWaveIj=0.0f;wj=0.0f;FFT(fWaveR,fWaveI);for ( j=0;jSAMPLENUMBER;

9、j+ )DATAj=wj;while ( 1 ); / break pointvoid FFT(float dataRSAMPLENUMBER,float dataISAMPLENUMBER)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;iSAMPLENUMBER;i+ )x0=x1=x2=x3=x4=x5=x6=0;x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x

10、4=(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;dataIxx=dataRi;for ( i=0;iSAMPLENUMBER;i+ )dataRi=dataIi; dataIi=0;/*x* *x* *x* *x* cT w *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* /* following code FFT */for ( L=1;L0 )b=b*2; i-; /

11、* b= 2人(L-l) */for ( j=0;j0 ) /* p=pow(2,7-L)*j; */p=p*2; i-;p=p*j;for ( k=j;kl28;k=k+2*b ) /* for (3) */TR=dataRk; TI=dataIk; temp=dataRk+b;dataRk=dataRk+dataRk+b*cos_tabp+dataIk+b*sin_tabp; dataIk=dataIk-dataRk+b*sin_tabp+dataIk+b*cos_tabp; dataRk+b=TR-dataRk+b*cos_tabp-dataIk+b*sin_tabp; dataIk+b

12、=TI+temp*sin_tabp-dataIk+b*cos_tabp; /* END for (3) */ /* END for (2) */ /* END for (l) */for ( i=0;iSAMPLENUMBER/2;i+ )wi=sqrt(dataRi*dataRi+dataIi*dataIi); /* END FFT */void InitForFFT()int i;for ( i=0;iSAMPLENUMBER;i+ )sin_tabi=sin(PI*2*i/SAMPLENUMBER); cos_tabi=cos(PI*2*i/SAMPLENUMBER);/*void Ma

13、keWave()int i;for ( i=0;iSAMPLENUMBER;i+ )INPUTi=sin(PI*2*i/SAMPLENUMBER*3)*1024;*/void InitADC()ADCCLKCTL=0x23; / 4MHz ADCLKADCCLKDIV=0x4f00;void wait( unsigned int cycles )int i;for ( i = 0 ; i cycles ; i+ ) void EnableAPLL( )/* Enusre DPLL is running */*( ioport volatile unsigned short* )0x1f00 = 4;wait( 25 );*( ioport volatile unsigne

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号