Nulllow và Nullhigh

Một phần của tài liệu Xây dựng hệ thống máy phát dữ liệu vô tuyến sử dụng công nghệ OFDM cho phát thanh số và truyền dữ liệu (Trang 26)

Việc chèn thêm chuỗi NULLLOW để loại bỏ tín hiệu một chiều trong hệ thống và để trách nhiễu do các hệ thống lân cận khi truyền dẫn.

Trong luận văn chọn NumberNullLow=1, NumberNullHigh= 15 Cấu trúc một ký tự truyền như sau:

Hình 2.7 Cấu trúc của một ký tự 2.3.4 Cấu trúc khung và khung truyền

Để bộ đệm bên thu chắc chắn sẽ nhận một khung hoàn chỉnh thì bộ đệm bên phát cần phát đi đa khung gồm tối thiểu hai khung liên tiếp. Chọn đa khung bên phát gồm hai khung liên tiếp.

Mặt khác, chọn cấu trúc mỗi khung gồm hai kí tự OFDM ẫn đường (S_pilot) hai đầu để phục vụ cho mục đích đồng bộ.

Cấu trúc một khung và cấu trúc đa khung OFDM bên phát là:

S_pilot S_data S_pilot S_pilot S_data S_pilot

Đa khung

Khung OFDM

2.4 Xây dựng khối phát OFDM

Hệ thống OFDM có rất nhiều khối chức năng phức tạp, song trong giai đoạn thử nghiệm trên bo mạch, luận văn chỉ thực hiện với những khối cơ bản, các chức năng khác của hệ thống sẽ dần được đưa vào trong các giai đoạn phát triển sau này. Trong giai đoạn này, luận văn thực hiện các chức năng chính là xử lý tín hiệu và khối phát tín hiệu vô tuyến:

Sơ đồ tham chiếu

Lý thuyết về điều chế OFDM đã chứng minh rằng, bộ điều chế OFDM có thể được thực hiện dễ dàng thông qua phép biến đổi IDFT. Phép biến đổi này có thể được thực hiện nhanh bằng thuật toán IFFT.

B iế n đ ổ i tư ơ n g t ự s ố T á c h k h o ả n g b ả o v ệ B iế n đ ổ i n ố i ti ế p / s o n g s o n g F F T G iả i m ã B iế n đ ổ i s o n g s o n g / n ố i ti ế p

u(t) u(lta) u’(lta)

k,+L k,n k,-L a^k,+L a^k, n a^k,-L

Hình 2.9 Sơ đồ khối bộ điều chế [2]

Trong sơ đồ này, luồng dữ liệu vào là dữ liệu số {al} được đưa vào bộ phân chia nối tiếp song song. Một luồng ban đầu được chia thành n luồng con, n có thể chọn là một số lẻ, n = 2L + 1...Tốc độ của mỗi luồng con rõ ràng nhỏ hơn tốc độ của luồng ban đầu n lần. Các luồng con như ta thấy được đánh số từ -L đến 0 và đến +L. Có 2L + 1 luồng con tất cả: ai, -L, ..., ai, n,..., ai, +L.

Mỗi luồng con sẽ được mã hoá theo những phương pháp thông thường chẳng hạn QAM, hay PSK. Tất cả các luồng sau khi mã hoá bao gồm n điểm được đưa vào bộ biến đổi IDFT thực hiện bằng thuật toán IFFT.

Số đầu ra của bộ biến đổi có thể không bằng n, mà bằng số điểm lấy IFFT, thường bằng luỹ thừa của 2 như 4, 16, 64, 128, 256. Số điểm lấy IFFT càng lớn thì độ phức tạp thuật toán tăng lên. Đầu ra của bộ biến đổi lại được ghép lại thành một đầu ra duy nhất thông qua bộ ghép song song nối tiếp.

Đầu ra nối tiếp được chèn khoảng bảo vệ (một kỹ thuật của điều chế OFDM nhằm loại bỏ hoàn toàn nhiễu ISI). Sau đó, tín hiệu số OFDM được chuyển đổi thành tín hiệu tương tự để có thể tiếp tục truyền đi.

2.4.1 Đặc tả các hàm chức năng của hệ thống

Dưới đây là nguyên mẫu của các hàm xử lý và các dữ liệu sử dụng:

