2017-11-18 5 views
0

저는 GRC를 처음 사용했습니다. fsk 장치에서 데이터를 디코딩하려고합니다. 나는 rtl_433 -a-t (I/Q 2 채널 uint8)로 데이터를 잡아 잡음, 직교 복조, 저역 통과 필터, 중심 파 및 이진 슬라이스를 제거했습니다. 그래서 나는 이것을 얻는다 : enter image description here신호 비트 복구

여기에서 시작해서 어떻게 비트 변환/패킷을 얻을 수 있습니까? 또한 클럭 복구를 시도했지만 성공하지 (획득 한 데이터는 그래프와 일치하지 않습니다.

여기

내 GRC 흐름을 (또한 클럭 복구 변수가 있습니다) enter image description here

PS 것은 내가 먼저하기 전에 데이터를 잡고 잘라 수있는 방법 "비트"여기 진 슬라이스 대 내 출력 신호 복조. 내가 진 내 보내면 내가 공의 (신호 전에 긴 줄에 의한)를 많이 얻을. 그래서 후 ...

enter image description here

감사

답변

0

저는 파이썬 스크립트를 만들어 데이터를 가져 왔습니다. 불량하고 빠르지 만 작동합니다. 작동합니다.

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])