55 lines
No EOL
1.6 KiB
Python
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 |