Thành viên
nhóm
Nguyễn DuyHưng (Nhóm trưởng)
Dương Quang Huy
Nguyễn Mạnh Hưởng
Trần Duy Hưng
Trần Phi Hùng
3.
BÀI TẬP LỚN
.
Hệtruyền thông số truyền một đoạn văn bản gồm 6 ký tự ( UVWXYZ )
được mã hóa theo bảng mã Unicode (8bit). Mã hóa kiểm soát lỗi dữ liệu
tại bên gửi và nhận CRC ( A * 1 = 7V mức cao, A * 0 = 3V mức thấp ), mã
đường truyền NRZ-I, giả thiết suy hao đường truyền L = 0 dB.
4.
I. VẼ SƠĐỒ TIẾN TRÌNH XỬ LÝ TÍN HIỆU
II. TÍNH TOÁN CÁC THÔNG SỐ LIÊN QUAN
III. LẤY VÍ DỤ VỀ NHIỄU
IV. TIN HỌC HOÁ QUÁ TRÌNH TÍNH TOÁN
Nội dung chính
5.
Mã hoá dữliệu gốc Information : UVWXYZ
=>Mã hoá dữ liệu theo bảng mã Unicode - 8 bit
=>Chuyển từ tin tức thành dữ liệu theo bộ mã
Unicode 8 bit ta được:
• Ký tự ‘u': Dạng nhị phân 8-bit: 01010101
• Ký tự ‘v': Dạng nhị phân 8-bit:0101 0110
• Ký tự ‘w': Dạng nhị phân 8-bit:01010111
• Ký tự ‘x': Dạng nhị phân 8-bit:01011000
• Ký tự ‘y': Dạng nhị phân 8-bit:01011001
• Ký tự ‘z': Dạng nhị phân 8-bit:01011010
• Kết quả chuỗi nhị phân 8-bit cho "UVWXYZ" là:
0101 0101 0101 0110 0101 0111 0101 1000 0101
1001 0101 1010
*Mã kiểm soát lỗi CRC
*Mã đường truyền NRZ-1
I. Vẽ sơ đồ tiến trình xử lý tín
hiệu
6.
II. Tính toáncác thông số liên quan
2.1.Khối định dạng:
Chọn 6 kí tự “UVWXYZ ” sang unicode nhị
phân 8 bit.
Dữ liệu bên gửi :
0101 0101 0101 0110 0101 0111 0101 1000
0101 1001 0101 1010
7.
II. Tính toáncác thông số liên quan
2.2 Mã kiểm soát lỗi CRC
- Bên gửi:
Dữ liệu gửi đi
M(x) = 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010
Đa thức sinh:
G(x) =
= 1 0001 0000 0010 0001 (r=16)
Ta có:
T(x)= [ M(x) +r ( bit 0 ) ] XOR R(x)
Với R(x) =[ M(x) + r ( bit 0 ) ] mod G(x) ( Dư của M(x)/G(x) )
= 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010 0000 0000 0000 0000 mod 1 0001
0000 0010 0001
8.
II. Tính toáncác thông số liên quan
Ta có sơ đồ biểu diễn như sau:
9.
II. Tính toáncác thông số liên quan
Sau khi chia CRC ta được R(x) = 0111 0111 1100 0011
T(x) = [ M(x) + r ( bit 0 ) ] XOR R(x)
= 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010 0111 0111 1100 0011
-Bên nhận :
Ta có :
N(x) = T’(x) mod G(x)
N(x)=0 T’(x) ≡ T(x): đoạn data gửi đi là đúng
N(x) ≠ 0 T’(x) ≠ T(x) : đoạn data gửi đi là sai
Giả sử T’(x) = 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010 0111 0111 1100 0011
N(x) = 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010 0111 0111 1100 0011
mod 1000 1000 0001 00001
Sau khi thực hiện phép chia ta có N(x) = 0
T’(x) ≡ T(x)
Vậy đoạn dữ liệu nhận được là đúng
10.
II. Tính toáncác thông số liên quan
2.3 Mã đường truyền NRZ-I
Quy tắc:
-“0” Chuyển mức điện áp xung
-“1” Không chuyển mức điện áp xung
Chọn 2 mức điện áp xung :
A1=7V ( mức cao)
A0=3V ( mức thấp )
SNRmin=6,02 dB
Thỏa mãn tính chất của đường truyền NRZ-I
Bên gửi : A1=7V , A0=3V
-T(x) = 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101
1010 0111 0111 1100 0011
Tín hiệu biểu diễn theo mã đường NRZ-I
3V,3V,7V,3V,3V,7V,3V,7V,7V,7V,3V,7V,7V,3V,3V,3V,
3V,3V,7V,3V,3V,7V,3V,7V,3V,3V,7V,3V,3V,7V,3V,3V,
7V,7V,7V,3V,7V,7V,7V,7V,3V,3V,3V,7V,3V,3V,7V,7V,
7V,3V,7V,7V,3V,3V,3V,3V,3V,3V,3V,7V,3V,7V,3V,7V,
7V,3V,7V,3V,7V,7V,3V,3V,3V,3V,7V,3V,3V,3V,3V,7V,
7V,7V,3V,3V,7V,3V,7V,7V,3V,3V,3V,7V,3V,3V,7V,3V,
3V,7V,7V,7V,3V,3V,3V,7V,3V,7V,3V,3V,7V,3V,7V,7V,
7V,3V,3V,7V,3V,3V,3V,7V,3V,7V,3V,3V,3V,3V,3V,7V
-Tính Nmax
SNRmin= 20log∆ / =20
𝑈𝑚𝑖𝑛 𝑁𝑚𝑎𝑥
log〖 1− )/
(𝐴 𝐴 2𝑁𝑚𝑎𝑥
(2
(2
(2
(2
(2
(2
(2
(2
(2
(2
(2
(2
(2
( 2 〗
6,02 = 20log (7−3)/𝑁𝑚𝑎𝑥
Nmax = 2
11.
II. Tính toáncác thông số liên quan
Bên gửi Kênh truyền Bên nhận
A0=3V L=0, N=2 A0-
Nmax<A0’<A0+Nmax
1V<A0’< 5V
A1=7V L=0,N=2 A1-
Nmax<A1’<A1+Nmax
5V< A1’ < 9V
Bên nhận:
Tính dải làm việc bên nhận : L=0 dB , Nmax=2
12.
III. Lấy vídụ về nhiễu
3. Lấy ví dụ nhiễu
3.1 Ví dụ về N<Nmax tín hiệu và dữ liệu thu được là đúng.
Bên gửi:
- Khối định dạng : Chuyển 6 ký tự “ UVWXYZ” => Unicode 8 bit
0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010
- Mã kiểm soát lỗi CRC :
- Dữ liệu gửi đi
M(x) = 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001
0101 1010
Đa thức sinh:
G(x) =
= 1000 1000 0001 00001 (r=16)
Ta có:
T(x)= [ M(x) +r ( bit 0 ) ] XOR R(x)
Với R(x) =[ M(x) + r ( bit 0 ) ] mod G(x) ( Dư của M(x)/G(x) )
= 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001
0101 1010 0000 0000 0000 0000 mod 1 0001 0000 0010 0001
Sau khi chia CRC ta được R(x) = 0111 0111 1100 0011
T(x) = [ M(x) + r ( bit 0 ) ] XOR R(x)
= 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010
0111 0111 1100 0011
- Mã đường NRZ-I :
A1=7V ( Mức cao) , A0=3V ( Mức thấp)
“1” => giữ nguyên mức điện áp
“0” => đảo mức điện áp
SNRmin= 20log
6,02 = 20log
Nmax = 2 (V)
Với N<Nmax tín hiệu thu được đúng
13.
ST
T
Data Bên
gửi
(V)
Nhiễu trên
kênhtruyền:
N(V)
Bên nhận(V)
Nử
a
thờ
i
gia
n
đầu
Nửa thời
gian cuối
Nửa thời
gian đầu
Nửa thời
gian cuối
1
0
A1=7
A0=3 1,5 1,5
A1’=8,5;
(2)=>A1’≡A1
A0’=4,5;
(2)=>A0’≡A0
A1’=8,5;
(2)=>A1’≡A1
A0’=4,5;
(2)=>A0’≡A0
2
1
A0=3
A1=7 0,0 1,2
A1’=7,0;
(2)=>A1’≡A1
A0’=3,0;
(2)=>A0’≡A0
A1’=8,2;
(2)=>A1’≡A1
A0’=4,2;
(2)=>A0’≡A0
3
0
A1=7
A0=3 1,0 1,5
A1’=8,0;
(2)=>A1’≡A1
A0’=4,0;
(2)=>A0’≡A0
A1’=8,5;
(2)=>A1’≡A1
A0’=4,5;
(2)=>A0’≡A0
4
1
A0=3
A1=7 -1,0 1,0
A1’=6,0;
(2)=>A1’≡A1
A0’=2,0;
(2)=>A0’≡A0
A1’=8,0;
(2)=>A1’≡A1
A0’=4,0;
(2)=>A0’≡A0
5
0
A1=7
A0=3 1,3 1,0
A1’=8,3;
(2)=>A1’≡A1
A0’=4,3;
(2)=>A0’≡A0
A1’=8,0;
(2)=>A1’≡A1
A0’=4,0;
(2)=>A0’≡A0
6
1
A0=3
A1=7 -1,0 0,0
A1’=6,0;
(2)=>A1’≡A1
A0’=2,0;
(2)=>A0’≡A0
A1’=7,0;
(2)=>A1’≡A1
A0’=3,0;
(2)=>A0’≡A0
7
0
A1=7
A0=3 -1,5 0,0
A1’=5,5;
(2)=>A1’≡A1
A0’=1,5;
(2)=>A0’≡A0
A1’=7,0;
(2)=>A1’≡A1
A0’=3,0;
(2)=>A0’≡A0
62 0 A1=7
A0=3
00
A0'=3.0;
(1)=>A0'≡A0
A1'=7.0;
(2)=>A1'≡A1
A0'=3.0;
(1)=>A0'≡A0
A1'=7.0;
(2)=>A1'≡A1
63 1 A1=7
A0=3
0 0
A1'=7.0;
(2)=>A1'≡A1
A0'=3.0;
(1)=>A0'≡A0
A1'=7.0;
(2)=>A1'≡A1
A0'=3.0;
(1)=>A0'≡A0
64 1 A1=7
A0=3
0 0
A1'=7.0;
(2)=>A1'≡A1
A0'=3.0;
(1)=>A0'≡A0
A1'=7.0;
(2)=>A1'≡A1
A0'=3.0;
(1)=>A0'≡A0
Ba bit thứ 4, 6 và 18 bị đảo do nhiễu có biên độ lớn (N > Nmax) làm
điện áp truyền bị lệch sang vùng nhận diện logic ngược (A1 ↔ A0)
nhưng vẫn nằm trong khoảng hợp lệ nên NRZ-I không phát hiện lỗi
vật lý.
Bit thứ 4: A1’=7 V − 2.1 V = 4.9 V → bị hiểu thành A0 → bit đảo.
Bit thứ 6: A0’=3 V + 2.1 V = 5.1 V → bị hiểu thành A1 → bit đảo.
Bit thứ 18: A1’=7 V − 2.1 V = 4.9 V → bị hiểu thành A0 → bit đảo.
Dữ liệu nhận được sau nhiễu
T’(x) = 0100 0001 0101 0110 1001 0111 0101 1000 0101 1001 0101
1010 0111 0111 1100 0011
Mã kiểm soát lỗi CRC
G(x) = 1000 1000 0001 00001
N(x) = T’(x) mod G(x)
= 0100 0001 0101 0110 1001 0111 0101 1000 0101 1001 0101 1010 0111 0111
1100 0011 mod 1000 1000 0001 00001
= 0001 0011 1110 1110 ≠ 0
CRC phát hiện lỗi sai
IV. Tin họchóa quá trình tính toán
4.Tin học hoá
4.1 Code pyton :
import matplotlib.pyplot as plt
import numpy as np
# ---------------- Chuyển chuỗi sang nhị phân ----------------
def chuyen_doi(chuoi_vao):
return ''.join([format(ord(c), '08b') for c in chuoi_vao])
# ---------------- Tính CRC ----------------
def tinh_CRC(data, da_thuc_sinh):
data = list(data)
da_thuc_sinh = list(da_thuc_sinh)
data.extend(['0'] * (len(da_thuc_sinh) - 1))
for i in range(len(data) - len(da_thuc_sinh) + 1):
if data[i] == '1':
for j in range(len(da_thuc_sinh)):
data[i + j] = str(int(data[i + j]) ^ int(da_thuc_sinh[j]))
return ''.join(data[-(len(da_thuc_sinh) - 1):])
# ---------------- Tính dải làm việc ----------------
def tinh_dai(A1, A0, Nmax):
A1_lower, A1_upper = A1 - Nmax, A1 + Nmax
A0_lower, A0_upper = A0 - Nmax, A0 + Nmax
plt.figure(figsize=(8, 4))
x = ['A1', 'A0']
y = [A1, A0]
plt.bar(x, y, color=['blue', 'green'])
plt.plot(['A1', 'A1'], [A1_lower, A1_upper], 'r--', label="Dải A1'")
21.
IV. Tin họchóa quá trình tính toán
plt.fill_betweenx([A1_lower, A1_upper], -0.5, 0.5, color='red', alpha=0.1)
plt.plot(['A0', 'A0'], [A0_lower, A0_upper], 'orange', linestyle='--', label="Dải A0'")
plt.fill_betweenx([A0_lower, A0_upper], 1.5, 2.5, color='orange', alpha=0.1)
plt.ylim(min(y) - 1, max(y) + 2)
plt.ylabel("Điện áp (V)")
plt.title("Biểu đồ dải làm việc bên nhận")
plt.grid(axis='y')
plt.legend()
plt.show()
# ---------------- Mã hóa NRZ-I ----------------
def dap_NRZI(data_CRC, A1, A0):
tthai = A1
ketqua = []
for i in data_CRC:
if i == '1':
ketqua.append(tthai)
else:
tthai = A0 if tthai == A1 else A1
ketqua.append(tthai)
return ketqua
# ---------------- Vẽ sơ đồ 3 phần ----------------
def ve_so_do_3_phan(NRZI_output, nhieu, sau_nhieu, case_name,
data_bits=None):
x = np.arange(len(NRZI_output) + 1)
plt.figure(figsize=(15, 8))
plt.suptitle(f"Sơ đồ xung vuông – {case_name}", fontsize=14,
weight='bold')
# ===== 1. Bên gửi =====
plt.subplot(3, 1, 1)
plt.title("Tín hiệu bên gửi", fontsize=11)
plt.step(x, [NRZI_output[0]] + list(NRZI_output), where='post',
color='blue')
for i, val in enumerate(NRZI_output):
plt.text(i + 0.1, val + 0.2, f"{val:.0f}", color='blue', fontsize=8)
22.
IV. Tin họchóa quá trình tính toán
if data_bits:
for i, bit in enumerate(data_bits):
plt.text(i + 0.4, min(NRZI_output) - 0.8, str(bit),
color='black', fontsize=8)
plt.ylabel("U(V)")
plt.grid(True)
plt.ylim(min(NRZI_output) - 1, max(NRZI_output) + 1)
# ===== 2. Nhiễu =====
plt.subplot(3, 1, 2)
plt.title("Nhiễu trên kênh truyền", fontsize=11)
plt.step(x, [nhieu[0]] + list(nhieu), where='post', color='green')
for i, val in enumerate(nhieu):
plt.text(i + 0.1, val + 0.2, f"{val:.1f}", color='green', fontsize=8)
plt.ylabel("N(V)")
plt.grid(True)
plt.ylim(min(nhieu) - 1, max(nhieu) + 1)
# ===== 3. Bên nhận =====
plt.subplot(3, 1, 3)
plt.title("Tín hiệu bên nhận", fontsize=11)
plt.step(x, [sau_nhieu[0]] + list(sau_nhieu), where='post', color='red')
for i, val in enumerate(sau_nhieu):
plt.text(i + 0.1, val + 0.2, f"{val:.1f}", color='red', fontsize=8)
if data_bits:
for i, bit in enumerate(data_bits):
plt.text(i + 0.4, min(sau_nhieu) - 0.8, str(bit), color='black', fontsize=8)
plt.xlabel("Thời gian (bit)")
23.
IV. Tin họchóa quá trình tính toán
plt.ylabel("U(V)")
plt.grid(True)
plt.ylim(min(sau_nhieu) - 1, max(sau_nhieu) + 1)
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()
# ---------------- Giải mã NRZ-I ----------------
def dap_to_bits(A1, A0, Nmax, sau_nhieu, tt_bandau):
bits = []
tt = tt_bandau
for i in sau_nhieu:
if A1 - Nmax < tt < A1 + Nmax:
if A1 - Nmax < i < A1 + Nmax: bits.append(1)
elif A0 - Nmax < i < A0 + Nmax: bits.append(0)
tt = i
elif A0 - Nmax < tt < A0 + Nmax:
if A0 - Nmax < i < A0 + Nmax: bits.append(1)
elif A1 - Nmax < i < A1 + Nmax: bits.append(0)
tt = i
else:
bits.append('_')
return bits
# ---------------- Kiểm tra CRC ----------------
def kiem_tra_crc(bits_str, da_thuc_sinh):
24.
IV. Tin họchóa quá trình tính toán
return tinh_CRC(bits_str, da_thuc_sinh) == '0' * (len(da_thuc_sinh) - 1)
# ---------------- Hàm chính ----------------
def main():
print("====== HỆ THỐNG TRUYỀN THÔNG NRZ-I + CRC ======")
chuoi_vao = input("Nhập 6 ký tự: ")
while len(chuoi_vao) != 6:
chuoi_vao = input("Nhập lại 6 ký tự: ")
A1 = float(input("Điện áp A1: "))
A0 = float(input("Điện áp A0: "))
da_thuc_sinh = input("Đa thức sinh G(x): ")
# Tính Nmax
SNR_min = 6.02
Nmax = round((A1 - A0) / (10 ** (SNR_min / 20)), 2)
print(f"Nmax = {Nmax} V")
tinh_dai(A1, A0, Nmax)
data = chuyen_doi(chuoi_vao)
print("Dữ liệu gửi:", data)
data_CRC = data + tinh_CRC(data, da_thuc_sinh)
print("Dữ liệu sau CRC:", data_CRC)
25.
IV. Tin họchóa quá trình tính toán
tt_bandau = A1
NRZI_output = dap_NRZI(data_CRC, A1, A0)
# --- Nhập và hiển thị từng trường hợp ---
cases = [
"Nhiễu nhỏ (<Nmax)",
"Nhiễu vừa (>Nmax)",
"Nhiễu lớn (CRC phát hiện lỗi)"
]
for name in cases:
print(f"n===== {name} =====")
nhieu_input = input(f"Nhập 64 mức nhiễu cho '{name}' (cách nhau bằng dấu
cách): ")
nhieu = [float(x) for x in nhieu_input.split()]
if len(nhieu) != 64:
raise ValueError("Phải nhập đúng 64 giá trị!")
sau_nhieu = [a + b for a, b in zip(NRZI_output, nhieu)]
kq_bits = dap_to_bits(A1, A0, Nmax, sau_nhieu, tt_bandau)
kqua_bits_string = ''.join(str(b) for b in kq_bits if b != '_')
print("Dữ liệu nhận:", kqua_bits_string)
if '_' in kq_bits:
print(" Lỗi: nhiễu quá lớn hoặc vượt dải làm việc.")
else:
if kiem_tra_crc(kqua_bits_string, da_thuc_sinh):
print("CRC hợp lệ, dữ liệu đúng.")
26.
IV. Tin họchóa quá trình tính toán
else:
print(“ CRC phát hiện lỗi!")
# Vẽ sơ đồ cho từng trường hợp
ve_so_do_3_phan(NRZI_output, nhieu, sau_nhieu, name, list(data_CRC))
# ---------------- Chạy chương trình ----------------
if __name__ == "__main__":
main()