DSP谐波分析的理论基础ccs仿真结果及分析.docx
《DSP谐波分析的理论基础ccs仿真结果及分析.docx》由会员分享,可在线阅读,更多相关《DSP谐波分析的理论基础ccs仿真结果及分析.docx(13页珍藏版)》请在冰豆网上搜索。
![DSP谐波分析的理论基础ccs仿真结果及分析.docx](https://file1.bdocx.com/fileroot1/2022-11/28/88dacd0f-bc1f-432d-bb36-b584b4308dd0/88dacd0f-bc1f-432d-bb36-b584b4308dd01.gif)
DSP谐波分析的理论基础ccs仿真结果及分析
基于DSP的方波信号谐波分析
一切周期非正弦信号都是由某一频率的正弦波(基波)和若干数倍于此频率的正弦波(高次谐波)叠加而成。
谐波分析的工作就是了解一个信号的基波和谐波的组成及其占比。
该设计使用基于ICETEK—VC5509—A的DSP实验箱,软件环境为CCS3.3。
一·理论部分
1信号采集
首先是对信号的采集。
主要是对输入信号进行AD转换,采样率越高,则分析精度越高,但硬件消耗同时加大。
模拟信号经过A/D变换转换为数字信号的过程称之为采样,信号采样后其频谱产生了周期延拓,每隔一个采样频率ωs,重复出现一次。
(1).频混现象
频混现象又称为频谱混叠效应,它是由于采样信号频谱发生变化,而出现高、低频成分发生混淆的一种现象,如图3.1.1所示。
信号x(t)的傅里叶变换为X(ω),其频带范围为-ωm~+ωm;采样信号x(t)的傅里叶变换是一个周期谱图,其周期为ωs,并且:
ωs=2π/Ts
Ts为时域采样周期.当采样周期Ts较小时,ωs>2ωm,周期谱图相互分离如图1中(b)所示;当Ts较大时,ωs<2ωm,周期谱图相互重叠,即谱图之间高频与低频部分发生重叠,如图3.1中(c)所示,此即为频混现象,这将使信号复原时丢失原始信号中的高频信息。
图1采样信号的频混现象
下面从时域信号波形来看这种情况。
图2(a)是频率正确的情况,以及其复原信号;(b)是采样频率过低的情况,复原的是一个虚假的低频信号。
图2发生频混现象的时域信号波形
当采样信号的频率低于被采样信号的最高频率时,采样所得的信号中混入了虚假的低频分量,这种现象叫做频率混叠。
(2).采样定理
上述情况表明,如果ωs>2ωm,就不发生频混现象,因此对采样脉冲序列的间隔Ts须加以限制,即采样频率ωs(2π/Ts)或fs(1/Ts)必须大于或等于信号x(t)中的最高频率ωm的两倍,即ωs>2ωm,或fs>2fm。
为了保证采样后的信号能真实地保留原始模拟信号的信息,采样信号的频率必须至少为原信号中最高频率成分的2倍。
这是采样的基本法则,称为采样定理。
需要注意的是,在对信号进行采样时,满足了采样定理,只能保证不发生频率混叠,对信号的频谱作逆傅立叶变换时,可以完全变换为原时域采样信号,而不能保证此时的采样信号能真实地反映原信号。
工程实际中采样频率通常大于信号中最高频率成分的3到5倍。
2FFT变换与谐波分析
(1)FFT变换
采样到信号后进行调整,主要是化为以弧度为单位的数值(比例关系)。
之后进行FFT变换即可得到信号频谱图。
FFT变换即快速傅立叶变换的算法是蝶型算法,即交叉排序后进行乘加运算。
傅立叶分析是联系时域和频域的桥梁,是频域数字化分析的理论基础。
一个波形的傅立叶变换的实质是:
把这个波形分解成许多不同频率的正弦波之和。
如果这些正弦波加起来成为原来的波形,那么,就确定了这个波形的傅立叶变换。
傅立叶变换可以辨别或区分开组成任意波形的一些不同频率的正弦波和它们各自的振幅,在数学上,这种关系被表示为:
式中,χ(t)是被分解为正弦函数之后的波形;F(ω)是χ(t)的傅立叶变换。
傅立叶变换可以看作是时间函数在频率域上的表示,由傅立叶变换给出的频率域包含的信息和原函数时间域内所包含的完全相同,不同的仅是信息的表示方法。
自从1965年FFT算法问世以来,已深刻地改变了作数字谱分析的途径。
它代替了过去计算功率谱密度时先计算相应相关函数的离散估计,然后求出相关函数的DFT的谱而得到功率谱的计算途径。
如果给定的周期函数满足狄里赫利条件,则该周期函数定可展开为一个收敛的正弦函数级数。
这样:
其中,两式中的各个系数的计算公式为
式中,T为周期;ω为角频率,
;A0为直流分量;A1cos(ωt+ψ1)称为一次谐波;Akcos(kωt+ψk)成为k次谐波。
因此,可以看出,一个周期振动可看成是基频是的谐振动和其他高次谐振动的叠加。
频谱是由等距离的频谱线组成的,谐波频率具有简单的倍数关系。
它们的振幅却随值k变大而减小。
整个频率范围就是信号的频带,频谱是离散频谱。
通过上述傅里叶变换,方波可表示为:
DIT-FFT程序框图
根据DIT-FFT原理和过程,DIT-FFT的完整程序框图包括以下几部分:
(1)倒序:
输入自然顺序序列x(n),根据倒序规律,进行倒序处理;
(2)循环层1:
确定运算的级数,L=1M(N=2M);确定一蝶形两输入数据距离B=2L-1
(3)循环层2:
确定L级的(B=)2L-1个旋转因子;旋转因子指数p=2M-LJ,J=0B-1;
(4)循环层3:
对于同一旋转因子,用于同一级2M-L个蝶形运算中:
k的取值从J到N-1,步长为2L(使用同一旋转因子的蝶形相距的距离)
(5)完成一个蝶形运算。
3频谱分析
信号的频谱分析是信号与系统分析的基础。
用数值计算的方法实现确知信号的频谱分析,
即采用离散傅里叶变换的快速算法实现对信号的频谱估计。
二.程序
#include"myapp.h"
#include"ICETEK-VC5509-EDU.h"
#include"scancode.h"
#include
#definePI3.1415926
#defineSAMPLENUMBER256
voidInitForFFT();
voidFFT();
voidInitADC();
voidwait(unsignedintcycles);
voidEnableAPLL();
unsignedintnADC0[256],nADC1[256];
floatfWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];
floatsin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];
main()
{
inti,j;
unsignedintuWork;
InitForFFT();
EnableAPLL();
SDRAM_init();
InitADC();
PLL_Init(132);
//while
(1)
//{
for(i=0;i<256;i++)
{
ADCCTL=0x8000;//启动AD转换,通道0
do
{
uWork=ADCDATA;
}while(uWork&0x8000);
nADC0[i]=uWork&0x0fff;
}
/*for(i=0;i<256;i++)
{
ADCCTL=0x9000;//启动AD转换,通道1
do
{
uWork=ADCDATA;
}while(uWork&0x8000);
nADC1[i]=uWork&0x0fff;
}
asm("nop");//breakpoint*/
//}
for(j=0;j{
fWaveR[j]=nADC0[j];
fWaveI[j]=0.0f;
w[j]=0.0f;
}
FFT(fWaveR,fWaveI);
for(j=0;j{
DATA[j]=w[j];
}
while
(1);//breakpoint
}
voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER])
{
intx0,x1,x2,x3,x4,x5,x6,xx;
inti,j,k,b,p,L;
floatTR,TI,temp;
/**********followingcodeinvertsequence************/
for(i=0;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{
dataR[i]=dataI[i];dataI[i]=0;
}
/**************followingcodeFFT*******************/
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];
}/*ENDfor(3)*/
}/*ENDfor
(2)*/
}/*ENDfor
(1)*/
for(i=0;i{
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
}
}/*ENDFFT*/
voidInitForFFT()
{
inti;
for(i=0;i{
sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);
cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);
}
}
/*voidMakeWave()
{
inti;
for(i=0;i{
INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024;
}
}*/
voidInitADC()
{
ADCCLKCTL=0x23;//4MHzADCLK
ADCCLKDIV=0x4f00;
}
voidwait(unsignedintcycles)
{
inti;
for(i=0;i}
voidEnableAPLL()
{
/*EnusreDPLLisrunning*/
*(ioportvolatileunsignedshort*)0x1f00=4;
wait(25);
*(ioportvolatileunsignedshort*)0x1f00=0;
//MULITPLY
*(ioportvolatileunsignedshort*)0x1f00=0x3000;
//COUNT
*(ioportvolatileunsignedshort*)0x1f00|=0x4F8;
wait(25);
//*(ioportvolatileunsignedshort*)0x1f00|=0x800
//MODE
*(ioportvolatileunsignedshort*)0x1f00|=2;
wait(30000);
//APLLSelect
*(ioportvolatileunsignedshort*)0x1e80=1;
//DELAY
wait(60000);
}
三.结果与分析
运行后打来Graphics窗口观察信号其及频谱图如下:
左上为输入信号采样后的波形,可见为方波信号。
右上为根据方波信号由系统自己转换的频谱图。
右下为根据编写的程序计算得出的信号频谱图。
可见计算结果与实际频谱的尖峰分布比较一致。
不同的地方是成份较小的频率部分。
个人认为原因可能有两点:
一是计算频谱图的精度取决于采样点数,采样点越大,谱频越精确;二是输入信号本身有噪声,因此计算FFT时的对象信号实际上是一个方波信号与高斯噪声信号的叠加,最后的频谱中有白噪声的频谱。
方波的频谱是由等距离的频谱线组成的,谐波频率具有简单的倍数关系,它们的振幅却随频率的变大而减小。
按照傅立叶分析法,信号可以分解为许多谐波分量,而第一个谐波分量可由一系列频率不同的谐波复合而成,各次谐波可以按其频率高低依次排列起来成
为谱状,按照这样排列的各次谐波的总体称为频谱。
将方波信号展开成傅立叶级数为:
n=1,3,5…
此公式说明,方波信号中只含有一、三、五等奇次谐波分量,并且其各奇次谐波分量的幅值逐渐减小,初相角为零。
图为一个周期方波信号的组成情况,由图可见,当它包含的分量越多时,波形越接近于原来的方波信号,还可以看出频率较低的谐波分量振幅较大,它们组成方波的主体,而频率较高的谐波分量振幅较小,它们主要影响波形的细节。
(a)基波(b)基波+三次谐波
(c)基波+三次谐波+五次谐波
(d)基波+三次谐波+五次谐波+七次谐波
(e)基波+三次谐波+五次谐波+七次谐波+九次谐波
方波是可以根据傅里叶级数展开成正弦信号的叠加。
频谱这表示不同相位的正弦信号的幅值。
参考文献:
[1]傅晓林,李智.计算机辅助非正弦周期信号的幅频谱分析[J].重庆邮电学院学报,2001,13(4):
98-101.
[2]刘娟,段权,刘振凤.基于VC++的多路离散信号频谱分析系统[J].计算机工程与设计,2008,29(13):
3494-3496.
[3]曾秀莲,程保胜,潘雪峰.连续时间信号频谱分析及MATLAB实现[J].2006,6(5):
56-57.
[4]肖晓萍,石永革.基于LabVIEW的虚拟频谱分析仪及频域测量误差分析[J].计算机工程与设计,2006,
10(18):
3472-3475.
[5]郑君里,杨为理.信号与系统(第五版)[M].北京:
高等教育出版社,2000.