1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo thí nghiệm xử lý số bài 4 pot

17 2K 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 2,08 MB

Nội dung

Tùy vào loại điều chế PAM, một mặt nạ mask thích hợp được sử dụng.. Các mẫu nhập vào sẽ được AND với mặt nạ và dịch với số lần thích hợp đến hết chiều dài chuỗi.. Tương ứng với mỗi ký h

Trang 1

BÀI 4: THỰC HIỆN MỘT SỐ MẠCH ĐIỀU CHẾ TRÊN KIT C6713

DSK

I- Thực hiện điều chế PAM trên kit C6713 DSK

Giải thuật điều chế:

Mỗi mẫu vào điều chế gồm 16 bits Tùy vào loại điều chế PAM, một mặt nạ (mask)

thích hợp được sử dụng Các mẫu nhập vào sẽ được AND với mặt nạ và dịch với số lần thích hợp đến hết chiều dài chuỗi Tương ứng với mỗi ký hiệu (symbol) trên 1 mẫu nhập vào và loại điều chế ta có mức điện áp khác nhau, để dạng sóng xuất sau khi ra bộ A/D có dạng sóng vuông, mỗi mức sẽ được xuất ra 12 lần trước khi chuyển sang symbol kế tiếp Sau đây chúng ta sẽ đi vào cụ thể từng loại điều chế

1 Điều chế PAM 4 mức

- Cấp nguồn điện cho kit và chạy chương trình CCS trên máy tính

- Mở Project PAM.pjt ở folder C:\Program Files\CCStudio_v3.1\MyProjects\PAM4

- Trong cửa sổ File View, mở tập tin PAM4.c, nội dung tập tin này như sau:

// PAM

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Initialization:

int i_PAM;

int j_PAM;

int k;

int masked_value, output;

int data_4PAM[4] = {0x7FFF, 0x2AAA, -0x2AAB, -0x8000};//data table for 4-PAM MOD int out_buffer[256];

int i=0;

interrupt void c_int11() //interrupt service routine

{

int sample_data; //4-PAM Modulator: Assigns sampled data coming from an input

//source to 4 predetermined voltage levels.

if (i_PAM==96) //new input is taken once every 96 samples (8 shifts x 12 repeated outputs)

sample_data = input_sample(); //inputs data

i_PAM=0;

}

masked_value = sample_data & 0x0003; //masks input sample as 2-bit segments output = data_4PAM[masked_value]; //gets corresponding level from table output_sample(output); //outputs corresponding voltage level 12 times out_buffer[i++] = output;

if (i==256)

i = 0;

1

2

3 4

Trang 2

j_PAM++; //repeated output counter

if (j_PAM==12) //checks if repetition is over

{

j_PAM=0;

sample_data = sample_data >> 2; //shifts input to mask next segment }

i_PAM++;

return;

}

void main()

{

i_PAM=0;

comm_intr(); //init DSK, codec, McBSP

while(1); //infinite loop

}

 Giải thích code:

+ Trong chương trình này hàm main() đặt giá trị biến i_PAM = 0 và khởi động kit Sau

đó sẽ thực hiện một vòng lặp vô hạn với lệnh while(1)

+ Khi có tín hiệu xung lấy mẫu (tần số 8Khz), ngắt 11 xảy ra và trình phục vụ ngắt

c_int11() được gọi Trong trình phục vụ ngắt này, dữ liệu vào được đọc vào biến

sample_data (bằng lệnh sample_data = input_sample(), ô chú thích số 3) Mẫu dữ liệu

này biểu diễn ở dạng số nguyên 16 bits có dấu

+ Do ở đây thực hiện điều chế PAM 4 mức, mà để biểu diễn được 4 mức thì cần 2 bit

Do đó mẫu vào sẽ được chia làm 8 ký hiệu (symbol), mỗi ký hiệu 2 bit Để thực hiện

