├── 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 | 
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 |
--------------------------------------------------------------------------------