Восстановление бит GNURadio PSK

Я следовал замечательному руководству GNURadio Guided Tutorial PSK Demodulation: https://wiki.gnuradio.org/index.php/Guided_Tutorial_PSK_Demodulation

Я создал очень простой модулятор DBPSK введите здесь описание изображения

Я подаю серию битов, которые скользят. Таким образом, первый байт, который я ввожу, — это 0x01, следующий байт — 0x02, 0x04, 0x08 и так далее. Это вывод hd:

00000000  00 00 ac 0e d0 f0 20 40  81 02 04 08 10 00 20 40  |...... @...... @|
00000010  81 02 04 08 10 00 20 40  81 02 04 08 10 00 20 40  |...... @...... @|
*
00015000

Первые несколько байтов — это мусор, но затем вы можете увидеть закономерность. Глядя на вторую строку, вы видите: 0x81, 0x02, 0x04, 0x08, 0x10, 0x00, 0x20, 0x40, 0x81.

Ходячие есть, но после 0x10 демодулятор PSK получает 0x00, а через несколько байт получает 0x81. Похоже, что восстановление синхронизации отключено.

Кто-нибудь еще видел что-то подобное?


person Nick    schedule 04.03.2018    source источник


Ответы (1)


Хорошо, я понял это. Ниже моя модуляция DBPSK. введите здесь описание изображения

Если вы позволите этому работать, BER продолжит падать. Некоторые вещи, которые следует иметь в виду. PSK Mod принимает 8-битное значение (или, возможно, также короткое или целое). Он захватывает биты и модулирует их. Затем PSK Demod делает то же самое. Если вы сохраните это в файл, вы не получите точные биты. Вам нужно будет сдвинуть биты, чтобы выровнять их. Я добавил блок Vector Insert для создания своего рода преамбулы.

Затем я написал немного Python, чтобы найти преамбулу:

import numpy as np
import matplotlib.pyplot as plt


def findPreamble(preamble, x):
    for i in range(0, len(x) - len(preamble)):
        check = 0
        for j in range(0, len(preamble)):
            check += x[i + j] - preamble[j]
        if (check == 0):
            print("Found a preamble at {0}".format(i))
            x = x[i + len(preamble)::]
            break
    return check == 0, x

def shiftBits(x):
    for i in range (0, len(x) - 1):
        a = x[i]
        a = a << 1
        if x[i + 1] & 0x80:
            a = a | 1

        x[i] = (a & 0xFF)
    return x

f = open('test.bits', 'rb')
x = f.read();
f.close()

preamble = [0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
searchForBit = True
x = np.frombuffer(x, dtype='uint8')
x = x.astype('int')
print(x)

while searchForBit:

    x = shiftBits(x)
    print(x)
    found, y = findPreamble(preamble, x)
    if found:
        searchForBit = False
        y = y.astype('uint8')
        f = open('test.bits', 'wb')
        f.write(y)
        f.close()
person Nick    schedule 06.03.2018