BÁO CÁO TỐT NGHIỆP

Báo cáo

Hệ thống thu phát OFDM

MỤC LỤC

BÁO CÁO ....................................................................................................................... 3

1. Sơ đồ khối hệ thống ..................................................................................................... 3

2. Bên phát ...................................................................................................................... 4

3. QAMtrans(unsigned char * QamSymbolIn, CCHAR * QamSymbolOut, int

QamsymbolLengh,int QamLevel) -> thực hiện ánh xạ QAM ........................................... 4

4. OrderPilotSymbol(PilotSymbolOrder, NullLow, NullHigh, IFFTLengh) ..................... 5

5. OrderDataSymhol(QamSymbolOut, ............. DataSymbolOrder, IFFTLengh, NullLow,

NullHigh) 5

6. Bên thu ........................................................................................................................ 6

BÁO CÁO

Hệ thống thu phát OFDM sử dụng công nghệ DSP

Sơ đồ khối hệ thống

(Phần code lấy ở bản 28/2 nhận chính xác 100% của các anh K50)

Bên phát

a. Data2symbol(unsigned char * DataTrans, unsigned char * QamSymbolIn, int

NumDataTrans, int QamLevel):

NumDataTrans = 16

- Input: Mảng Char 8 bit (16 phần tử)

- Output: Mảng đầu vào QAM (32 phần tử)

Cách thực hiện:

Input[k] gồm 8 bit vd: 10011010

 Output[2k]= 1010 (lấy 4 bit thấp bằng cách lấy input[k] AND 00001111)

 Output[2k+1] = 1001 (Lấy 4 bit cao bằng cách lấy kết quả của input[k] AND

11110000 đem dịch phải)

 2 phần tử liên tiếp (output[k] & output[2k+1] chứa 1 kí tự kiểu Char)

QAMtrans(unsigned char * QamSymbolIn, CCHAR * QamSymbolOut, int

QamsymbolLengh,int QamLevel) -> thực hiện ánh xạ QAM

- Input: Mảng QamSymbolIn gồm 32 phần tử 4bit  giá trị từ 0 -> 15  kiểu char

không dấu.

- Output: Mảng QamSymbolOut gồm 32 phần tử kiểu Cchar (Số phức ứng với các

điểm trong chòm sao QAM)

OrderPilotSymbol(PilotSymbolOrder, NullLow, NullHigh, IFFTLengh)

IFFTLength =64

 Tạo mảng PilotSymbolOrder gồm 64 phần tử kiểu Cint tạo thành 1 symbol Pilot

trước khi biến đổi IFFT.

 Mảng này không có NullLow & NullHigh

OrderDataSymhol(QamSymbolOut, DataSymbolOrder, IFFTLengh, NullLow,

NullHigh)

- Đầu tiên khởi tạo mảng 64 phần tử kiểu Cint gồm toàn phần tử {0,0} để đưa các

phần tử NullLow & NullHigh vào vị trí

- Sau đó chèn Data vào các vị trí còn lại

Null Low Data NullHigh NullHigh Data NullLow

1 16 15 15 16 1

Tạo thành mảng DataSymbolOrder kiểu CIn chứa data trước khi đưa vào biến đổi

IFFT

b. IFFT

- Đầu vào: Mảng PilotSymbolOrder & mảng DataSymbolOrder kiểu CIN (64 phần

tử)

- Đầu ra: Tương ứng là mảng OutIFFTPilot & mảng OutIFFTData kiểu CFLOAT

(64 phần tử)

c. InsertGard

- Đầu vào: 64 phần tử mảng OutIFFTPilot or OutIFFTData.

- Copy 32 phần tử cuối chèn vào phía đầu của mảng.

- Đầu ra: 96 phần tử mảng SymbolOutPilot or SymbolOutData nnnbbbhhh.

d. FramePack(SymbolOutPilot, SymbolOutData, gBufferXmtPong,

NumDataofFrame, IFFTLengh + GardLengh)

 Thực hiện đóng gói khung

- Lần lượt 3 symbol (SymbolOutPilot – SymbolOutData – SymbolOutPilot) sẽ được

đưa vào nửa trước bộ đệm gBufferXmtPing (hoặc gBufferXmtPong).

