Есть ли способ отправки и приема сигналов для модулированного сигнала с использованием python?

#python #signal-processing #telecommunication #modulation

#python #обработка сигналов #телекоммуникации #модуляция

Вопрос:

Я пытался найти способы отправки модулированных сигналов на python, которые затем в дальнейшем анализируют отправленные и полученные данные.

На данный момент я просто хочу иметь возможность отправлять данные, используя формат модуляции, такой как PAM, а затем получать их

Любая помощь будет оценена, спасибо

Ответ №1:

Я не пробовал, но есть библиотека Komm Python для анализа и моделирования систем связи. Komm включает в себя реализацию komm с амплитудно-импульсной модуляцией.Памодуляция, среди других схем модуляции.

Комм.Класс PAModulation имеет .modulate() метод, который принимает биты данных в качестве входных данных и модулирует их в сигнал передачи. И наоборот, существует .demodulate() метод, который принимает принятый сигнал и пытается демодулировать из него данные. Не похоже, что Komm поставляется с интерфейсами для радиостанций или других модальностей, поэтому вам нужно будет отдельно выяснить, как на самом деле отправлять и получать эти сигналы.

Ответ №2:

Существует способ отправки сигналов при моделировании. Например. если вы хотите передать комбинацию битов 10 в системе 4QAM, вам нужно будет начать с модулятора, который сопоставляет это со сложным символом: допустим, отображение 1 1j -> Теперь вам нужно будет «передать» этот сложныйсимвол по каналу, который вносит искажения (например, аддитивный белый гауссовский шум). Теперь на приемнике вы пытаетесь обнаружить этот символ и сопоставить его с исходной 10-битной комбинацией.

Я бы порекомендовал вам запрограммировать это с нуля, чтобы лучше понять тему.

Код для модуляции 4QAM может, например, выглядеть так:

 import matplotlib.pyplot as plt
import numpy as np
import pylab as pyl

def modulate_4QAM(bits):
    b_temp = np.reshape(bits * 2 - 1, (-1, 2)) # reshape bits in [0,1] to [-1,1]
    x = 1 / np.sqrt(2) * (b_temp[:, 0]   1j * b_temp[:, 1])
    return x

def detecting_4QAM(received_signal):
    # detecting (slicing) and de-mapping
    received_bits = np.zeros((len(received_signal), 2))
    received_bits[:, 0] = np.real(received_signal) > 0
    received_bits[:, 1] = np.imag(received_signal) > 0
    received_bits = np.reshape(received_bits, (-1,))
    return received_bits

if __name__ == '__main__':
    b = pyl.randint(0, 2, int(4)) # generate random bits
    x = modulate_4QAM(b) # map bits to complex symbols
    noisePower=10**(-5/20) #caltulcate the noise power for a given SNR value
    noise = (noisePower)*1/np.sqrt(2)*(pyl.randn(len(x)) 1j*pyl.randn(len(x)))#generate noise
    y_AWGN =x noise # add the noise to the signal
    b_received = detecting_4QAM(y_AWGN)
 

Обратите внимание, что масштабирование с 4QAM до 64QAM приведет к дополнительным затратам на программирование / ввод, и для этого очень удобны наборы инструментов.

Это лишь часть примера кодирования, который имитирует BER по SNR AWGN с модуляцией 4QAM из: https://github.com/TheWirelessClassroom/PythonExamples/tree/Modulation

PS Я новичок на форуме и не уверен, что только часть или полный код более полезны / желательны. Я был бы рад получить некоторые отзывы об этом и соответствующим образом изменить сообщение.