Hình 2.10 Các hàm xử lý trong khối phát OFDM

Các hàm xử lý trong phần này bao gồm:

- Hàm chuyển đổi dòng bít vào thành dòng bít giả ngẫu nhiên - Hàm điều chế QAM 16

- Hàm tính biến đổi FFT thuận và ngược

Vị trí của các hàm này trong hệ thống xử lý như trong hình 2.10. Để cho tiện, các hàm xử lý này sẽ được mô tả dần chức năng xử lý trong quá trình kiểm thử. .

Hàm Data2Symbol

Hàm này thực hiện tách dữ liệu đầu vào thành các chuỗi 4 bit phục vụ ánh xạ QAM. Với mỗi byte của mảng vào lần lượt lấy 4 bit thấp và 4 bit cao của byte đó đưa vào 2 phần tử liên tiếp trong mảng đầu ra QamSymbolIn bằng cách thực hiện phép toán AND mỗi byte này với 15 (giá trị nhị phân 00001111) và 240 (giá trị nhị phân 11110000) kết hợp với phép dịch bit.

Hàm Data2Symbol

for (k=0; k<NumDataTrans;k++) {

// phan tu dung trc chua 4 bit thap

*(QamSymbolIn+2*k) = *(DataTrans+k)&15;

// phan tu dung sau chua 4 bit cao Temp = *(DataTrans+k)& 240;

// -> hai phan tu lien tiep chua 1 data }

Hình 2.11 Hàm Data2Symbol

Có thể nói, 4 bit thấp của mỗi byte của mảng vào được chuyển thành phần thực tương ứng của ký tự, còn 4 bit cao chuyển thành phần ảo.

Như vậy sau khi chuyển đổi dòng bit thành các ký tự thì giá trị của ký tự nằm trong khoảng từ 0 đến 15 (Do các phép toán là 4 bit). Các giá trị này được coi là chỉ số và được

ánh xạ trực tiếp sang các mẫu tín hiệu QAM. Như vậy bảng QAM được sử dụng trong hàm tiếp theo sẽ có độ dài 16 phần tử. Chú ý nhận được 2 chỉ số, một cho phần thực và một cho phần ảo.

Trong quá trình ánh xạ, có sự xen kẽ về tần số: các chỉ số thực sẽ được ánh xạ đến đoạn đầu của mảng ra (tần số thấp), còn chỉ số ảo lại được ánh xạ đến phần sau (tần số cao). Ghép xen là một kỹ thuật trong truyền thông để chống lại các lỗi cụm.

Hàm QamTrans

Mảng vào là một mảng chỉ số phức mà phần thực và phần ảo của chỉ số nằm trong khoảng 0 đến 15 (ở đây vì ta sử dụng 16-QAM). Các chỉ số này sẽ được ánh xạ thành mẫu QAM tương ứng, chỉ số thực ánh xạ sang mẫu QAM ở nửa trái của mảng ra chỉ số ảo ánh xạ sang các mẫu QAM ở nửa phải. Đây chính là một kỹ thuật xen kẽ được sử dụng trong truyền thông. Giả sử mảng vào có n phần tử (chỉ số phức), thì nó chiếm 2n vị trí trong mảng ra. Bảng giá trị QAM CCHAR QamTable[16] = { { 3, 3}, { 3, 1}, { 3,-3}, { 3,-1}, {-3, 3}, {-3, 1}, {-3,-3}, {-3,-1}, { 1, 3}, { 1, 1}, { 1,-3}, { 1,-1}, {-1, 3}, {-1, 1}, {-1,-3}, {-1,-1} }; Hình 2.12 Bảng giá trị QAM

Giải thuật tính FFT thuận và ngượ

Giải thuật tính FFT hay IFFT thực ra là như nhau chỉ khác nhau ở việc sử dụng bảng lượng giác dành cho phép biến đổi thuận hay là ngược. Trong giải thuật này, mảng vào có độ dài FFT = 16, sau khi thực hiện đảo chỉ số sẽ đưa vào biến đổi nhanh FFT sử dụng thuật toán cánh bướm.

Với bộ dữ liệu vào

CFLOAT inp_buf[] ={{0.0, 0.0},{1.0, 3.0},{3.0,3.0},{-3.0,-1.0} ,{3.0,3.0},{-3.0,1.0},{1.0,-3.0},{0.0,0.0}

,{0.0,0.0},{-1.0,-1.0},{-1.0,-1.0},{3.0,1.0} ,{-3.0,-1.0},{1.0,1.0},{1.0,3.0},{0.0,0.0}};

Kết quả sau khi thực hiện

Inp_buf=[(0.12, 0.50), (0.10, 0.64), (-0.03, -0.03), (0.04, -0.07) ,(-0.50, -0.12), (-0.95, -0.10), (0.03, -0.03), (0.29, -0.82) ,(0.37, 0.00), (-0.07, 1.34), (-0.21, -0.21), (0.27, -1.20) ,(0.00, 0.12), (-0.07, -0.38), (0.21, -0.21), (0.38, 0.60)]

Để kiểm tra tính chính xác của giải thuật không thể nhẩm tính kết quả bằng tay vì phép tính IFFT khá cồng kềnh. Thay vào đó luận văn sử dụng hàm có sẵn đáng tin cậy như của Matlab để kiểm tra. Thực hiện dòng lệnh sau để kiểm tra:

>> X=[0+0i 1+3i 3+3i -3-i 3+3i -3+i 1-3i 0 0 -1-i -1-i 3+i -3-i 1+i 1+3i 0]; >> Y=ifft(X)

Kết quả nhận được là phù hợp chứng tỏ tính đúng đắn của giải thuật FFT đã cài đặt.

2.4.2 Cấu trúc dữ liệu của khối phát

Dữ liệu được phát liên tục do đó khi nhận được dữ liệu bên thu không chỉ khôi phục dữ liệu mà còn phải nhận biết điểm bắt đầu dữ liệu và kết thúc dữ liệu để đóng gói lại khối dữ liệu. Do đó yêu cầu đối với truyền nhận dữ liệu là phía phát ngoài việc điều chế dữ liệu để gửi đi cần có những ký tự đặc biệt giúp phía thu sau nhận diện được điểm đầu dữ liệu và kết thúc dữ liệu. Vì vậy, cần có một cấu trúc phát dữ liệu thống nhất giữa bên thu và bên phát.

Dựa vào bảng mã ASCII luận văn đã lựa chọn những kí tự đặc biệt để đưa vào khung đầu dữ liệu và cuối dữ liệu để phân biệt với dữ liệu trong khối dữ liệu truyền. Trong chương trình hiện tại sử dụng 2 ký tự ở vị trí 200 và 225 trong bảng mã ASCII.

Cơ chế gửi dữ liệu:

Trước tiên, chương trình gửi đi 10 khung dữ liệu OFDM chứa các ký tự Data

(S_Data) là các kí tự 225 để thông báo cho bên nhận biết chuẩn bị truyền dữ liệu trong khối gửi. Tiếp đó, chương trình gửi các khung OFDM chứa các S_Data là dữ liệu trong khối dữ liệu gửi. Sau khi gửi dữ liệu cuối cùng, chương trình sẽ phát các khung OFDM chứa các S_Data là các kí tự 200 để thông báo cho bên nhận biết đã truyền hết dữ liệu.

Thực hiện trong chương trình:

Biến FilePos được dùng để kiểm soát quá trình phát file và tạo cấu trúc phát file. FilePos = 0 gửi khung xác định đầu file.

for (i= 0; i< 16; i++) {

DataTrans[i]= 225; // toan bo du lieu phat se la 225 }

FilePos = 1 gửi dữ liệu trong file:

if ( (NumSend*16 + 16) > FileLengh) {

for (i= 0; i< FileLengh - NumSend*16; i++) {

DataTrans[i]= FileData[NumSend*16+i]; }

for (i= FileLengh - NumSend*16; i< 16; i++) {

DataTrans[i] = 200; }

FilePos = 2; }

FilePos = 2 gửi khung xác định cuối file:

for (i= 0; i< 16; i++) {

DataTrans[i]= 200;// toan bo du lieu phat se la 200 }

2.5 Truyền thông thời gian thực với RTDX

Bo mạch nhúng DSP được dùng để xử lý dữ liệu với tốc độ cao. Dữ liệu được đẩy xuống bo mạch có nhiều cách. Ví dụ từ một bo mạch khác, từ một thiết bị cảm biến, từ LINE IN, LINE OUT…Và một cách hay dùng nhất là PC. Thông qua PC chúng ta có thể

nạp chương trình, đẩy dữ liệu xuống hay thiết lập các thông số cấu hình. Dữ liệu giao tiếp giữa PC (chức năng như một Host) và bo mạch DSP (chức năng là một target) được

thông qua chuẩn RTDX. Sau đây sẽ mô tả chi tiết cách xây dựng các ứng dụng sử dụng truyền thông giữa host và target.

2.5.1 Giới thiệu chung về RTDX

RTDX cho phép truyền dữ liệu giữa thiết bị DSP và máy tính trong các ứng dụng của DSP. Quá trình truyền thông giữa bo mạch DSP và máy tính được thực hiện như sau:

Hình 2.13 Quá trình truyền thông giữa bo mạch DSP và máy tính

Trong quá trình truyền dữ liệu từ bo mạch tới PC, một kênh “output” sẽ được thiết lập trên bo mạch. Khi dữ liệu được ghi tới kênh này thì thực chất là nó được ghi tới ghi tới một bộ đệm được thiết lập trong thư viện RTDX của bo mạch. Dữ liệu từ bộ đệm này được gửi đến PC bởi thư viện RTDX thông qua giao tiếp JTAG.

Thư viện RTDX trên máy tính nhận dữ liệu này từ giao diện JTAG và ghi nó vào bộ nhớ đệm hoặc một tệp nào đó. Sau đó các chương trình ứng dụng trên máy tính có thế sử dụng, hiển thị và xử lý dữ liệu trong bộ đệm này thông qua thư viện RTDX host.

Ngược lại, để nhận dữ liệu từ PC, bo mạch phải mở một kênh đầu vào. Bo mạch yêu cầu nhận dữ liệu từ kênh đầu vào. Yêu cầu này được ghi vào bộ đệm và gửi đến máy tính thông qua giao tiếp JTAG.

Khi thư viện RTDX trên máy tính nhận được yêu cầu đọc dữ liệu từ bo mạch, chương trình ứng dụng trên máy tính sẽ ghi dữ liệu cần gửi vào bộ nhớ đệm và thư viện RTDX trên máy tính sẽ gửi dữ liệu đến bo mạch thông qua giao tiếp JTAG.

2.5.2 Chương trình ứng dụng trên bo mạch

2.5.2.1 Nhận ữ liệu

RTDX nhận dữ liệu từ ứng dụng trên bo mạch theo 2 dạng:

 Dạng liên tục (Continuous):

o Dữ liệu sẽ được ghi tới bộ đệm một lần và liên tục viết tới ứng dụng bo mạch.

o Kiểu này thường được sử dụng với các chương trình ứng dụng liên tục gửi và nhận dữ liệu hoặc không cần lưu dữ liệu tới file.

 Dạng không liên tục (Non-Continuous):

o Được dùng để viết dữ liệu tới một tệp dữ liệu trên PC. Nó có thể được dùng để viết một lượng dữ liệu không giới hạn tới tệp dữ liệu đó.

2.5.2.2 Cấu hình RTD

Bước 1: Vào Tool → RTDX→Configuration Control như hình dưới

Bước 2 : Vào mụ Configure khi đó ta thấy cửa sổ RTDX Control như hình dưới:

Hình 2.15 Thay đổi các thông số RTDX

Có thể chọn các thông số Buffer SizeNumber of Buffer cho phù hợp với hệ thống. Do trong chương trình luận văn viết dữ liệu tới một tệp dữ liệu lên “host” nên dùng kiểu

Continuous Mode như hình trên

Sau đó Chọn Apply → OK

Bước 3: Mở RTDX bằng cách chọn vào như hình dưới

Hình 2.16 Cài đặt và khởi động RTDX

Để thay đổi các cài đặt phải chắc chắn rằng RTDX đã được vô hiệu hóa. Chọn trên cửa sổ và chọn Property Page. Ở đây bạn có thể lựa chọn kích thước của bộ đệm.

2.5.2.3 C ấu tr C làm việ với RTD

Các bước cần thiết để tạo vị trí trong ứng dụng trên bo mạch cho việc nhận và gửi dữ liệu từ PC:

 Tham chiếu tới file header rtdx.h.

 Công bố kênh vào và ra toàn cục (input, output) cho việc truyền và nhận dữ liệu. Các kênh là các cấu trúc dữ liệu được công bố trong các lệnh sau. Kênh có thể chọn tên là

input và có thể có tên khác.

RTDX_CreateInputChannel( name ); RTDX_CreateOutputChannel( name );

 Khởi chạy ứng dụng trên bo mạch. Có một cặp được khởi chạy trên bo mạch. Nếu sử dụng công cụ DSP/BIOS configuration tool thì cả hai sẽ tự động xảy ra. Mặt khác

mục chọn thứ hai sẽ chi xảy ra sau khi hàm main() này thoát.

- Một sự kiện được chạy ở ứng dụng trên bo mạch định kì để gọi chức năng RTDX_poll để giữ dòng dữ liệu giữ PC và bo mạch. Nếu công cụ cấu hình dùng để thiết lập nó lên cho bạn. Ngắt cứng HWI HWI_RESERVED1 được sử dụng để gọi chức năng RTDX_poll trên chu kì cơ sở.

- Trên C6x RTDX sử dụng ngắt. Do đó NMI và các ngắt toàn cục phải được cho phép.

 Cho phép kênh đọc và ghi dữ liệu sử dụng các hàm sau:

RTDX_enableInput(&name) RTDX_enableOutput(&name)

 Đọc và viết kênh RTDX sử dụng một trong các hàm sau:

RTDX_read(&name, &data, sizeof(data)) RTDX_readNB(&name, &data, sizeof(data)) RTDX_write(&name, &data, sizeof(data))

RTDX_read() [7]

 Cú pháp:

int RTDX_read( RTDX_inputChannel *ichan, void *buffer, int bsize );

 Các tham số:

ichan: kênh đầu vào dữ liệu

buffer: con trỏ tới bộ đệm sẽ nhận dữ liệu

bsize: kích thước của bộ đệm trong mỗi đơn vị địa chỉ

 Giá trị trả về:

> 0 Số đơn vị địa chỉ dữ liệu đã được gửi đến bộ đệm. 0 (zero) Lỗi. Không thể gửi yêu cầu đọc vì bộ đệm target đã đầy

 Khi RTDX_read được dùng, ứng dụng trên target thông báo cho thư viện RTDX host rằng nó đã sẵn sàng nhận dữ liệu và chờ trong vòng lặp cho đến khi việc đọc hoàn thành.

 Sử dụng khi đọc dữ liệu dạng khối.

RTDX_readNB():

 Khi RTDX_readNB được dùng, ứng dụng trên target thông báo cho thư

viện RTDX host rằng nó đã sẵn sàng nhận dữ liệu nhưng không chờ.

 Sử dụng cùng với RTDX_channelBusy và RTDX_sizeofInput để kiểm

tra kênh truyền thực tế đang được dùng hay là không.

 Sử dụng khi đọc các dữ liệu không ở dạng khối.

RTDX_write(): Ghi dữ liệu lên kênh truyền

 Vô hiệu hóa kênh sau khi dùng.

RTDX_disableInput RTDX_disableOutput

Chu trình này sẽ được thể hiện trong đoạn code sau trong đó ngắt mềm SWI sẽ được thiết lập để truyền dữ liệu tới PC. Trong ví dụ này các số tự nhiên sẽ được gửi tới PC một lần. Thừa nhận rằng công cụ cấu hình được sử dụng để thiết lập DSP/Bios và do đó target không cần phải khởi chạy.

Hàm gửi dữ liệu tới PC

/* create a global output channel */ RTDX_CreateOutputChannel( ochan );

void funSWI() {

int data = 10; /* data to send to host */ int status;

/* enable the output channel */ RTDX_enableOutput( &ochan );

/* send the data to the host */

status = RTDX_write( &ochan, &data, sizeof(data) );

/* check the status of the write operation */ if ( status == 0 ) {

puts("ERROR: RTDX_write failed!\n" ); exit(-1 );

}

RTDX_disableOutput( &ochan ); }

Hình 2.17 Hàm gửi dữ liệu tới PC

Một phần của tài liệu Xây dựng hệ thống máy phát dữ liệu vô tuyến sử dụng công nghệ OFDM cho phát thanh số và truyền dữ liệu (Trang 26)

Tải bản đầy đủ (PDF)

(74 trang)