việc chia này, mẫu dữ liệu được AND với mặt nạ 0x0003 (ô chú thích số 4 )để lấy 2 bit

LSB cảu mẫu dữ liệu 2 bit này được ánh xạ thành 1 trong 4 mức điện áp theo bảng sau:

Bảng tra 4 mức:

Khối ký hiệu Mức điện áp (dạng hex) Mức điện áp (dạng thập phân)

4 giá trị này được khai báo ở đầu chương trình (ô chú thích số 1) Mỗi symbol sẽ cho ra

1 mức điện áp Mỗi mức được xuất ra 12 lần trước khi chuyển sang mức ứng với symbol

kế tiếp Biến đếm j_PAM để đếm số lần xuất ra cho đủ 12 lần Như vậy ứng với mẫu vào 16 bit, ta có 8 symbol Mỗi symbol xuất 12 lần nên số lần xuất ra ứng với mỗi mẫu

là 8x12 = 96 được thể hiện bởi biến đếm i_PAM (ô chú thích số 2).

- Biên dịch và nạp chương trình lên kit

- Kiểm tra kết quả trên Plot của CCS

5

Trang 3

Việc sử dụng máy phát sóng rất khó để kiểm chứng kết quả nên ta sẽ gán cho

sample_data một giá trị cụ thể 16 bit (dạng số HEX, ô chú thích số 3).

Lưu ý: thông số lựa chọn cho việc thể hiện dạng sóng như sau:

sample_data = 0x00E4 = 0b00 00 00 00 11 10 01 00

Trang 4

sample_data = 0x001B = 0b00 00 00 00 00 01 10 11

sample_data = 0x1BE4 = 0b00 01 10 11 11 10 01 00

Nhận xét : Kết quả thu được đúng với lý thuyết, tương ứng với biên độ lớn nhất là 00, âm

nhất là 11.

Trang 5

2 Điều chế PAM 8 mức

- Thực hiện lại tương tự như PAM 4 mức

- Mở Project PAM.pjt ở folder C:\Program Files\CCStudio_v3.1\MyProjects\PAM4

- Sự khác biệt so với PAM 4 mức là mặt nạ, số bit dịch và bảng tra Đối với PAM 8,

bit có trọng số thấp nhất (LSB) của mẫu vào được loại bỏ để số bit còn lại (15) là bội của 3 Điều này gây tác động không đáng kể lên dạng sóng điều chế và dạng sóng khôi phục lại Do đó số lần xuất ra ứng với mỗi mẫu là (15/3)x12 = 60

Bảng tra 8 mức:

Khối ký hiệu Mức điện áp (dạng số Hex) Mức điện áp (dạng thập phân)

Sửa lại tập tin PAM4.c như sau:

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Initialization:

int i_PAM;

int j_PAM;

int k;

int masked_value, output;

int data_4PAM[8] = {0x7FFF, 0x5B6D, 0x36DB, 0x1249, -0x1249, -0x36DB, -0x5B6D, -0x7FFF};

int out_buffer[256];

int i=0;

interrupt void c_int11() //interrupt service routine

{

int sample_data;

if (i_PAM==60) //( 5 shifts x 12 repeated outputs = 60 samples)

{

sample_data = input_sample(); //inputs data

sample_data = sample_data >>1;

i_PAM=0;

j_PAM=0;

}

masked_value = sample_data & 0x0007;

output = data_4PAM[masked_value];

output_sample(output);

Trang 6

out_buffer[i++] = output;

if (i==256)

i = 0;

j_PAM++; //repeated output counter

if (j_PAM==12) //checks if repetition is over

{

j_PAM=0;

sample_data = sample_data >> 3;

}

i_PAM++;

return;

}

void main()

{

i_PAM=0;

comm_intr(); //init DSK, codec, McBSP

while(1); //infinite loop

}

- Biên dịch & nạp chương trình lên kit & kiểm tra kết quả tương tự PAM 4