- Khi đó mỗi phần tử của symbolOutPilot & symbolOutData sẽ được tách thành

thực ảo rồi nhân với 10000 và làm tròn trước khi đưa vào bộ đệm.

- Nửa bộ đệm còn lại là bản copy của nửa bộ đệm phía trước

 Như vậy một MultiFrame sẽ bao gồm 2 Frame giống nhau.

Bên thu

a. SynFrameInReceiver(Int16 * DoubleFrame, int FFTLengh, int GardLengh, int

NumDataofFrame)  Trả về điểm đồng bộ kiểu int

o Đồng bộ thô  Tìm khoảng chứa điểm đồng bộ

Chia dữ liệu nhận được ở bộ đệm bên thu thành các khối có chiều dài Lsymbol/2.

i=0;

MinSqr[0..5]=0

MinSqr[i]= ∑((A[i+2]-A[i])2)

i=i+1

Để đơn giản, ta coi các khối đó là một phần tử của mảng A

i<6

T

Cho i: 0 -> 5 tìm min của Minsqr  i+2 là cửa sổ chứa điểm bắt đầu khung;

TempPoint= (i+2)*ShiftLength

F

i=0;

i=0; MinSqr[0..5]=0;

MinSqr[0..5]=0;

o Đồng bộ tinh  Tìm điểm đồng bộ chính xác

dịch TempPoint đi 1 Frame (+96*3*2)

T

Dịch=False

Dich=True

TempPoint < độ dài 2 symbol (96*2*2)

Bằng Phương pháp Bình phương tối thiểu, So sánh mảng A với mảng B có độ dài đúng bằng 1 Frame với điểm đầu của mảng A trượt dần từ TempPoint đến TempPoint – L (hình vẽ)

 Tìm được SynPoint

Dich= True?

Dịch SynPoint ngược lại 1 khoảng đúng bằng 1 Frame (-96*3*2)

F

T

b. Getdata(Int16 * BufferIn, CFLOAT * OutSynchronuos, int iFrameTransLengh)

 Nhận dữ liệu từ bộ đệm ping/pong về bộ đệm chương trình

- Một khung đầy đủ sẽ được lưu vào Mảng OutSynchorous bao gồm 64*3 phần tử

kiểu CFLOAT (re,im)

BufferIn BufferIn[2k] BufferIn[2k+1] BufferIn[2K+2] BufferIn[2k+3] …

Kiểu int int int int …

Giá trị a b c d …

OutSynchronous OutSynchronous[k] OutSynchronous[k+1] …

Kiểu CFLOAT CFLOAT …

Giá trị {a/10000,b/10000} {a/10000,b/10000} …

c. RemoveGardLengh(FrameInReceiver, FrameWithoutGard, FFTLengh,

GardLengh, NumDataofFrame)

- Input: FrameInReceiver :3*96 phần tử kiểu CFLOAT

- Output:FrameWithoutGard: 3*64 phần tử kiểu CFLOAT

d. FrameFFT(FrameWithoutGard, WnFFT, FFTLengh, FFTExp,

NumDataofFrame)

- Input: FrameWithoutGard 3*64 phần tử kiểu CFLOAT

- Output: FrameWithoutGard 3*64 phần tử kiểu CFLOAT

e. ChannelEstimation(CFLOAT * FrameWithoutGard, CFLOAT * EstimationOut,

int FFTLengh, int NumDataofFrame, int NullLow, int NullHigh)

- Input: FrameWithoutGard 3*64 phần tử kiểu CFLOAT

- Output: EstimationOut 32 phần tử kiểu CFLOAT (64-2NullLow-2NullHigh)

f. QamInvert(EstimationOut, QamOut, NumDataofFrame*(FFTLengh-NullLow-

NullHigh));

- Input: 32 phần tử kiểu CFLOAT

- Output: 32 phần tử kiểu int

 Thực hiện bằng việc ánh xạ ngược từ đồ thị QAM

g. Symbol2Data( QamOut, DataOut, NumDataofFrame*(FFTLengh-NullLow-

NullHigh)

- Input: 32 phần tử kiểu int

- Output: 16 phần tử kiểu int

 Ghép 2 phần tử kiểu int liên tiếp tạo thành 1 phần tử kiểu int mới ứng với 1 kí tự

char 8 bit trong bảng mã ASCII