-
Notifications
You must be signed in to change notification settings - Fork 0
/
equisat_fm_demod.py
134 lines (104 loc) · 5.61 KB
/
equisat_fm_demod.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
##################################################
# GNU Radio Python Flow Graph
# Title: Equisat Fm Demod
# Description: This flowgraph generates the flowgraph used in decode.py
# Generated: Mon Mar 11 19:26:09 2019
##################################################
from gnuradio import blocks
from gnuradio import digital
from gnuradio import eng_notation
from gnuradio import filter
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
import equisat_decoder
class equisat_fm_demod(gr.top_block):
def __init__(self, sample_rate=48000, wavfile=""):
gr.top_block.__init__(self, "Equisat Fm Demod")
##################################################
# Parameters
##################################################
self.sample_rate = sample_rate
self.wavfile = wavfile
##################################################
# Variables
##################################################
self.symbol_depth = symbol_depth = 40
self.decimation = decimation = 2
self.variable_rrc_filter_taps_0 = variable_rrc_filter_taps_0 = firdes.root_raised_cosine(1.0, sample_rate/decimation, 4800, 0.2, symbol_depth*(sample_rate/decimation/4800))
self.gain_mu = gain_mu = 0.050
##################################################
# Blocks
##################################################
self.message_store_block_raw = blocks.message_debug()
self.message_store_block_corrected = blocks.message_debug()
self.fir_filter_xxx_0 = filter.fir_filter_fff(decimation, (variable_rrc_filter_taps_0))
self.fir_filter_xxx_0.declare_sample_delay(0)
self.equisat_decoder_equisat_fec_decoder_0 = equisat_decoder.equisat_fec_decoder()
self.equisat_decoder_equisat_4fsk_preamble_detect_0 = equisat_decoder.equisat_4fsk_preamble_detect(255,0.33, 40)
self.equisat_decoder_equisat_4fsk_block_decode_0 = equisat_decoder.equisat_4fsk_block_decode(255, False)
self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff((sample_rate/decimation)/4800.0, 0.25*gain_mu*gain_mu, 0.5, gain_mu, 0.005)
self.blocks_wavfile_source_0 = blocks.wavfile_source(wavfile, False)
self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff((10, ))
self.blocks_message_debug_0 = blocks.message_debug()
##################################################
# Connections
##################################################
self.msg_connect((self.equisat_decoder_equisat_4fsk_block_decode_0, 'out'), (self.equisat_decoder_equisat_fec_decoder_0, 'in'))
self.msg_connect((self.equisat_decoder_equisat_4fsk_block_decode_0, 'out'), (self.message_store_block_raw, 'store'))
self.msg_connect((self.equisat_decoder_equisat_4fsk_preamble_detect_0, 'out'), (self.equisat_decoder_equisat_4fsk_block_decode_0, 'in'))
self.msg_connect((self.equisat_decoder_equisat_fec_decoder_0, 'out'), (self.message_store_block_corrected, 'store'))
self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.fir_filter_xxx_0, 0))
self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_multiply_const_vxx_0_0, 0))
self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.equisat_decoder_equisat_4fsk_preamble_detect_0, 0))
self.connect((self.fir_filter_xxx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0))
def get_sample_rate(self):
return self.sample_rate
def set_sample_rate(self, sample_rate):
self.sample_rate = sample_rate
self.digital_clock_recovery_mm_xx_0.set_omega((self.sample_rate/self.decimation)/4800.0)
def get_wavfile(self):
return self.wavfile
def set_wavfile(self, wavfile):
self.wavfile = wavfile
def get_symbol_depth(self):
return self.symbol_depth
def set_symbol_depth(self, symbol_depth):
self.symbol_depth = symbol_depth
def get_decimation(self):
return self.decimation
def set_decimation(self, decimation):
self.decimation = decimation
self.digital_clock_recovery_mm_xx_0.set_omega((self.sample_rate/self.decimation)/4800.0)
def get_variable_rrc_filter_taps_0(self):
return self.variable_rrc_filter_taps_0
def set_variable_rrc_filter_taps_0(self, variable_rrc_filter_taps_0):
self.variable_rrc_filter_taps_0 = variable_rrc_filter_taps_0
self.fir_filter_xxx_0.set_taps((self.variable_rrc_filter_taps_0))
def get_gain_mu(self):
return self.gain_mu
def set_gain_mu(self, gain_mu):
self.gain_mu = gain_mu
self.digital_clock_recovery_mm_xx_0.set_gain_omega(0.25*self.gain_mu*self.gain_mu)
self.digital_clock_recovery_mm_xx_0.set_gain_mu(self.gain_mu)
def argument_parser():
description = 'This flowgraph generates the flowgraph used in decode.py'
parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
parser.add_option(
"", "--sample-rate", dest="sample_rate", type="intx", default=48000,
help="Set Sample Rate [default=%default]")
parser.add_option(
"", "--wavfile", dest="wavfile", type="string", default="",
help="Set Input WAV File [default=%default]")
return parser
def main(top_block_cls=equisat_fm_demod, options=None):
if options is None:
options, _ = argument_parser().parse_args()
tb = top_block_cls(sample_rate=options.sample_rate, wavfile=options.wavfile)
tb.start()
tb.wait()
if __name__ == '__main__':
main()