sample_data = 0x8D10 = 0b100 011 010 001 000 0

Trang 7

sample_data = 0x72EF = 0b011 100 101 110 111 1

sample_data = 0x3546 = 0b001 101 010 100 011 0

Nhận xét: Kết quả thu được phù hợp với lý thuyết.

3 Điều chế PAM 16 mức

Trang 8

- Thực hiện lại tương tự như PAM 4 mức.

- Mở Project PAM.pjt ở folder C:\Program Files\CCStudio_v3.1\MyProjects\PAM4

- Điều chế PAM 16 mức, để biểu diễn cần 4 bit Do đó mỗi mẫu ta có 4 symbol(16/4),

số lần xuất ra ứng với mỗi mẫu là 4x12 = 48 Mặt nạ là 0x000F để lấy 4 bit LSB của mẫu dữ liệu

Bảng tra 16 mức:

Khối ký hiệu Mức điện áp (dạng số Hex) Mức điện áp (dạng thập phân)

Sửa lại tập tin PAM4.c như sau:

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Initialization:

int i_PAM;

int j_PAM;

int k;

int masked_value, output;

int data_4PAM[16] = {0x7FFF, 0x6EEE, 0x5DDD, 0x4CCC, 0x3BBB, 0x2AAA, 0x1999, 0x0888, -0x0889, -0x199A, -0x2AAB, -0x3BBC, -0x4CCD, -0x5DDE, -0x6EEF, -0x8000};

int out_buffer[256];

int i=0;

interrupt void c_int11() //interrupt service routine

