├── example_wav.png ├── .gitignore ├── live_capture.py ├── check_crc.py ├── print_packet.py ├── omnipackets.ipynb ├── README.md ├── fskdemod.py ├── omni_decode.py ├── omni_rf.py ├── cc1110_24mhz.xml └── pdm.grc /example_wav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ps2/omnipod_rf/HEAD/example_wav.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | top_block.py 3 | .ipynb_checkpoints 4 | .demod.dat 5 | *.wav 6 | *.dat 7 | -------------------------------------------------------------------------------- /live_capture.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | from fskdemod import FskDemod 3 | import argparse 4 | import numpy as np 5 | import omni_rf as omni 6 | 7 | def main(options=None): 8 | 9 | parser = argparse.ArgumentParser(description='Decode omnipod packets from rtl_sdr or hackrf.') 10 | 11 | args = parser.parse_args() 12 | demod = FskDemod(None, '-') 13 | # run until ctrl-c 14 | demod.run() 15 | 16 | if __name__ == '__main__': 17 | main() 18 | -------------------------------------------------------------------------------- /check_crc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | 3 | import argparse 4 | import binascii 5 | import sys 6 | import omni_rf as omni 7 | 8 | def main(options=None): 9 | parser = argparse.ArgumentParser(description='Check CRC8 an omnipod packet (given as a hex string).') 10 | parser.add_argument('data', metavar='data', type=str, nargs='+', 11 | help='data as a hex string') 12 | 13 | args = parser.parse_args() 14 | hex_str = args.data[0] 15 | data = hex_str[:-2].decode("hex") 16 | crc = ord(hex_str[-2:].decode("hex")) 17 | computed_crc = omni.compute_crc(data) 18 | if computed_crc != crc: 19 | print "Invalid crc. Computed = %s" % hex(computed_crc) 20 | sys.exit(-1) 21 | else: 22 | print "OK!" 23 | sys.exit(0) 24 | 25 | if __name__ == '__main__': 26 | main() 27 | -------------------------------------------------------------------------------- /print_packet.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | 3 | import argparse 4 | import binascii 5 | import json 6 | 7 | def main(options=None): 8 | parser = argparse.ArgumentParser(description='Print out structured version of packet (given as a hex string).') 9 | parser.add_argument('data', metavar='data', type=str, nargs='+', 10 | help='data as a hex string') 11 | parser.add_argument('--json', action='store_true', 12 | help='print as json (default: text line)') 13 | 14 | args = parser.parse_args() 15 | hex_str = args.data[0] 16 | 17 | pod_address_1 = hex_str[0:8] 18 | byte5 = ord(hex_str[8:10].decode("hex")) 19 | packet_type = byte5 >> 5 20 | sequence = byte5 & 0b11111 21 | pod_address_2 = hex_str[10:18] 22 | body = "" 23 | message_type = "" 24 | if len(hex_str) > 20: 25 | unknown = hex_str[18:20] 26 | message_type = ord(hex_str[20:22].decode("hex")) 27 | body = hex_str[22:-2] 28 | crc = ord(hex_str[-2:].decode("hex")) 29 | 30 | # attr style 31 | #print "addr1=%s addr2=%s" % (addr1, addr2) 32 | 33 | # compact style: 34 | if args.json: 35 | obj = { 36 | "pod_address_1": pod_address_1, 37 | "packet_type": packet_type, 38 | "sequence": sequence, 39 | "pod_address_2": pod_address_2, 40 | "message_type": message_type, 41 | "body": body, 42 | "crc": crc, 43 | "raw_packet": hex_str, 44 | } 45 | print json.dumps(obj, sort_keys=True,indent=4, separators=(',', ': ')) 46 | else: 47 | print "ID1:%s PTYPE:%s SEQ:%d ID2:%s MTYPE:%02x BODY:%s CRC:%02x" % (pod_address_1, format(packet_type, '#05b')[2:], sequence, pod_address_2, message_type, body, crc) 48 | 49 | if __name__ == '__main__': 50 | main() 51 | -------------------------------------------------------------------------------- /omnipackets.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 4, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "5756783e0290577e3e02905660061c020005de08\n", 15 | "5756783e029057c03e02905668143a30004c8000000157ff06b76a\n", 16 | "5756783e029056823e02905792\n" 17 | ] 18 | } 19 | ], 20 | "source": [ 21 | "%matplotlib inline\n", 22 | "import matplotlib\n", 23 | "import numpy as np\n", 24 | "import omni_rf as omni\n", 25 | "\n", 26 | "sample_rate = 2048000 # sample rate of sdr\n", 27 | "samples_per_bit = 50.4185 # This was computed based on previously seen data.\n", 28 | "\n", 29 | "samples = np.fromfile('output.dat',dtype=np.float32)\n", 30 | "packets_offsets = omni.find_offsets(samples,samples_per_bit)\n", 31 | "\n", 32 | "for po in packets_offsets:\n", 33 | " packet_samples = samples[slice(*po)]\n", 34 | " bytes = omni.decode_packet(packet_samples, samples_per_bit)\n", 35 | " print \"\".join([format(n, '02x') for n in bytes])\n" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": null, 41 | "metadata": { 42 | "collapsed": true 43 | }, 44 | "outputs": [], 45 | "source": [] 46 | } 47 | ], 48 | "metadata": { 49 | "kernelspec": { 50 | "display_name": "Python 2", 51 | "language": "python", 52 | "name": "python2" 53 | }, 54 | "language_info": { 55 | "codemirror_mode": { 56 | "name": "ipython", 57 | "version": 2 58 | }, 59 | "file_extension": ".py", 60 | "mimetype": "text/x-python", 61 | "name": "python", 62 | "nbconvert_exporter": "python", 63 | "pygments_lexer": "ipython2", 64 | "version": "2.7.11" 65 | } 66 | }, 67 | "nbformat": 4, 68 | "nbformat_minor": 0 69 | } 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Decode Omnipod RF Packets 2 | 3 | This repo contains tools for working with raw iq data from an SDR, and will decode the omnipod signal into packets. For more information about the omnipod protocol, see the [omnidocs repo](https://github.com/openaps/omnidocs). 4 | 5 | ## Prerequisites 6 | 7 | * [GNURadio](http://gnuradio.org/), or at least the gnuradio python libraries. 8 | * numpy 9 | 10 | 11 | ## Capturing data 12 | 13 | I use [SDR# (SDR Sharp)](http://airspy.com/download/) to capture my iq files, and there are many different ways of doing this. But whatever software you use, you'll need to capture at 2024000 samples per second. *NOTE* While the signal is at 433.923MHz, we don't want to use that as our SDR center, as we will run into center DC noise issues. The code needs to know what offset we're using, so I have dictated an offset of 460kHz. Thus, set your SDR to capture at *433.463MHz* 14 | 15 | It should look like this in the end: 16 | 17 | ![PDM Signal](example_wav.png) 18 | 19 | Notice that the signal appears to be alternating between two different frequencies. This is [FSK](https://en.wikipedia.org/wiki/Frequency-shift_keying) modulation. If the signal is too weak (the waves are small), move the pod/pdm closer. If the waves are clipped at the top, the signal is too strong. 20 | 21 | ## Running the decoder 22 | 23 | ``` 24 | $ python omni_decode.py find_pdm.wav 25 | Filename = find_pdm.wav 26 | Using Volk machine: avx_64_mmx 27 | 158ms: ffffffffa3ffffffff040607041f01482b037f8d 28 | 457ms: ffffffffa3ffffffff040607041f01482b037f8d 29 | 756ms: ffffffffa3ffffffff040607041f01482b037f8d 30 | 1055ms: ffffffffa3ffffffff040607041f01482b037f8d 31 | 1353ms: ffffffffa3ffffffff040607041f01482b037f8d 32 | 1652ms: ffffffffa3ffffffff040607041f01482b037f8d 33 | 1951ms: ffffffffa3ffffffff040607041f01482b037f8d 34 | 2250ms: ffffffffa3ffffffff040607041f01482b037f8d 35 | 2549ms: ffffffffa3ffffffff040607041f01482b037f8d 36 | 2848ms: ffffffffa3ffffffff040607041f01482b037f8d 37 | 3146ms: ffffffffa3ffffffff040607041f01482b037f8d 38 | ``` 39 | -------------------------------------------------------------------------------- /fskdemod.py: -------------------------------------------------------------------------------- 1 | from gnuradio import analog 2 | from gnuradio import blocks 3 | from gnuradio import eng_notation 4 | from gnuradio import filter 5 | from gnuradio import gr 6 | from gnuradio.eng_option import eng_option 7 | from gnuradio.filter import firdes 8 | 9 | class FskDemod(gr.top_block): 10 | 11 | def __init__(self, input_file, output_file): 12 | gr.top_block.__init__(self) 13 | 14 | ################################################## 15 | # Variables 16 | ################################################## 17 | self.samp_rate = samp_rate = 2048000 18 | 19 | ################################################## 20 | # Blocks 21 | ################################################## 22 | self.low_pass_filter_1 = filter.fir_filter_fff(1, firdes.low_pass( 23 | 1, samp_rate, 85000, 2000, firdes.WIN_HAMMING, 6.76)) 24 | self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass( 25 | 1, samp_rate, 200000, 1000, firdes.WIN_HAMMING, 6.76)) 26 | 27 | if input_file != None: 28 | self.blocks_wavfile_source_0 = blocks.wavfile_source(input_file, False) 29 | else: 30 | import osmosdr 31 | 32 | self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" ) 33 | self.rtlsdr_source_0.set_sample_rate(samp_rate) 34 | self.rtlsdr_source_0.set_center_freq(433463000, 0) 35 | self.rtlsdr_source_0.set_freq_corr(0, 0) 36 | self.rtlsdr_source_0.set_dc_offset_mode(0, 0) 37 | self.rtlsdr_source_0.set_iq_balance_mode(0, 0) 38 | self.rtlsdr_source_0.set_gain_mode(False, 0) 39 | self.rtlsdr_source_0.set_gain(10, 0) 40 | self.rtlsdr_source_0.set_if_gain(20, 0) 41 | self.rtlsdr_source_0.set_bb_gain(20, 0) 42 | self.rtlsdr_source_0.set_antenna("", 0) 43 | self.rtlsdr_source_0.set_bandwidth(0, 0) 44 | 45 | self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) 46 | self.blocks_float_to_complex_0 = blocks.float_to_complex(1) 47 | if output_file == '-': 48 | self.blocks_file_sink_0 = blocks.file_descriptor_sink(4, 1) 49 | else: 50 | self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_float*1, output_file, False) 51 | self.blocks_file_sink_0.set_unbuffered(False) 52 | self.blocks_add_const_vxx_0 = blocks.add_const_vff((0.00, )) 53 | self.analog_sig_source_x_0 = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, -420000, 1, 0) 54 | self.analog_quadrature_demod_cf_0 = analog.quadrature_demod_cf(1) 55 | 56 | ################################################## 57 | # Connections 58 | ################################################## 59 | self.connect((self.analog_quadrature_demod_cf_0, 0), (self.low_pass_filter_1, 0)) 60 | self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 1)) 61 | self.connect((self.blocks_add_const_vxx_0, 0), (self.blocks_file_sink_0, 0)) 62 | self.connect((self.blocks_multiply_xx_0, 0), (self.low_pass_filter_0, 0)) 63 | self.connect((self.low_pass_filter_0, 0), (self.analog_quadrature_demod_cf_0, 0)) 64 | self.connect((self.low_pass_filter_1, 0), (self.blocks_add_const_vxx_0, 0)) 65 | 66 | if input_file != None: 67 | self.connect((self.blocks_wavfile_source_0, 1), (self.blocks_float_to_complex_0, 0)) 68 | self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_float_to_complex_0, 1)) 69 | self.connect((self.blocks_float_to_complex_0, 0), (self.blocks_multiply_xx_0, 0)) 70 | else: 71 | self.connect((self.rtlsdr_source_0, 0), (self.blocks_multiply_xx_0, 0)) 72 | 73 | def get_samp_rate(self): 74 | return self.samp_rate 75 | 76 | def set_samp_rate(self, samp_rate): 77 | self.samp_rate = samp_rate 78 | self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate) 79 | self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, 10e3, 10e3, firdes.WIN_HAMMING, 6.76)) 80 | self.low_pass_filter_1.set_taps(firdes.low_pass(1, self.samp_rate, 40400, 20200, firdes.WIN_HAMMING, 6.76)) 81 | -------------------------------------------------------------------------------- /omni_decode.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | from fskdemod import FskDemod 3 | import argparse 4 | import numpy as np 5 | import omni_rf as omni 6 | import sys 7 | 8 | def show_packet(samples, offsets, streaming_offset, samples_per_bit, sample_rate): 9 | packet_samples = samples[slice(*offsets)] 10 | bytes = omni.decode_packet( 11 | packet_samples, 12 | samples_per_bit, 13 | manchester_variant='ieee', 14 | preamble_byte=0xab) 15 | hex_str = "".join([format(n, '02x') for n in bytes]) 16 | #print "hex = %s" % hex_str 17 | computed_crc = omni.compute_crc(str(bytearray(bytes[:-1]))) 18 | if len(hex_str) > 0 and computed_crc == bytes[-1:]: 19 | sample_num = streaming_offset + offsets[0] 20 | print "%sms: %s" % (int((sample_num/float(sample_rate))*1000), hex_str) 21 | 22 | def main(options=None): 23 | 24 | parser = argparse.ArgumentParser(description='Decode omnipod packets from fsk iq wav file.') 25 | parser.add_argument('filename', metavar='filename', type=str, nargs='+', 26 | help='filename of iq file') 27 | 28 | sample_rate = 2048000 # sample rate of sdr 29 | samples_per_bit = 50.41 # This was computed based on previously seen data. 30 | 31 | args = parser.parse_args() 32 | filename = args.filename[0] 33 | if filename == "-": 34 | print "Reading demodulated signal from stdin" 35 | bits_per_chunk = 2048 36 | bytes_per_sample = 4 37 | samples_per_chunk = int(bits_per_chunk * samples_per_bit) 38 | bytes_per_chunk = samples_per_chunk * bytes_per_sample 39 | 40 | samples = np.array([], dtype=np.float32) 41 | streaming_offset = 0 42 | 43 | header = sys.stdin.read(115) 44 | if header[:18] == 'Using Volk machine': 45 | print "Skipping extraneous gnuradio header." 46 | else: 47 | # This is valid data; keep it. 48 | header += sys.stdin.read(1) # byte align to size of float32 49 | samples = np.frombuffer(header, dtype=np.float32) 50 | 51 | try: 52 | while True: 53 | new_bytes = sys.stdin.read(bytes_per_chunk) 54 | if len(new_bytes) == 0: 55 | break 56 | #print "Read %d bytes" % len(new_bytes) 57 | mod = len(new_bytes) % 4 58 | if mod != 0: 59 | new_bytes = new_bytes[:-mod] 60 | samples = np.append(samples, np.frombuffer(new_bytes, dtype=np.float32)) 61 | packets_offsets = omni.find_offsets(samples,samples_per_bit, 80, 1) 62 | if len(packets_offsets) == 0: 63 | # Keep the last chunk 64 | streaming_offset += len(samples) - samples_per_chunk 65 | samples = samples[-samples_per_chunk:] 66 | continue 67 | else: 68 | #print "streaming_offset = %s" % streaming_offset 69 | #print "offsets = %s" % packets_offsets 70 | end_of_last_processed_packet = 0 71 | for packet_offset in packets_offsets: 72 | packet_begin = packet_offset[0] 73 | packet_end = packet_offset[1] 74 | num_bits = (packet_end - packet_begin) / samples_per_bit 75 | # If we have enough bits for a packet and some silence after the packet, then process packet 76 | #print "num bits = %s" % num_bits 77 | if num_bits > 20 and packet_end < (len(samples) - (samples_per_bit*5)): 78 | #print "processing" 79 | show_packet(samples, packet_offset, streaming_offset, samples_per_bit, sample_rate) 80 | end_of_last_processed_packet = packet_end 81 | streaming_offset += end_of_last_processed_packet 82 | samples = samples[end_of_last_processed_packet:] 83 | except KeyboardInterrupt: 84 | pass 85 | else: 86 | print "Reading demodulated signal data from %s" % filename 87 | demod = FskDemod(args.filename[0], '.demod.dat') 88 | demod.run() 89 | 90 | samples = np.fromfile('.demod.dat',dtype=np.float32) 91 | packets_offsets = omni.find_offsets(samples,samples_per_bit) 92 | 93 | for po in packets_offsets: 94 | show_packet(samples, po, streaming_offset, samples_per_bit, sample_rate) 95 | 96 | if __name__ == '__main__': 97 | main() 98 | -------------------------------------------------------------------------------- /omni_rf.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import crcmod 3 | 4 | def rolling(a, window): 5 | shape = (a.size - window + 1, window) 6 | strides = (a.itemsize, a.itemsize) 7 | return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) 8 | 9 | 10 | def find_offsets(samples, samples_per_bit, minimum_bits=80, sensitivity=1): 11 | signs = np.array(samples >= 0, int) 12 | differences = np.diff(signs) 13 | crossings = np.nonzero((differences < 0) | (differences > 0))[0] 14 | cumul_widths = crossings[1:] - crossings[0] 15 | widths = (cumul_widths[1:] - cumul_widths[:-1]) 16 | phases = widths % samples_per_bit 17 | # rotate phases on left side to right 18 | phases[phases<(samples_per_bit/2)]+=samples_per_bit 19 | 20 | # Rolling 4 point average of phase; if we're within a half sample of the 21 | # expected bitrate, then this is packet data. 22 | packet_detect = np.absolute(rolling(phases, 4).mean(axis=1) - samples_per_bit) 23 | packet_detect = rolling(packet_detect, 4).max(axis=1) < sensitivity 24 | 25 | # Bookend 26 | packet_detect_crossings = np.nonzero(np.diff(packet_detect))[0] 27 | if packet_detect[0]: 28 | packet_detect_crossings = np.insert(packet_detect_crossings, 0, 0) 29 | if packet_detect[-1]: 30 | packet_detect_crossings = np.append(packet_detect_crossings, len(cumul_widths)-9) 31 | #print "packet_detect[0] = %s" % packet_detect[0] 32 | #print "packet_detect_crossings = %s" % packet_detect_crossings 33 | startstop = packet_detect_crossings.reshape(-1, 2) 34 | startstop[:,1] += 8 35 | startstop[:,0] += 1 36 | offsets = [x for x in cumul_widths.take(startstop) if (x[1] - x[0]) >= (minimum_bits*samples_per_bit)] 37 | return offsets 38 | 39 | def get_phase(samples, samples_per_bit): 40 | signs = np.array(samples >= 0, int) 41 | differences = np.diff(signs) 42 | crossings = np.nonzero((differences < 0) | (differences > 0))[0] 43 | cumulWidths = crossings[1:] - crossings[0] 44 | widths = (cumulWidths[1:] - cumulWidths[:-1]) 45 | filtered_widths = widths[(widths > 46) & (widths < 55)] 46 | if filtered_widths.size == 0: 47 | return -1 48 | samples_per_bit = filtered_widths.mean() 49 | return (crossings % samples_per_bit).mean() 50 | 51 | def resample(samples, offset, step): 52 | centers = np.arange(offset, samples.size, step) 53 | xp = np.arange(samples.size) 54 | return (centers, np.interp(centers, xp, samples)) 55 | 56 | def sample_bits(samples, samples_per_bit, phase_offset): 57 | bit_center_offset = phase_offset - (samples_per_bit / 2.0) 58 | (centers, bits) = resample(samples, bit_center_offset, samples_per_bit) 59 | bits = (bits > 0).astype(int) 60 | return bits 61 | 62 | def manchester_decode(bits, manchester_variant): 63 | decoded = [] 64 | if manchester_variant == 'ieee': 65 | hi_low = 0 66 | low_hi = 1 67 | else: 68 | hi_low = 1 69 | low_hi = 0 70 | 71 | prev = None 72 | for bit in bits: 73 | if prev == None: 74 | prev = bit 75 | continue 76 | 77 | if prev == 0 and bit == 1: 78 | d = low_hi 79 | prev = None 80 | elif prev == 1 and bit == 0: 81 | d = hi_low 82 | prev = None 83 | else: 84 | d = -1 # Error 85 | prev = bit 86 | 87 | decoded.append(d) 88 | return np.array(decoded) 89 | 90 | def find_end_of_preamble(bits, preamble_byte): 91 | preamble = np.unpackbits(np.array([preamble_byte], dtype=np.uint8)) 92 | if bits.size < 24: 93 | return -1 94 | for i in range(0, bits.size-16): 95 | if (bits[i:i+8] == preamble).all() and not (bits[i+8:i+16] == preamble).all(): 96 | return i+16 # Skip sync word 97 | return -1 98 | 99 | def decode_packet(samples, samples_per_bit, manchester_variant='ieee', preamble_byte=0x54): 100 | phase = get_phase(samples, samples_per_bit) 101 | if phase < 0: 102 | return [] 103 | raw_bits = sample_bits(samples, samples_per_bit, phase) 104 | #print "raw_bits = %s" % "".join(map(str, raw_bits)) 105 | if raw_bits.size < 48: # Need at least 3 bytes 106 | return [] 107 | m_bits = manchester_decode(raw_bits, manchester_variant) 108 | bits = np.trim_zeros(m_bits + 1) - 1 # Trim leading and trailing errors 109 | #print "bits = %s" % "".join(map(str, bits)) 110 | 111 | byte_start = find_end_of_preamble(bits, preamble_byte) 112 | #print "byte_start = %s" % byte_start 113 | return np.packbits(bits[byte_start:]) 114 | 115 | def compute_crc(data): 116 | #omnicrc8 = crcmod.mkCrcFun(0x1e0, initCrc=0xce, xorOut=0x00) 117 | omnicrc8 = crcmod.predefined.mkCrcFun('crc-8') 118 | return omnicrc8(data) 119 | -------------------------------------------------------------------------------- /cc1110_24mhz.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CC1110 5 | Saved configuration data 6 | 7 | 8 | ADDR 9 | 0x20 10 | 11 | 12 | DEVIATN 13 | 0x41 14 | 15 | 16 | FOCCFG 17 | 0x17 18 | 19 | 20 | FREQ0 21 | 0x5f 22 | 23 | 24 | FREQ1 25 | 0x14 26 | 27 | 28 | FREQ2 29 | 0x12 30 | 31 | 32 | FSCAL0 33 | 0x1f 34 | 35 | 36 | FSCAL1 37 | 0x00 38 | 39 | 40 | FSCAL2 41 | 0x2a 42 | 43 | 44 | FSCAL3 45 | 0xe9 46 | 47 | 48 | FSCTRL1 49 | 0x06 50 | 51 | 52 | LQI 53 | 0x7f 54 | 55 | 56 | MCSM0 57 | 0x18 58 | 59 | 60 | MDMCFG0 61 | 0x11 62 | 63 | 64 | MDMCFG1 65 | 0x03 66 | 67 | 68 | MDMCFG2 69 | 0x0e 70 | 71 | 72 | MDMCFG3 73 | 0xbc 74 | 75 | 76 | MDMCFG4 77 | 0x8a 78 | 79 | 80 | PA_TABLE0 81 | 0xc0 82 | 83 | 84 | PKTCTRL0 85 | 0x00 86 | 87 | 88 | PKTCTRL1 89 | 0x00 90 | 91 | 92 | PKTLEN 93 | 0x46 94 | 95 | 96 | SYNC0 97 | 0xc3 98 | 99 | 100 | SYNC1 101 | 0x54 102 | 103 | 104 | TEST0 105 | 0x09 106 | 107 | 108 | TEST1 109 | 0x31 110 | 111 | 112 | VERSION 113 | 0x04 114 | 115 | 116 | 117 | 2 118 | 0 119 | 2 120 | 1 121 | -1 122 | -1 123 | 3 124 | 125 | 126 | 24.000000 127 | 128 | 129 | 1 130 | 0 131 | -1 132 | 0 133 | 0 134 | 135 | 136 | -1 137 | 2 138 | 139 | 140 | 2 141 | 100 142 | 100 143 | e1 30 9c fe d9 71 9f e2 a5 e2 0c 9b b4 47 65 38 2a 46 144 | 145 | 146 | 147 | 2 148 | 0 149 | 0 150 | 0 151 | 0 152 | 1 153 | 2 154 | 6 155 | 0 156 | 0 157 | 158 | 0 159 | 70 160 | 12 161 | 0 162 | 163 | 164 | 100 165 | 100 166 | 167 | 0 168 | 0 169 | 0 170 | 0 171 | 172 | 0 173 | 0 174 | 175 | 176 | 0 177 | 178 | 179 | -1 180 | 181 | 182 | -------------------------------------------------------------------------------- /pdm.grc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Tue Jun 7 19:04:37 2016 5 | 6 | options 7 | 8 | author 9 | 10 | 11 | 12 | window_size 13 | 14 | 15 | 16 | category 17 | Custom 18 | 19 | 20 | comment 21 | 22 | 23 | 24 | description 25 | 26 | 27 | 28 | _enabled 29 | True 30 | 31 | 32 | _coordinate 33 | (8, 8) 34 | 35 | 36 | _rotation 37 | 0 38 | 39 | 40 | generate_options 41 | wx_gui 42 | 43 | 44 | hier_block_src_path 45 | .: 46 | 47 | 48 | id 49 | top_block 50 | 51 | 52 | max_nouts 53 | 0 54 | 55 | 56 | qt_qss_theme 57 | 58 | 59 | 60 | realtime_scheduling 61 | 62 | 63 | 64 | run_command 65 | {python} -u {filename} 66 | 67 | 68 | run_options 69 | prompt 70 | 71 | 72 | run 73 | True 74 | 75 | 76 | thread_safe_setters 77 | 78 | 79 | 80 | title 81 | 82 | 83 | 84 | 85 | variable 86 | 87 | comment 88 | 89 | 90 | 91 | _enabled 92 | True 93 | 94 | 95 | _coordinate 96 | (32, 229) 97 | 98 | 99 | _rotation 100 | 0 101 | 102 | 103 | id 104 | samp_rate 105 | 106 | 107 | value 108 | 2048000 109 | 110 | 111 | 112 | analog_quadrature_demod_cf 113 | 114 | alias 115 | 116 | 117 | 118 | comment 119 | 120 | 121 | 122 | affinity 123 | 124 | 125 | 126 | _enabled 127 | 1 128 | 129 | 130 | _coordinate 131 | (376, 454) 132 | 133 | 134 | _rotation 135 | 0 136 | 137 | 138 | gain 139 | 1 140 | 141 | 142 | id 143 | analog_quadrature_demod_cf_0 144 | 145 | 146 | maxoutbuf 147 | 0 148 | 149 | 150 | minoutbuf 151 | 0 152 | 153 | 154 | 155 | analog_sig_source_x 156 | 157 | amp 158 | 1 159 | 160 | 161 | alias 162 | 163 | 164 | 165 | comment 166 | 167 | 168 | 169 | affinity 170 | 171 | 172 | 173 | _enabled 174 | 1 175 | 176 | 177 | freq 178 | -420000 179 | 180 | 181 | _coordinate 182 | (216, 248) 183 | 184 | 185 | _rotation 186 | 0 187 | 188 | 189 | id 190 | analog_sig_source_x_0 191 | 192 | 193 | maxoutbuf 194 | 0 195 | 196 | 197 | minoutbuf 198 | 0 199 | 200 | 201 | offset 202 | 0 203 | 204 | 205 | type 206 | complex 207 | 208 | 209 | samp_rate 210 | samp_rate 211 | 212 | 213 | waveform 214 | analog.GR_COS_WAVE 215 | 216 | 217 | 218 | blocks_add_const_vxx 219 | 220 | alias 221 | 222 | 223 | 224 | comment 225 | 226 | 227 | 228 | const 229 | -0.00 230 | 231 | 232 | affinity 233 | 234 | 235 | 236 | _enabled 237 | 1 238 | 239 | 240 | _coordinate 241 | (760, 454) 242 | 243 | 244 | _rotation 245 | 0 246 | 247 | 248 | id 249 | blocks_add_const_vxx_0 250 | 251 | 252 | type 253 | float 254 | 255 | 256 | maxoutbuf 257 | 0 258 | 259 | 260 | minoutbuf 261 | 0 262 | 263 | 264 | vlen 265 | 1 266 | 267 | 268 | 269 | blocks_file_sink 270 | 271 | append 272 | False 273 | 274 | 275 | alias 276 | 277 | 278 | 279 | comment 280 | 281 | 282 | 283 | affinity 284 | 285 | 286 | 287 | _enabled 288 | 1 289 | 290 | 291 | file 292 | /home/pete/dev/omnipod_rf/fskoutput.dat 293 | 294 | 295 | _coordinate 296 | (904, 437) 297 | 298 | 299 | _rotation 300 | 0 301 | 302 | 303 | id 304 | blocks_file_sink_0 305 | 306 | 307 | type 308 | float 309 | 310 | 311 | unbuffered 312 | False 313 | 314 | 315 | vlen 316 | 1 317 | 318 | 319 | 320 | blocks_multiply_xx 321 | 322 | alias 323 | 324 | 325 | 326 | comment 327 | 328 | 329 | 330 | affinity 331 | 332 | 333 | 334 | _enabled 335 | 1 336 | 337 | 338 | _coordinate 339 | (472, 225) 340 | 341 | 342 | _rotation 343 | 0 344 | 345 | 346 | id 347 | blocks_multiply_xx_0 348 | 349 | 350 | type 351 | complex 352 | 353 | 354 | maxoutbuf 355 | 0 356 | 357 | 358 | minoutbuf 359 | 0 360 | 361 | 362 | num_inputs 363 | 2 364 | 365 | 366 | vlen 367 | 1 368 | 369 | 370 | 371 | low_pass_filter 372 | 373 | beta 374 | 6.76 375 | 376 | 377 | alias 378 | 379 | 380 | 381 | comment 382 | 383 | 384 | 385 | affinity 386 | 387 | 388 | 389 | cutoff_freq 390 | 200000 391 | 392 | 393 | decim 394 | 1 395 | 396 | 397 | _enabled 398 | 2 399 | 400 | 401 | type 402 | fir_filter_ccf 403 | 404 | 405 | _coordinate 406 | (624, 186) 407 | 408 | 409 | _rotation 410 | 0 411 | 412 | 413 | gain 414 | 1 415 | 416 | 417 | id 418 | low_pass_filter_0 419 | 420 | 421 | interp 422 | 1 423 | 424 | 425 | maxoutbuf 426 | 0 427 | 428 | 429 | minoutbuf 430 | 0 431 | 432 | 433 | samp_rate 434 | samp_rate 435 | 436 | 437 | width 438 | 1000 439 | 440 | 441 | win 442 | firdes.WIN_HAMMING 443 | 444 | 445 | 446 | low_pass_filter 447 | 448 | beta 449 | 6.76 450 | 451 | 452 | alias 453 | 454 | 455 | 456 | comment 457 | 458 | 459 | 460 | affinity 461 | 462 | 463 | 464 | cutoff_freq 465 | 85000 466 | 467 | 468 | decim 469 | 1 470 | 471 | 472 | _enabled 473 | 1 474 | 475 | 476 | type 477 | fir_filter_fff 478 | 479 | 480 | _coordinate 481 | (576, 424) 482 | 483 | 484 | _rotation 485 | 0 486 | 487 | 488 | gain 489 | 1 490 | 491 | 492 | id 493 | low_pass_filter_1 494 | 495 | 496 | interp 497 | 1 498 | 499 | 500 | maxoutbuf 501 | 0 502 | 503 | 504 | minoutbuf 505 | 0 506 | 507 | 508 | samp_rate 509 | samp_rate 510 | 511 | 512 | width 513 | 2000 514 | 515 | 516 | win 517 | firdes.WIN_HAMMING 518 | 519 | 520 | 521 | rtlsdr_source 522 | 523 | alias 524 | 525 | 526 | 527 | ant0 528 | 529 | 530 | 531 | bb_gain0 532 | 20 533 | 534 | 535 | bw0 536 | 0 537 | 538 | 539 | dc_offset_mode0 540 | 0 541 | 542 | 543 | corr0 544 | 0 545 | 546 | 547 | freq0 548 | 433463000 549 | 550 | 551 | gain_mode0 552 | False 553 | 554 | 555 | if_gain0 556 | 20 557 | 558 | 559 | iq_balance_mode0 560 | 0 561 | 562 | 563 | gain0 564 | 10 565 | 566 | 567 | ant10 568 | 569 | 570 | 571 | bb_gain10 572 | 20 573 | 574 | 575 | bw10 576 | 0 577 | 578 | 579 | dc_offset_mode10 580 | 0 581 | 582 | 583 | corr10 584 | 0 585 | 586 | 587 | freq10 588 | 100e6 589 | 590 | 591 | gain_mode10 592 | False 593 | 594 | 595 | if_gain10 596 | 20 597 | 598 | 599 | iq_balance_mode10 600 | 0 601 | 602 | 603 | gain10 604 | 10 605 | 606 | 607 | ant11 608 | 609 | 610 | 611 | bb_gain11 612 | 20 613 | 614 | 615 | bw11 616 | 0 617 | 618 | 619 | dc_offset_mode11 620 | 0 621 | 622 | 623 | corr11 624 | 0 625 | 626 | 627 | freq11 628 | 100e6 629 | 630 | 631 | gain_mode11 632 | False 633 | 634 | 635 | if_gain11 636 | 20 637 | 638 | 639 | iq_balance_mode11 640 | 0 641 | 642 | 643 | gain11 644 | 10 645 | 646 | 647 | ant12 648 | 649 | 650 | 651 | bb_gain12 652 | 20 653 | 654 | 655 | bw12 656 | 0 657 | 658 | 659 | dc_offset_mode12 660 | 0 661 | 662 | 663 | corr12 664 | 0 665 | 666 | 667 | freq12 668 | 100e6 669 | 670 | 671 | gain_mode12 672 | False 673 | 674 | 675 | if_gain12 676 | 20 677 | 678 | 679 | iq_balance_mode12 680 | 0 681 | 682 | 683 | gain12 684 | 10 685 | 686 | 687 | ant13 688 | 689 | 690 | 691 | bb_gain13 692 | 20 693 | 694 | 695 | bw13 696 | 0 697 | 698 | 699 | dc_offset_mode13 700 | 0 701 | 702 | 703 | corr13 704 | 0 705 | 706 | 707 | freq13 708 | 100e6 709 | 710 | 711 | gain_mode13 712 | False 713 | 714 | 715 | if_gain13 716 | 20 717 | 718 | 719 | iq_balance_mode13 720 | 0 721 | 722 | 723 | gain13 724 | 10 725 | 726 | 727 | ant14 728 | 729 | 730 | 731 | bb_gain14 732 | 20 733 | 734 | 735 | bw14 736 | 0 737 | 738 | 739 | dc_offset_mode14 740 | 0 741 | 742 | 743 | corr14 744 | 0 745 | 746 | 747 | freq14 748 | 100e6 749 | 750 | 751 | gain_mode14 752 | False 753 | 754 | 755 | if_gain14 756 | 20 757 | 758 | 759 | iq_balance_mode14 760 | 0 761 | 762 | 763 | gain14 764 | 10 765 | 766 | 767 | ant15 768 | 769 | 770 | 771 | bb_gain15 772 | 20 773 | 774 | 775 | bw15 776 | 0 777 | 778 | 779 | dc_offset_mode15 780 | 0 781 | 782 | 783 | corr15 784 | 0 785 | 786 | 787 | freq15 788 | 100e6 789 | 790 | 791 | gain_mode15 792 | False 793 | 794 | 795 | if_gain15 796 | 20 797 | 798 | 799 | iq_balance_mode15 800 | 0 801 | 802 | 803 | gain15 804 | 10 805 | 806 | 807 | ant16 808 | 809 | 810 | 811 | bb_gain16 812 | 20 813 | 814 | 815 | bw16 816 | 0 817 | 818 | 819 | dc_offset_mode16 820 | 0 821 | 822 | 823 | corr16 824 | 0 825 | 826 | 827 | freq16 828 | 100e6 829 | 830 | 831 | gain_mode16 832 | False 833 | 834 | 835 | if_gain16 836 | 20 837 | 838 | 839 | iq_balance_mode16 840 | 0 841 | 842 | 843 | gain16 844 | 10 845 | 846 | 847 | ant17 848 | 849 | 850 | 851 | bb_gain17 852 | 20 853 | 854 | 855 | bw17 856 | 0 857 | 858 | 859 | dc_offset_mode17 860 | 0 861 | 862 | 863 | corr17 864 | 0 865 | 866 | 867 | freq17 868 | 100e6 869 | 870 | 871 | gain_mode17 872 | False 873 | 874 | 875 | if_gain17 876 | 20 877 | 878 | 879 | iq_balance_mode17 880 | 0 881 | 882 | 883 | gain17 884 | 10 885 | 886 | 887 | ant18 888 | 889 | 890 | 891 | bb_gain18 892 | 20 893 | 894 | 895 | bw18 896 | 0 897 | 898 | 899 | dc_offset_mode18 900 | 0 901 | 902 | 903 | corr18 904 | 0 905 | 906 | 907 | freq18 908 | 100e6 909 | 910 | 911 | gain_mode18 912 | False 913 | 914 | 915 | if_gain18 916 | 20 917 | 918 | 919 | iq_balance_mode18 920 | 0 921 | 922 | 923 | gain18 924 | 10 925 | 926 | 927 | ant19 928 | 929 | 930 | 931 | bb_gain19 932 | 20 933 | 934 | 935 | bw19 936 | 0 937 | 938 | 939 | dc_offset_mode19 940 | 0 941 | 942 | 943 | corr19 944 | 0 945 | 946 | 947 | freq19 948 | 100e6 949 | 950 | 951 | gain_mode19 952 | False 953 | 954 | 955 | if_gain19 956 | 20 957 | 958 | 959 | iq_balance_mode19 960 | 0 961 | 962 | 963 | gain19 964 | 10 965 | 966 | 967 | ant1 968 | 969 | 970 | 971 | bb_gain1 972 | 20 973 | 974 | 975 | bw1 976 | 0 977 | 978 | 979 | dc_offset_mode1 980 | 0 981 | 982 | 983 | corr1 984 | 0 985 | 986 | 987 | freq1 988 | 100e6 989 | 990 | 991 | gain_mode1 992 | False 993 | 994 | 995 | if_gain1 996 | 20 997 | 998 | 999 | iq_balance_mode1 1000 | 0 1001 | 1002 | 1003 | gain1 1004 | 10 1005 | 1006 | 1007 | ant20 1008 | 1009 | 1010 | 1011 | bb_gain20 1012 | 20 1013 | 1014 | 1015 | bw20 1016 | 0 1017 | 1018 | 1019 | dc_offset_mode20 1020 | 0 1021 | 1022 | 1023 | corr20 1024 | 0 1025 | 1026 | 1027 | freq20 1028 | 100e6 1029 | 1030 | 1031 | gain_mode20 1032 | False 1033 | 1034 | 1035 | if_gain20 1036 | 20 1037 | 1038 | 1039 | iq_balance_mode20 1040 | 0 1041 | 1042 | 1043 | gain20 1044 | 10 1045 | 1046 | 1047 | ant21 1048 | 1049 | 1050 | 1051 | bb_gain21 1052 | 20 1053 | 1054 | 1055 | bw21 1056 | 0 1057 | 1058 | 1059 | dc_offset_mode21 1060 | 0 1061 | 1062 | 1063 | corr21 1064 | 0 1065 | 1066 | 1067 | freq21 1068 | 100e6 1069 | 1070 | 1071 | gain_mode21 1072 | False 1073 | 1074 | 1075 | if_gain21 1076 | 20 1077 | 1078 | 1079 | iq_balance_mode21 1080 | 0 1081 | 1082 | 1083 | gain21 1084 | 10 1085 | 1086 | 1087 | ant22 1088 | 1089 | 1090 | 1091 | bb_gain22 1092 | 20 1093 | 1094 | 1095 | bw22 1096 | 0 1097 | 1098 | 1099 | dc_offset_mode22 1100 | 0 1101 | 1102 | 1103 | corr22 1104 | 0 1105 | 1106 | 1107 | freq22 1108 | 100e6 1109 | 1110 | 1111 | gain_mode22 1112 | False 1113 | 1114 | 1115 | if_gain22 1116 | 20 1117 | 1118 | 1119 | iq_balance_mode22 1120 | 0 1121 | 1122 | 1123 | gain22 1124 | 10 1125 | 1126 | 1127 | ant23 1128 | 1129 | 1130 | 1131 | bb_gain23 1132 | 20 1133 | 1134 | 1135 | bw23 1136 | 0 1137 | 1138 | 1139 | dc_offset_mode23 1140 | 0 1141 | 1142 | 1143 | corr23 1144 | 0 1145 | 1146 | 1147 | freq23 1148 | 100e6 1149 | 1150 | 1151 | gain_mode23 1152 | False 1153 | 1154 | 1155 | if_gain23 1156 | 20 1157 | 1158 | 1159 | iq_balance_mode23 1160 | 0 1161 | 1162 | 1163 | gain23 1164 | 10 1165 | 1166 | 1167 | ant24 1168 | 1169 | 1170 | 1171 | bb_gain24 1172 | 20 1173 | 1174 | 1175 | bw24 1176 | 0 1177 | 1178 | 1179 | dc_offset_mode24 1180 | 0 1181 | 1182 | 1183 | corr24 1184 | 0 1185 | 1186 | 1187 | freq24 1188 | 100e6 1189 | 1190 | 1191 | gain_mode24 1192 | False 1193 | 1194 | 1195 | if_gain24 1196 | 20 1197 | 1198 | 1199 | iq_balance_mode24 1200 | 0 1201 | 1202 | 1203 | gain24 1204 | 10 1205 | 1206 | 1207 | ant25 1208 | 1209 | 1210 | 1211 | bb_gain25 1212 | 20 1213 | 1214 | 1215 | bw25 1216 | 0 1217 | 1218 | 1219 | dc_offset_mode25 1220 | 0 1221 | 1222 | 1223 | corr25 1224 | 0 1225 | 1226 | 1227 | freq25 1228 | 100e6 1229 | 1230 | 1231 | gain_mode25 1232 | False 1233 | 1234 | 1235 | if_gain25 1236 | 20 1237 | 1238 | 1239 | iq_balance_mode25 1240 | 0 1241 | 1242 | 1243 | gain25 1244 | 10 1245 | 1246 | 1247 | ant26 1248 | 1249 | 1250 | 1251 | bb_gain26 1252 | 20 1253 | 1254 | 1255 | bw26 1256 | 0 1257 | 1258 | 1259 | dc_offset_mode26 1260 | 0 1261 | 1262 | 1263 | corr26 1264 | 0 1265 | 1266 | 1267 | freq26 1268 | 100e6 1269 | 1270 | 1271 | gain_mode26 1272 | False 1273 | 1274 | 1275 | if_gain26 1276 | 20 1277 | 1278 | 1279 | iq_balance_mode26 1280 | 0 1281 | 1282 | 1283 | gain26 1284 | 10 1285 | 1286 | 1287 | ant27 1288 | 1289 | 1290 | 1291 | bb_gain27 1292 | 20 1293 | 1294 | 1295 | bw27 1296 | 0 1297 | 1298 | 1299 | dc_offset_mode27 1300 | 0 1301 | 1302 | 1303 | corr27 1304 | 0 1305 | 1306 | 1307 | freq27 1308 | 100e6 1309 | 1310 | 1311 | gain_mode27 1312 | False 1313 | 1314 | 1315 | if_gain27 1316 | 20 1317 | 1318 | 1319 | iq_balance_mode27 1320 | 0 1321 | 1322 | 1323 | gain27 1324 | 10 1325 | 1326 | 1327 | ant28 1328 | 1329 | 1330 | 1331 | bb_gain28 1332 | 20 1333 | 1334 | 1335 | bw28 1336 | 0 1337 | 1338 | 1339 | dc_offset_mode28 1340 | 0 1341 | 1342 | 1343 | corr28 1344 | 0 1345 | 1346 | 1347 | freq28 1348 | 100e6 1349 | 1350 | 1351 | gain_mode28 1352 | False 1353 | 1354 | 1355 | if_gain28 1356 | 20 1357 | 1358 | 1359 | iq_balance_mode28 1360 | 0 1361 | 1362 | 1363 | gain28 1364 | 10 1365 | 1366 | 1367 | ant29 1368 | 1369 | 1370 | 1371 | bb_gain29 1372 | 20 1373 | 1374 | 1375 | bw29 1376 | 0 1377 | 1378 | 1379 | dc_offset_mode29 1380 | 0 1381 | 1382 | 1383 | corr29 1384 | 0 1385 | 1386 | 1387 | freq29 1388 | 100e6 1389 | 1390 | 1391 | gain_mode29 1392 | False 1393 | 1394 | 1395 | if_gain29 1396 | 20 1397 | 1398 | 1399 | iq_balance_mode29 1400 | 0 1401 | 1402 | 1403 | gain29 1404 | 10 1405 | 1406 | 1407 | ant2 1408 | 1409 | 1410 | 1411 | bb_gain2 1412 | 20 1413 | 1414 | 1415 | bw2 1416 | 0 1417 | 1418 | 1419 | dc_offset_mode2 1420 | 0 1421 | 1422 | 1423 | corr2 1424 | 0 1425 | 1426 | 1427 | freq2 1428 | 100e6 1429 | 1430 | 1431 | gain_mode2 1432 | False 1433 | 1434 | 1435 | if_gain2 1436 | 20 1437 | 1438 | 1439 | iq_balance_mode2 1440 | 0 1441 | 1442 | 1443 | gain2 1444 | 10 1445 | 1446 | 1447 | ant30 1448 | 1449 | 1450 | 1451 | bb_gain30 1452 | 20 1453 | 1454 | 1455 | bw30 1456 | 0 1457 | 1458 | 1459 | dc_offset_mode30 1460 | 0 1461 | 1462 | 1463 | corr30 1464 | 0 1465 | 1466 | 1467 | freq30 1468 | 100e6 1469 | 1470 | 1471 | gain_mode30 1472 | False 1473 | 1474 | 1475 | if_gain30 1476 | 20 1477 | 1478 | 1479 | iq_balance_mode30 1480 | 0 1481 | 1482 | 1483 | gain30 1484 | 10 1485 | 1486 | 1487 | ant31 1488 | 1489 | 1490 | 1491 | bb_gain31 1492 | 20 1493 | 1494 | 1495 | bw31 1496 | 0 1497 | 1498 | 1499 | dc_offset_mode31 1500 | 0 1501 | 1502 | 1503 | corr31 1504 | 0 1505 | 1506 | 1507 | freq31 1508 | 100e6 1509 | 1510 | 1511 | gain_mode31 1512 | False 1513 | 1514 | 1515 | if_gain31 1516 | 20 1517 | 1518 | 1519 | iq_balance_mode31 1520 | 0 1521 | 1522 | 1523 | gain31 1524 | 10 1525 | 1526 | 1527 | ant3 1528 | 1529 | 1530 | 1531 | bb_gain3 1532 | 20 1533 | 1534 | 1535 | bw3 1536 | 0 1537 | 1538 | 1539 | dc_offset_mode3 1540 | 0 1541 | 1542 | 1543 | corr3 1544 | 0 1545 | 1546 | 1547 | freq3 1548 | 100e6 1549 | 1550 | 1551 | gain_mode3 1552 | False 1553 | 1554 | 1555 | if_gain3 1556 | 20 1557 | 1558 | 1559 | iq_balance_mode3 1560 | 0 1561 | 1562 | 1563 | gain3 1564 | 10 1565 | 1566 | 1567 | ant4 1568 | 1569 | 1570 | 1571 | bb_gain4 1572 | 20 1573 | 1574 | 1575 | bw4 1576 | 0 1577 | 1578 | 1579 | dc_offset_mode4 1580 | 0 1581 | 1582 | 1583 | corr4 1584 | 0 1585 | 1586 | 1587 | freq4 1588 | 100e6 1589 | 1590 | 1591 | gain_mode4 1592 | False 1593 | 1594 | 1595 | if_gain4 1596 | 20 1597 | 1598 | 1599 | iq_balance_mode4 1600 | 0 1601 | 1602 | 1603 | gain4 1604 | 10 1605 | 1606 | 1607 | ant5 1608 | 1609 | 1610 | 1611 | bb_gain5 1612 | 20 1613 | 1614 | 1615 | bw5 1616 | 0 1617 | 1618 | 1619 | dc_offset_mode5 1620 | 0 1621 | 1622 | 1623 | corr5 1624 | 0 1625 | 1626 | 1627 | freq5 1628 | 100e6 1629 | 1630 | 1631 | gain_mode5 1632 | False 1633 | 1634 | 1635 | if_gain5 1636 | 20 1637 | 1638 | 1639 | iq_balance_mode5 1640 | 0 1641 | 1642 | 1643 | gain5 1644 | 10 1645 | 1646 | 1647 | ant6 1648 | 1649 | 1650 | 1651 | bb_gain6 1652 | 20 1653 | 1654 | 1655 | bw6 1656 | 0 1657 | 1658 | 1659 | dc_offset_mode6 1660 | 0 1661 | 1662 | 1663 | corr6 1664 | 0 1665 | 1666 | 1667 | freq6 1668 | 100e6 1669 | 1670 | 1671 | gain_mode6 1672 | False 1673 | 1674 | 1675 | if_gain6 1676 | 20 1677 | 1678 | 1679 | iq_balance_mode6 1680 | 0 1681 | 1682 | 1683 | gain6 1684 | 10 1685 | 1686 | 1687 | ant7 1688 | 1689 | 1690 | 1691 | bb_gain7 1692 | 20 1693 | 1694 | 1695 | bw7 1696 | 0 1697 | 1698 | 1699 | dc_offset_mode7 1700 | 0 1701 | 1702 | 1703 | corr7 1704 | 0 1705 | 1706 | 1707 | freq7 1708 | 100e6 1709 | 1710 | 1711 | gain_mode7 1712 | False 1713 | 1714 | 1715 | if_gain7 1716 | 20 1717 | 1718 | 1719 | iq_balance_mode7 1720 | 0 1721 | 1722 | 1723 | gain7 1724 | 10 1725 | 1726 | 1727 | ant8 1728 | 1729 | 1730 | 1731 | bb_gain8 1732 | 20 1733 | 1734 | 1735 | bw8 1736 | 0 1737 | 1738 | 1739 | dc_offset_mode8 1740 | 0 1741 | 1742 | 1743 | corr8 1744 | 0 1745 | 1746 | 1747 | freq8 1748 | 100e6 1749 | 1750 | 1751 | gain_mode8 1752 | False 1753 | 1754 | 1755 | if_gain8 1756 | 20 1757 | 1758 | 1759 | iq_balance_mode8 1760 | 0 1761 | 1762 | 1763 | gain8 1764 | 10 1765 | 1766 | 1767 | ant9 1768 | 1769 | 1770 | 1771 | bb_gain9 1772 | 20 1773 | 1774 | 1775 | bw9 1776 | 0 1777 | 1778 | 1779 | dc_offset_mode9 1780 | 0 1781 | 1782 | 1783 | corr9 1784 | 0 1785 | 1786 | 1787 | freq9 1788 | 100e6 1789 | 1790 | 1791 | gain_mode9 1792 | False 1793 | 1794 | 1795 | if_gain9 1796 | 20 1797 | 1798 | 1799 | iq_balance_mode9 1800 | 0 1801 | 1802 | 1803 | gain9 1804 | 10 1805 | 1806 | 1807 | comment 1808 | 1809 | 1810 | 1811 | affinity 1812 | 1813 | 1814 | 1815 | args 1816 | 1817 | 1818 | 1819 | _enabled 1820 | True 1821 | 1822 | 1823 | _coordinate 1824 | (232, 28) 1825 | 1826 | 1827 | _rotation 1828 | 0 1829 | 1830 | 1831 | id 1832 | rtlsdr_source_0 1833 | 1834 | 1835 | maxoutbuf 1836 | 0 1837 | 1838 | 1839 | clock_source0 1840 | 1841 | 1842 | 1843 | time_source0 1844 | 1845 | 1846 | 1847 | clock_source1 1848 | 1849 | 1850 | 1851 | time_source1 1852 | 1853 | 1854 | 1855 | clock_source2 1856 | 1857 | 1858 | 1859 | time_source2 1860 | 1861 | 1862 | 1863 | clock_source3 1864 | 1865 | 1866 | 1867 | time_source3 1868 | 1869 | 1870 | 1871 | clock_source4 1872 | 1873 | 1874 | 1875 | time_source4 1876 | 1877 | 1878 | 1879 | clock_source5 1880 | 1881 | 1882 | 1883 | time_source5 1884 | 1885 | 1886 | 1887 | clock_source6 1888 | 1889 | 1890 | 1891 | time_source6 1892 | 1893 | 1894 | 1895 | clock_source7 1896 | 1897 | 1898 | 1899 | time_source7 1900 | 1901 | 1902 | 1903 | minoutbuf 1904 | 0 1905 | 1906 | 1907 | nchan 1908 | 1 1909 | 1910 | 1911 | num_mboards 1912 | 1 1913 | 1914 | 1915 | type 1916 | fc32 1917 | 1918 | 1919 | sample_rate 1920 | samp_rate 1921 | 1922 | 1923 | sync 1924 | 1925 | 1926 | 1927 | 1928 | wxgui_fftsink2 1929 | 1930 | avg_alpha 1931 | 0 1932 | 1933 | 1934 | average 1935 | False 1936 | 1937 | 1938 | baseband_freq 1939 | 0 1940 | 1941 | 1942 | alias 1943 | 1944 | 1945 | 1946 | comment 1947 | 1948 | 1949 | 1950 | affinity 1951 | 1952 | 1953 | 1954 | _enabled 1955 | True 1956 | 1957 | 1958 | fft_size 1959 | 1024 1960 | 1961 | 1962 | freqvar 1963 | None 1964 | 1965 | 1966 | _coordinate 1967 | (872, 192) 1968 | 1969 | 1970 | _rotation 1971 | 0 1972 | 1973 | 1974 | grid_pos 1975 | 1976 | 1977 | 1978 | id 1979 | wxgui_fftsink2_0 1980 | 1981 | 1982 | notebook 1983 | 1984 | 1985 | 1986 | peak_hold 1987 | False 1988 | 1989 | 1990 | ref_level 1991 | 0 1992 | 1993 | 1994 | ref_scale 1995 | 2.0 1996 | 1997 | 1998 | fft_rate 1999 | 15 2000 | 2001 | 2002 | samp_rate 2003 | samp_rate 2004 | 2005 | 2006 | title 2007 | FFT Plot 2008 | 2009 | 2010 | type 2011 | complex 2012 | 2013 | 2014 | win_size 2015 | 2016 | 2017 | 2018 | win 2019 | None 2020 | 2021 | 2022 | y_divs 2023 | 10 2024 | 2025 | 2026 | y_per_div 2027 | 10 2028 | 2029 | 2030 | 2031 | analog_quadrature_demod_cf_0 2032 | low_pass_filter_1 2033 | 0 2034 | 0 2035 | 2036 | 2037 | analog_sig_source_x_0 2038 | blocks_multiply_xx_0 2039 | 0 2040 | 1 2041 | 2042 | 2043 | blocks_add_const_vxx_0 2044 | blocks_file_sink_0 2045 | 0 2046 | 0 2047 | 2048 | 2049 | blocks_multiply_xx_0 2050 | low_pass_filter_0 2051 | 0 2052 | 0 2053 | 2054 | 2055 | low_pass_filter_0 2056 | analog_quadrature_demod_cf_0 2057 | 0 2058 | 0 2059 | 2060 | 2061 | low_pass_filter_0 2062 | wxgui_fftsink2_0 2063 | 0 2064 | 0 2065 | 2066 | 2067 | low_pass_filter_1 2068 | blocks_add_const_vxx_0 2069 | 0 2070 | 0 2071 | 2072 | 2073 | rtlsdr_source_0 2074 | blocks_multiply_xx_0 2075 | 0 2076 | 0 2077 | 2078 | 2079 | --------------------------------------------------------------------------------