【问题标题】:Signal Bit Recovery信号位恢复
【发布时间】:2018-05-02 09:41:51
【问题描述】:

我刚开始使用 GRC。我正在尝试从 fsk 设备解码数据。我用 rtl_433 -a -t(I/Q 2 通道 uint8)抓取数据,消除噪声、正交解调、低通滤波器、中心波和二进制切片。所以我明白了:

从这里开始我如何获得位转换/数据包?我也尝试过时钟恢复但没有成功(获得的数据与图表不符。

这是我的 grc 流程(还有时钟恢复变量)

附:如何在第一个“位”之前剪切抓取的数据?这是我的输出 Demod vs Binary slicing。如果我导出二进制文件,我会得到很多 0(由信号前的长线引起)。所以之后...

谢谢

【问题讨论】:

    标签: gnuradio-companion


    【解决方案1】:

    我制作了一个 python 脚本来获取数据。 它写的 Bad and Fast 但它有效:

    import os.path
    import string
    import sys
    import math
    
    def print_buf(counter, buf):
        buf2 = [('%02x' % ord(i)) for i in buf]
        print '{0}: {1:<39}  {2}'.format(('%07x' % (counter * 16)),
            ' '.join([''.join(buf2[i:i + 2]) for i in range(0, len(buf2), 2)]),
            ''.join([c if c in string.printable[:-5] else '.' for c in buf]))
    
    def process(file_path):
        data = ""
        with open(file_path, 'r') as f:
            counter = 0
            firstBit = 0
            while True:
                buf = f.read(16)
                if not buf:
                    break
                if buf.encode('hex') == "00000000000000000000000000000000":
                    #print "No data"
                    if firstBit == 1:
                        #print "0Data"
                        data = data + buf.encode('hex')
                else:
                    firstBit = 1
                    #print "1Data"
                    data = data + buf.encode('hex')
                #print counter
                #print buf.encode('hex')
                #work_data(counter,buf)
                # print_buf(counter, buf)
                counter += 1
        clean_data(data)
    
    def clean_data(data):
        data = data.replace("00","0")
        data = data.replace("01","1")
        data_start = data.find("1")
        data = data[data_start:]
        data_stop = data.rfind("1")
        data = data[:data_stop+1]
        try:
            bit_size(data)
        except Exception, e:
            os.remove(sys.argv[2])
            print "Errore, File Rimosso", sys.argv[2]
        #print data
    
    def bit_size(data):
        #Set one 1 bit max length (evaluated by setting var to an high value and get result)
        var1 = 30
        #Set one 0 bit max length (evaluated by setting var to an high value and get result)
        var2 = 30
        #Get timing from preamble, on eval set it to an high value (best to all file)
        var3 = 10 
        output=""
        flag1 = ""
        flag0 = ""
        avg1 = 0
        avg0 = 0
        min0 = 100
        max0 = 0
        min1 = 100
        max1 = 0
        count1 = 0
        count0 = 0
        sizer = data
        count3 = 0
        count4=0
        count5=0
        while len(sizer) > 1 and count3 <=var3:
            #print len(sizer)
            if sizer[:1] == "1":
               flag1 = sizer.find("0")
               #print "Size 1 " , flag1
               sizer = sizer[flag1:]
               if flag1 < var1 and flag1 > 0:
                  print "Size 1 ", flag1
                  avg1 += flag1
                  count1 +=1
                  count3 += 1
                  count4 +=1
                  if flag1 > max1:
                     max1 = flag1
                  if flag1 < min1:
                     min1 = flag1
            else:
               flag0 = sizer.find("1")
               sizer = sizer[flag0:]
               #print "Size 0 " , flag0
               if flag0 < var2 and flag0 >0:
                  print "Size 0 ", flag0
                  avg0 += flag0
                  count0 += 1
                  count3 += 1
                  count5 += 1
                  if flag0 > max0:
                     max0 = flag0
                  if flag0 < min0:
                     min0 = flag0
    
        #print avg0, avg1, count0, count1
        avg0=avg0/count5
        avg1=avg1/count4
        mod0=math.fmod(avg0,count5)
        mod1=math.fmod(avg1,count4)
        print "0--> Media:" , avg0, "Max:" , max0, "Min:",min0, "Resto:", mod0
        print "1--> Media:" , avg1, "Max:" , max1, "Min:",min1, "Resto:", mod1
        sizer = data
        Smax1=0
        Smin1=0
        Savg1=0
        Smax0=0
        Smin0=0
        Savg0=0
        Cavg0=0
        Cavg1=0
        Scor0=0
        Scor1=0
        while len(sizer) > 1:
            if sizer[:1] == "1":
               flag1 = sizer.find("0")
               sizer = sizer[flag1:]
               Nmax1 = flag1 / max1
               Nmin1 = flag1 / min1
               Navg1 = flag1 / avg1
               Smax1+=Nmax1
               Smin1+=Nmin1
               Savg1+=Navg1
               Mmax1=math.fmod(flag1,max1)
               Mmin1=math.fmod(flag1,min1)
               Mavg1=math.fmod(flag1,avg1)
               if Mavg1 > 5:
                  Cavg1 = Navg1 + 1
               else:
                  Cavg1 = Navg1
               Scor1 += Cavg1
               output += "1" * Cavg1
               #print "1--> Size:", flag1, "EstByMin:", Nmin1, "EstByMax:", Nmax1, "EstByAvg:", Navg1, "RestoDaMedia:", Mavg1, "RestoDaMin:", Mmin1, "RestoDaMax:",Mmax1, "Correzione:", Cavg1
            else:
               flag0 = sizer.find("1")
               sizer = sizer[flag0:]
               #print "Size 0 " , flag0
               if flag0 > 0:
                    Nmax0 = flag0 / max0
                    Nmin0 = flag0 / min0
                    Navg0 = flag0 / avg0
                    Smax0+=Nmax0
                Smin0+=Nmin0
                Savg0+=Navg0
                Mmax0=math.fmod(flag0,max0)
                Mmin0=math.fmod(flag0,min0)
                Mavg0=math.fmod(flag0,avg0)
                if Mavg0 > 5:
                       Cavg0 = Navg0 + 1
                else:
                       Cavg0 = Navg0
                    Scor0 += Cavg0
                    output += "0" * Cavg0
                    #print "0--> Size:", flag0, "EstByMin:", Nmin0, "EstByMax:", Nmax0, "EstByAvg:", Navg0, "RestoDaMedia:", Mavg0, "RestoDaMin:", Mmin0, "RestoDaMax:",Mmax0, "Correzione:", Cavg0
        #print "1--> TotByMin:" , Smin1, "TotByMax:",Smax1, "TotByAvg:",Savg1,"TotByCorr:", Scor1
        #print "0--> TotByMin:" , Smin0, "TotByMax:",Smax0, "TotByAvg:",Savg0,"TotByCorr:", Scor0
        #print "---> TotByMin:" , Smin0+Smin1, "TotByMax:" ,Smax1+Smax0, "TotByAvg:", Savg1+Savg0, "TotByCorr:", Scor0+Scor1
        #print output
        data_rec(output)
    
    def data_rec(input):
        byte=""
        count = 1
        precount = 0
        predebug = ""
        debug = input
        while input[:1] == "1":
           input = input[1:]
        while input[:2] == "01":
           precount+=2
           predebug += "01"
           input= input[2:]
        ##print "--------------------------------------"
        ##if precount > 0:
            ##print "Preamble --> OK", predebug, " Count:" , precount
        ##else:
            ##print "Preamble? -->", debug
            ##os.remove(sys.argv[2])
        preamble=input
        #print preamble
        preamble = ' '.join(preamble[i:i+8] for i in range(0, len(preamble), 8)) 
        #print preamble
        output = ''.join(hex(int(a, 2))[2:] for a in preamble.split())
        #print output
        data = input[34:]
        data = ' '.join(data[i:i+8] for i in range(0, len(data), 8)) 
        #print data
        data = ''.join(hex(int(a, 2))[2:] for a in data.split())
        #print data
        for a in data:
             byte+=a
             if math.fmod(count,2) == 0:
                byte+=" "
             count+=1
        print " "
        ##print byte
        ##print "ByteCount:" , count
        print preamble
        ##print "File:" , sys.argv[2]
        ##print "--------------------------------------------------"
    if __name__ == '__main__':
        if not os.path.exists(sys.argv[1]):
            print >> (sys.stderr, "The file doesn't exist.")
            sys.exit(1)
        process(sys.argv[1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多