Xem mẫu
- 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.
Để đơn giản, ta coi các khối đó là một phần tử của mảng A
i=0;
MinSqr[0..5]=0
MinSqr[i]= ∑((A[i+2]-A[i])2)
i=i+1
i 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
o Đồng bộ tinh Tìm điểm đồng bộ chính xác
i=0;
i=0;
MinSqr[0..5]=0;
MinSqr[0..5]=0;
- TempPoint < dịch TempPoint đi 1
độ dài 2 Frame (+96*3*2)
Dịch=False symbol T
(96*2*2) Dich=True
F
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
Dịch SynPoint ngược
Dich= lại 1 khoảng đúng bằng
True? 1 Frame (-96*3*2)
- 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
nguon tai.lieu . vn