GNURadio PSK位恢复

时间:2018-03-04 14:35:10

标签: gnuradio ber

我遵循了精彩的GNURadio Guided Tutorial PSK解调: https://wiki.gnuradio.org/index.php/Guided_Tutorial_PSK_Demodulation

我创建了一个非常简单的DBPSK调制器 enter image description here

我输入一系列滑动的位。因此,我输入的第一个字节是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。几乎看起来时机恢复都没有了。

还有其他人见过这样的东西吗?

1 个答案:

答案 0 :(得分:0)

好的,我明白了。下面是我的DBPSK调制。 enter image description here

如果你让它运行,BER将继续下降。要记住一些事情。 PSK Mod采用8位值(或者也可以是short或int)。它抓住位并调制它们。然后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()