基于DSP的电力线载波OFDM调制解调器
TMS320C6201的数据通路和流水线工作方式是对算法进行优化从而获得高性能的基础。TMS320C6201有两个可以进行数据处理的数据通路A和B,每个通路有4个功能单元(.L.S.M.D)和一个包括16个32位寄存器的寄存器组。功能单元执行逻辑、位移、乘法、加法和数据寻址等操作。两个数据寻址单元(.D1和.D2)专门负责寄存器组和存储器之间的数据传递。在同一时刻,这些功能单元能够并行地执行多条指令。TMS320C6201对任何指令的操作都能分为几个子操作,每个子操作由不同单元完成。对每个单元来说,每个时钟周期可进入一条新指令,这样在不同周期内,不同单元可以处理不同的指令,这种工作方式称?quot;流水线工作方式。TMS320C6201的特殊结构,可使8条指令同时通过流水线的每个节拍,从而大大提高了机器的吞吐量。
本文引用地址:https://www.eepw.com.cn/article/269682.htm为使代码达到最大效率,程序将尽可能将指令安排为并行执行。为使指令并行操作,程序确定指令间的相关性,即一条指令必须发生在另一条指令之后。根据TMS320C6201的数据通路和流水线工作方式,在此给出一种高效实现16点Radix4FFT的方法。其基本思想是分解传统的FFT蝶型算法循环体,将其分别展开在A、B通路内计算两个FFT蝶型算法。每个蝶型算法分别只分配自己这一侧的寄存器组和功能单元。这样在循环体内两个蝶型算法是完全不相关的,能够并行执行。下面给出基于C.S.Burrus和T.W.Parks的Radix4FFT算法的优化算法的代码实现。
void radix4(int n,short x[], short w[])
{
int n1,n2,ie,wa1,wa2,wa3, wb1, wb2,wb3,ia0,ia1,ia2,ia3,ib0,ib1,ib2,ib3,j,k;
short ta,tb,ra1,ra2, rb1,rb2,sa1,sa2,sb1,sb2,coa1,coa2,coa3,cob1,cob2,cob3,sia1,sia2,sia3,sib1,sib2,sib3;
n2=n;
ie=1;
for(k=n;k>1;k>>=2)
{ //number of stage
n1=n2;
n2>>=2; // distance between input datas
wa1=0;
for(j=0;j
wb1=wa1+ie;
wa2=wa1+wa1;
wb2=wb1+wb1; //since heremost of the folow-ering two instructions are parallel
wa3=wa2+wa1;
wb3=wb2+wb1;
coa1=w[wa1*2+1];
cob1=w[wb1*2+1];
sia1=w[wa1*2];
sib1=w[wb1*2];
coa2=w[wa2*2+1];
cob2=w[wb2*2+1];
sia2=w[wa2*2];
sib2=w[wb2*2];
coa3=w[wa3*2+1];
cob3=w[wb3*2+1];
sia3=w[wa3*2];
sib3=w[wb3*2];
wa1=wb1+ie;
for(ia0=j,ib0=j+1;ia0
{//loop of two butterflies caculation
ia1=ia0+n2;
ib1=ib0+n2;
ia2=ia1+n2;
ib2=ib1+n2;
ia3=ia2+n2;
ib3=ib2+n2;
ra1=x[2*ia0]+x[2*ia2];
rb1=x[2*ib0]+x[2*ib2];
ra1=x[2*ia0]-x[2*ia2];
rb1=x[2*ib0]-x[2*ib2];
ta=x[2*ia1]+x[2*ia3];
tb=x[2*ib1]+x[2*ib3];
x[2*ia0]=ra1+ta; // x[2*ia0]
x[2*ib0]=rb1+tb; // x[2*ia0]
ra1=ra1-ta;
rb1=rb1-tb;
sa1=x[2*ia0+1]+x[2*ia2+1];
sb1=x[2*ib0+1]+x[2*ib2+1];
sa2=x[2*ia0+1]-x[2*ia2+1];
sb2=x[2*ib0+1]-x[2*ib2+1];
ta=x[2*ia1+1]+x[2*ia3+1];
tb=x[2*ib1+1]+x[2*ib3+1];
x[2*ia0+1]=sa1+ta;
x[2*ib0+1]=sb1+tb;
sa1=sa1-ta;
sb1=sb1-tb;
x[2*ia2]=(ra1*coa2+sa1*sia2)>>15;
x[2*ib2]=(rb1*cob2+sb2*sib2)>>15;
x[2*ia2+1]=(sa1*coa2-ra1*sia2)>>15;
x[2*ib2+1]=(sb1*cob2-rb1*sib2)>>15;
ta=x[2*ia1+1]-x[2*ia3+1];
ra1=ra2+ta;
rb1=rb2+tb;
ra2=ra2-ta;
rb2=rb2-tb;
ta=x[2*ia1]-x[2*ia3];
tb=x[2*ib1]-x[2*ib3];
sa1=sa2-ta;
sb1=sb2-tb;
sa2=sa2+ta;
sb2=sb2+tb;
x[2*ia1]=(ra1*coa1+sa1*sia1) >>15;
x[2*ib1]=(rb1*cob1+sb1*sib1) >>15;
x[2*ia1+1]=(sa1*coa1-ra1*sia1)>>15;
x[2*ib1+1]=(sb1*cob1-rb1*sib1)>>15;
x[2*ia3]=(ra2*coa3+sa2*sia3) >>15;
x[2*ib3]=(rb2*cob3+sb2*sib3) >>15;
x[2*ia3+1]=(sa2*coa3-ra2*sia3)>>15;
x[2*ib3+1]=(sb2*cob3-rb2*sib3)>>15;
}
}
ie <<=2
}
}
模数转换器相关文章:模数转换器工作原理
分频器相关文章:分频器原理
评论