pdc_project/transmitter.py
2025-05-20 19:17:08 +02:00

55 lines
No EOL
1.6 KiB
Python

import numpy as np
def text_to_bits(text, alphabet):
"""Convert text to binary bits based on alphabet indexing."""
char_to_idx = {char: idx for idx, char in enumerate(alphabet)}
bits = []
for char in text:
idx = char_to_idx[char]
# Convert index to 6-bit binary string, padded with zeros
bits.extend([int(b) for b in format(idx, '06b')])
return np.array(bits)
def transmitter(text):
"""
Convert a 40-character text message to a signal vector x.
Parameters:
text (str): Input text of 40 characters from the given alphabet.
Returns:
np.ndarray: Signal vector x of length 480 with energy <= 2000.
"""
# Define the alphabet
alphabet = (
'abcdefghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
'0123456789 .'
)
# Input validation
if len(text) != 40 or not all(c in alphabet for c in text):
raise ValueError("Text must be 40 characters from the given alphabet.")
# Convert text to 240 bits (40 chars * 6 bits/char)
bits = text_to_bits(text, alphabet)
# BPSK modulation: 0 -> +sqrt(E), 1 -> -sqrt(E)
E = 4 # Energy per bit
symbols = np.sqrt(E) * (1 - 2 * bits) # Map 0 to +sqrt(E), 1 to -sqrt(E)
# Create signal x: each bit is sent twice (odd and even indices)
n = 480 # Block length
x = np.zeros(n)
for i in range(240):
x[2 * i] = symbols[i] # Even index (2i)
x[2 * i + 1] = symbols[i] # Odd index (2i+1)
# Verify energy constraint
energy = np.sum(x ** 2)
if energy > 2000:
raise ValueError(f"Signal energy {energy} exceeds limit of 2000.")
return x