{

int sample_data;

if (i_PAM==48) // (4 shifts x 12 repeated outputs)

{

sample_data = input_sample();

i_PAM=0;

Trang 9

j_PAM=0;

}

masked_value = sample_data & 0x000f; //masks input sample as 4-bit segments output = data_4PAM[masked_value];

output_sample(output);

out_buffer[i++] = output;

if (i==256)

i = 0;

j_PAM++; //repeated output counter

if (j_PAM==12) //checks if repetition is over

{

j_PAM=0;

sample_data = sample_data >> 4; //shifts input to mask next segment }

i_PAM++;

return;

}

void main()

{

i_PAM=0;

comm_intr(); //init DSK, codec, McBSP

while(1); //infinite loop

}

- Biên dịch & nạp chương trình lên kit & kiểm tra kết quả tương tự PAM 4

sample_data = 0x3210 = 0b0011 0010 0001 0000

sample_data = 0xFEDC = 0b1111 1110 1101 1100

Trang 10

sample_data = 0x9687 = 0b1001 0110 1000 0111

Nhận xét: Kết quả thu được phù hợp với lý thuyết.

Trang 11

II- Thực hiện mạch điều chế PSK trên kit C6713 DSK

Giải thuật điều chế:

Mỗi mẫu vào được thu và lưu vào trong một vị trí nhớ, chứa 16 bits Tùy theo kiểu điều chế PSK (2 hay 4 pha), một mặt nạ thích hợp được sử dụng Đối với BPSK, mỗi giá trị vào được chia ra làm 16 phần, mỗi thành phần 1 bit; đối với QPSK, mẫu vào được chia thành 8 dibits (mỗi dibit gồm 2 bit) Việc này đạt được bằng cách áp mặt

nạ tương ứng 0x0001 và 0x0003 lên mẫu vào Sau đó, mẫu sẽ được dịch phải 1 bit (BPSK) hoặc 2 bit (QPSK) và lặp lại cho hết chiều dài mẫu vào

Mỗi mẫu vào được biểu diễn bằng 16 bits Mỗi mẫu sẽ gồm 16 đoạn (với BPSK) và

8 đoạn (với QPSK) Do mỗi ký hiệu được truyền bởi 1 hình sine tạo theo phương pháp số bằng 4 điểm, cứ mỗi 64 mẫu ra (với BPSK) hoặc 32 mẫu ra (với QPSK), một mẫu vào được lấy vào

1 Điều chế BPSK

- Cấp nguồn điện cho kit và chạy chương trình CCS trên máy tính

- Mở Project BPSK.pjt ở folder C:\Program Files\CCStudio_v3.1\MyProjects\BPSK

- Trong cửa sổ File View, mở tập tin BPSK.c, nội dung tập tin này như sau:

//BPSK

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Initialization:

int i_BPSK;

int j_BPSK;

int k;

int masked_value, output;

int out_buffer[256];

int i=0;

//Data table for BPSK

int data_BPSK[2][4]={0, 1000, 0, -1000, //0 degree

0, -1000, 0, 1000}; //180 degree

interrupt void c_int11() //interrupt service routine

{

int sample_data;

if (i_BPSK==64) //determines when to get new input

{

sample_data = input_sample(); //inputs data

i_BPSK=0;

j_BPSK=0;

}

masked_value = sample_data & 0x0001; //masks input sample as 1-bit segments output = data_BPSK[masked_value][j_BPSK];//gets corresponding level from table output_sample(output*10);

out_buffer[i++] = output*10;

if (i==256)

i = 0;

j_BPSK++; //repeated output counter

if (j_BPSK==4) //checks if 1-bit segment was output

1

2

5

Trang 12

{

j_BPSK=0;

sample_data = sample_data >> 1;

}

i_BPSK++;

return;

}

void main()

{

i_BPSK=64;

j_BPSK=0;

comm_intr(); //init DSK, codec, McBSP

while(1); //infinite loop

}

 Giải thích code:

+ Hàm main() sẽ đặt 2 biến đếm i_BPSK = 64 và j_BPSK = 0, khởi động kit và bộ

codec rồi chạy một vòng lặp vô tận Khi có xung lấy mẫu, ngắt 11 được kích hoạt và

trình phục vụ ngắt c_int11() được gọi.

+ Trình phục vụ ngắt sẽ đọc một mẫu dữ liệu ở ngõ vào Mẫu này được biểu diễn bằng 16 bit Khi điều chế BPSK, mỗi symbol chỉ gồm 1 bit (để phân biệt 2 pha 0o và

180o chỉ cần 1 bit), do đó, mẫu vào sẽ được chia ra làm 16 symbol bằng cách sử

dụng mặt nạ 0x0001 để lấy bit LSB (ô chú thích số 4) Tùy bit này là 0 hay 1 mà

xuất ra dạng sóng sine có pha tương ứng

+ Trong chương trình trên, các giá trị được khai báo trong biến data_BPSK[2][4]

Đây la 1 mảng 2 chiều kích thước 2x4 thể hiện 2 dạng sóng sine: pha 0o là {0, 1000,

0, -1000} và pha 180o là {0, -1000, 0, 1000} (ô chú thích số1) Giá trị này thể hiện

biên độ của sóng sine trong 1 chu kỳ, tại thời điểm 0,T/4, T/2,3T/4 (T là chu kỳ)

+ Sau khi xuất ra đủ 4 điểm, mẫu được dịch phải 1 bit (ô chú thích số 5) và lấy mặt

nạ bit LSB Lặp lại cho đến hết chiều dài mẫu

+ Như vậy mỗi mẫu vào 16 bit có 16 symbol, mỗi symbol sẽ tạo ra 1 chu kỳ sóng sine gồm 4 điểm, do đó với mỗi mẫu vào, chương trình xuất ra 4x16 = 64 mẫu ra và

biến đếm i_BPSK giúp xác định khi nào được phép lấy mẫu vào kế tiếp (ô chú thích

số 2 & 2’).

- Tương tự đối với PAM, sửa lệnh sample_data = input_sample() thành

sample_data = 0x???? (một giá trị bất kỳ 16 bit dạng số hex) rồi biên dịch, nạp và

chạy chương trình Kiểm chứng kết quả thu được trên Plot của CCS

Lưu ý: thông số lựa chọn cho việc thể hiện dạng sóng như sau:

2’

’’’

Trang 13

sample_data = 0x0F0F = 0b0000 1111 0000 1111

đảo pha đảo pha đảo pha

sample_data = 0x5555 = 0b0101 0101 0101 0101

Trang 14

0 & 1 hoán đổi liên tục nên pha sẽ đảo liên tục từ phải sang trái như hình sau:

sample_data = 0x9999 = 0b1001 1001 1001 1001

Lý giải kết quả tương tự, ta có hình sau:

2 Điều chế QPSK

Trang 15

- Thực hiện hoàn toàn tương tự điều chế BPSK.

- Điều chế QPSK cần 4 pha: 0o, 90o, 180o, 270o nên cần khai báo 1 mảng 4x4: 4 sóng sine lệch pha nhau 90o, mỗi sóng có 4 điểm Số mẫu ra cho QPSK là 4x8 = 32 Mặt

nạ thích hợp để lấy 2 bit (biểu diễn 4 trạng thái) 0x0003, mỗi lần dịch 2 bit

Do đó sửa lại tập tin BPSK.c như sau :

#include "DSK6713_aic23.h"

Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;

#include <math.h>

//Initialization:

int i_BPSK;

int j_BPSK;

int k;

int masked_value, output;

int out_buffer[256];

int i=0;

int data_QPSK[4][4]={0, 1000, 0, -1000, //0 degree

1000, 0, -1000, 0, //90 degree

0, -1000, 0, 1000, //180 degree

-1000, 0, 1000, 0}; //270 degree

interrupt void c_int11() //interrupt service routine

{

int sample_data;

if (i_BPSK==32) //determines when to get new input

{

sample_data = input_sample(); //inputs data

i_BPSK=0;

j_BPSK=0;

}

masked_value = sample_data & 0x0003;

output = data_QPSK[masked_value][j_BPSK];

output_sample(output*10);

out_buffer[i++] = output*10;

if (i==256)

i = 0;

j_BPSK++; //repeated output counter

if (j_BPSK==4) //checks if 1-bit segment was output {

j_BPSK=0;

sample_data = sample_data >> 2;

}

i_BPSK++;

return;

}

