基于DSP的電力線(xiàn)載波OFDM調制解調器
1 OFDM原理
2 電力線(xiàn)載波通信系統結構
Homeplug是工業(yè)界第一個(gè)電力線(xiàn)家庭網(wǎng)絡(luò )標準.系統參考Homeplug采用的頻譜范圍4.5MHz~21MHz,并在Homeplug物理參數的基礎上確定本系統參數為:
采樣頻率fs=1/T = 15MHz
數據符號時(shí)間Td = 256×T=17.07μs
循環(huán)前綴時(shí)間Tcp = 172×T=11.47μs
OFDM符號時(shí)間Ts = 428×T=28.5μs
數據子載波數為256
子載波間隔Δf=1/Td=0.05858MHz
總子載波占用帶寬 N×Δf=15MHz
由于加入了11.47μs的循環(huán)前綴,系統可以消除11.47μs以?xún)鹊幕夭ǜ蓴_.但是同時(shí)也付出頻帶利用率僅0.59B/Hz和損失功率2.23dB的代價(jià).考慮到電力線(xiàn)惡劣的通信環(huán)境,付出的代價(jià)是值得的.
電力線(xiàn)高速通信系統的系統結構如圖1所示.輸入數據在OFDM信號調制部分依次經(jīng)過(guò)串/并變換、IFFT、加入循環(huán)前綴、并/串變換后,輸出調制后的信號,其頻帶范圍為0~15MHz、數據速率為8.97MB.經(jīng)過(guò)調制的信號經(jīng)過(guò)數/模變換和上變頻后,通過(guò)系統耦合部分進(jìn)入電力線(xiàn). 電力線(xiàn)上的信號通過(guò)系統耦合部分,輸出的信號通過(guò)下變頻、模/數變換后輸入給OFDM信號解調部分.在經(jīng)過(guò)串/并變換、去除循環(huán)前綴、FFT、并/串變換后,輸出串行數據流.
3 OFDM調制解調器的硬件實(shí)現
S5933是AMCC(Applied Micro Circuits Corporation)公司開(kāi)發(fā)的32bit PCI控制器,具備強大、靈活的PCI接口功能,適用于高速數據傳輸場(chǎng)合.S5933芯片的特點(diǎn)是符合PCI2.1規范,支持PCI主、從兩種工作方式,支持多種數據傳輸方式,適用于不同的數據傳輸場(chǎng)合,支持PCI全速傳輸,提供8/16/32bit的Add-On用戶(hù)總線(xiàn),有高低字節順序調整功能,支持穿行和并行的BOOT/POST碼功能,160腳PQFP封裝.
DSP部分選用TI公司的TMS320C6201.TMS320C6201有32位的外部存儲接口EMIF,為CPU訪(fǎng)問(wèn)外圍設備提供了無(wú)縫接口.為了便于多信道數字信號處理,TMS320C6201配備了多信道帶緩沖能力的串口McBSP.McBSP的功能非常強大,除具有一般DSP串口功能之外,還可以支持T1/E1、ST-BUS、IOM2、SPI、IIS等不同標準.TMS32C6201提供的16位主機接口(HPI)使得主機設備可以直接訪(fǎng)問(wèn)DSP的存儲空間.通過(guò)內部或外部存儲空間,主機可以與DSP交換信息,也可以利用HPI直接訪(fǎng)問(wèn)映射進(jìn)存儲空間的外圍設備.TMS320C6201的DMA控制器有四個(gè)獨立的可編程通道,可以同時(shí)進(jìn)行四種不同的DMA操作.
4 OFDM在DSP上的軟件實(shí)現
調制部分的子程序被系統調用前,發(fā)送的數據已裝入數據存儲器.子程序被調用時(shí),數據區的首地址以及長(cháng)度被作為入口參數傳遞給子程序.程序執行時(shí)首先進(jìn)行一系列的配置工作,如配置DSP片內外設以及數模轉換器的各種參數等.之后,串口中斷產(chǎn)生,中斷服務(wù)程序自動(dòng)依次讀取發(fā)送存儲器中的內容,經(jīng)串口輸出給數模轉換器.然后程序從數據存儲區讀取一幀數據,并行放入IFFT工作區的相應位置,隨后進(jìn)行IFFT以及加入循環(huán)前綴(即復制數據的后若干位插入到數據的前段).所得數據存入發(fā)送存儲器以便中斷服務(wù)程序將其輸出.
5 FFT在TMS320C6201上的優(yōu)化算法
表1給出256點(diǎn)Radix2FFT和Radix4FFT在TMS320C6201上所需的指令周期,以及在不同的工作頻率下完成FFT所需的時(shí)間. 由表1可以看出,在TMS320C6201上采用Raidx4算法比采用Radix2算法更加高效.并且,為了滿(mǎn)足系統需求,即在17.07μs之內完成256個(gè)復數點(diǎn)的FFT運算,TMS320C6201必須采用200MHz的工作頻率.
為使代碼達到最大效率,程序將盡可能將指令安排為并行執行.為使指令并行操作,程序確定指令間的相關(guān)性,即一條指令必須發(fā)生在另一條指令之后.根據TMS320C6201的數據通路和流水線(xiàn)工作方式,在此給出一種高效實(shí)現16點(diǎn)Radix4FFT的方法.其基本思想是分解傳統的FFT蝶型算法循環(huán)體,將其分別展開(kāi)在A(yíng)、B通路內計算兩個(gè)FFT蝶型算法.每個(gè)蝶型算法分別只分配自己這一側的寄存器組和功能單元.這樣在循環(huán)體內兩個(gè)蝶型算法是完全不相關(guān)的,能夠并行執行.下面給出基于C.S.Burrus和T.W.Parks的Radix4FFT算法的優(yōu)化算法的代碼實(shí)現.
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;jwb1=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
}
}
評論