Nguyễn Hạnh
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)
1
Nguyễn Hạnh
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
2
Nguyễn Hạnh
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
1
Data
16
NullHigh
15
NullHigh
15
Data
16
NullLow
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.
3
Nguyễn Hạnh
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. Để đơn giản, ta coi các khối đó là một phần tử của mảng A
4
i=0;
MinSqr[0 5]=0;
i=0;
MinSqr[0 5]=0;
i=0;
MinSqr[0 5]=0;
MinSqr[i]= ∑((A[i+2]-A[i])
2
)
i=i+1
Nguyễn Hạnh
T
F
o Đồng bộ tinh Tìm điểm đồng bộ chính xác
T
F
5
i<6
i<6
MinSqr[i]= ∑((A[i+2]-A[i])
2
)
i=i+1
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
Dịch=False
dịch TempPoint đi
1 Frame (+96*3*2)
Dich=True
TempPoint <
độ dài 2
symbol
(96*2*2)
TempPoint <
độ dài 2
symbol
(96*2*2)
Nguyễn Hạnh
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)
BufferI
n
BufferIn[2
k]
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)
6
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?
Dich=
True?
Dịch SynPoint ngược
lại 1 khoảng đúng bằng
1 Frame (-96*3*2)
Nguyễn Hạnh
- 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)
7
Nguyễn Hạnh
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
8