void main()

{

i_BPSK=32;

j_BPSK=0;

comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop

}

Trang 16

- Sửa lệnh sample_data = input_sample() thành sample_data = 0x???? (một giá trị

bất kỳ 16 bit dạng số hex) rồi biên dịch, nạp và chạy chương trình Kiểm chứng kết quả thu được trên Plot của CCS

sample_data = 0x00E4 = 0x00 00 00 00 11 10 01 00

sample_data = 0xE4FF = 0x11 10 01 00 11 11 11 11

270o 180 o 90o 0 o 270 o

Trang 17

sample_data = 0x1BE4 = 0b00 01 10 11 11 10 01 00

0 o 90 o 180 o 270 o 270 o 180 o 90 o 0 o

Nhận xét: Kết quả thu được chưa đáp ứng được thực hiện theo mã Gray để giảm cực tiểu lỗi

do nhiễu trong quá trình truyền Khi đó pha 270 o ứng với 10 và 180 o ứng với 11 Cần điều

chỉnh lại code điều chế

Ngày đăng: 23/03/2014, 09:21

HÌNH ẢNH LIÊN QUAN

Bảng tra 4 mức: - Báo cáo thí nghiệm xử lý số bài 4 pot
Bảng tra 4 mức: (Trang 2)
Bảng tra 8 mức: - Báo cáo thí nghiệm xử lý số bài 4 pot
Bảng tra 8 mức: (Trang 5)
Bảng tra 16 mức: - Báo cáo thí nghiệm xử lý số bài 4 pot
Bảng tra 16 mức: (Trang 8)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w