8magsvn
No changes between revisions
/ezcap/uhd_wbfm_receive.py |
---|
@@ -0,0 +1,268 @@ |
#!/usr/bin/env python |
################################################## |
# Gnuradio Python Flow Graph |
# Title: UHD WBFM Receive |
# Author: Example |
# Description: WBFM Receive |
# Generated: Thu May 24 20:00:08 2012 |
################################################## |
from PyQt4 import Qt |
from gnuradio import audio |
from gnuradio import blks2 |
from gnuradio import eng_notation |
from gnuradio import gr |
from gnuradio.eng_option import eng_option |
from gnuradio.gr import firdes |
from gnuradio.qtgui import qtgui |
from optparse import OptionParser |
import PyQt4.Qwt5 as Qwt |
import baz |
import sip |
import sys |
class uhd_wbfm_receive(gr.top_block, Qt.QWidget): |
def __init__(self, audio_output="", freq=107.6e6, gain=10, address="addr=192.168.10.2", samp_rate=1056e3): |
gr.top_block.__init__(self, "UHD WBFM Receive") |
Qt.QWidget.__init__(self) |
self.setWindowTitle("UHD WBFM Receive") |
self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) |
self.top_scroll_layout = Qt.QVBoxLayout() |
self.setLayout(self.top_scroll_layout) |
self.top_scroll = Qt.QScrollArea() |
self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) |
self.top_scroll_layout.addWidget(self.top_scroll) |
self.top_scroll.setWidgetResizable(True) |
self.top_widget = Qt.QWidget() |
self.top_scroll.setWidget(self.top_widget) |
self.top_layout = Qt.QVBoxLayout(self.top_widget) |
self.top_grid_layout = Qt.QGridLayout() |
self.top_layout.addLayout(self.top_grid_layout) |
################################################## |
# Parameters |
################################################## |
self.audio_output = audio_output |
self.freq = freq |
self.gain = gain |
self.address = address |
self.samp_rate = samp_rate |
################################################## |
# Variables |
################################################## |
self.volume = volume = 2 |
self.tun_gain = tun_gain = gain |
self.tun_freq = tun_freq = 9.30825e+07 |
self.fine = fine = 0 |
self.audio_decim = audio_decim = 22 |
################################################## |
# Blocks |
################################################## |
self._volume_layout = Qt.QVBoxLayout() |
self._volume_knob = Qwt.QwtKnob() |
self._volume_knob.setRange(0, 10, 1e-3) |
self._volume_knob.setValue(self.volume) |
self._volume_knob.valueChanged.connect(self.set_volume) |
self._volume_layout.addWidget(self._volume_knob) |
self._volume_label = Qt.QLabel("Volume") |
self._volume_label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignHCenter) |
self._volume_layout.addWidget(self._volume_label) |
self.top_layout.addLayout(self._volume_layout) |
self._tun_gain_layout = Qt.QVBoxLayout() |
self._tun_gain_knob = Qwt.QwtKnob() |
self._tun_gain_knob.setRange(0, 20, 1e-2) |
self._tun_gain_knob.setValue(self.tun_gain) |
self._tun_gain_knob.valueChanged.connect(self.set_tun_gain) |
self._tun_gain_layout.addWidget(self._tun_gain_knob) |
self._tun_gain_label = Qt.QLabel("tun_gain") |
self._tun_gain_label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignHCenter) |
self._tun_gain_layout.addWidget(self._tun_gain_label) |
self.top_layout.addLayout(self._tun_gain_layout) |
self._tun_freq_layout = Qt.QVBoxLayout() |
self._tun_freq_tool_bar = Qt.QToolBar(self) |
self._tun_freq_layout.addWidget(self._tun_freq_tool_bar) |
self._tun_freq_tool_bar.addWidget(Qt.QLabel("Freq (Hz)"+": ")) |
self._tun_freq_counter = Qwt.QwtCounter() |
self._tun_freq_counter.setRange(80e6, 110e6, 1e-2) |
self._tun_freq_counter.setNumButtons(2) |
self._tun_freq_counter.setValue(self.tun_freq) |
self._tun_freq_tool_bar.addWidget(self._tun_freq_counter) |
self._tun_freq_counter.valueChanged.connect(self.set_tun_freq) |
self._tun_freq_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot) |
self._tun_freq_slider.setRange(80e6, 110e6, 1e-2) |
self._tun_freq_slider.setValue(self.tun_freq) |
self._tun_freq_slider.setMinimumWidth(200) |
self._tun_freq_slider.valueChanged.connect(self.set_tun_freq) |
self._tun_freq_layout.addWidget(self._tun_freq_slider) |
self.top_layout.addLayout(self._tun_freq_layout) |
self._fine_layout = Qt.QVBoxLayout() |
self._fine_tool_bar = Qt.QToolBar(self) |
self._fine_layout.addWidget(self._fine_tool_bar) |
self._fine_tool_bar.addWidget(Qt.QLabel("fine"+": ")) |
self._fine_counter = Qwt.QwtCounter() |
self._fine_counter.setRange(-1e-1, 1e-1, 1e-3) |
self._fine_counter.setNumButtons(2) |
self._fine_counter.setValue(self.fine) |
self._fine_tool_bar.addWidget(self._fine_counter) |
self._fine_counter.valueChanged.connect(self.set_fine) |
self._fine_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot) |
self._fine_slider.setRange(-1e-1, 1e-1, 1e-3) |
self._fine_slider.setValue(self.fine) |
self._fine_slider.setMinimumWidth(200) |
self._fine_slider.valueChanged.connect(self.set_fine) |
self._fine_layout.addWidget(self._fine_slider) |
self.top_layout.addLayout(self._fine_layout) |
self.rtl2832_source_0 = baz.rtl_source_c(defer_creation=True) |
self.rtl2832_source_0.set_verbose(True) |
self.rtl2832_source_0.set_vid(0x0) |
self.rtl2832_source_0.set_pid(0x0) |
self.rtl2832_source_0.set_tuner_name("e4000") |
self.rtl2832_source_0.set_default_timeout(0) |
self.rtl2832_source_0.set_use_buffer(True) |
self.rtl2832_source_0.set_fir_coefficients(([])) |
if self.rtl2832_source_0.create() == False: raise Exception("Failed to create RTL2832 Source: rtl2832_source_0") |
self.rtl2832_source_0.set_sample_rate(samp_rate) |
self.rtl2832_source_0.set_frequency(tun_freq+fine) |
self.rtl2832_source_0.set_auto_gain_mode(False) |
self.rtl2832_source_0.set_relative_gain(True) |
self.rtl2832_source_0.set_gain(tun_gain) |
self.qtgui_sink_x_0 = qtgui.sink_c( |
1024, #fftsize |
firdes.WIN_BLACKMAN_hARRIS, #wintype |
0, #fc |
samp_rate, #bw |
"QT GUI Plot", #name |
True, #plotfreq |
True, #plotwaterfall |
True, #plottime |
True, #plotconst |
) |
self._qtgui_sink_x_0_win = sip.wrapinstance(self.qtgui_sink_x_0.pyqwidget(), Qt.QWidget) |
self.top_layout.addWidget(self._qtgui_sink_x_0_win) |
self.low_pass_filter_0 = gr.fir_filter_ccf(1, firdes.low_pass( |
1, samp_rate, 115e3, 30e3, firdes.WIN_HANN, 6.76)) |
self.gr_multiply_const_vxx = gr.multiply_const_vff((volume, )) |
self.blks2_wfm_rcv = blks2.wfm_rcv( |
quad_rate=samp_rate, |
audio_decimation=audio_decim, |
) |
self.audio_sink = audio.sink(int(samp_rate/audio_decim), audio_output, True) |
################################################## |
# Connections |
################################################## |
self.connect((self.gr_multiply_const_vxx, 0), (self.audio_sink, 0)) |
self.connect((self.blks2_wfm_rcv, 0), (self.gr_multiply_const_vxx, 0)) |
self.connect((self.low_pass_filter_0, 0), (self.blks2_wfm_rcv, 0)) |
self.connect((self.rtl2832_source_0, 0), (self.low_pass_filter_0, 0)) |
self.connect((self.low_pass_filter_0, 0), (self.qtgui_sink_x_0, 0)) |
def get_audio_output(self): |
return self.audio_output |
def set_audio_output(self, audio_output): |
self.audio_output = audio_output |
def get_freq(self): |
return self.freq |
def set_freq(self, freq): |
self.freq = freq |
def get_gain(self): |
return self.gain |
def set_gain(self, gain): |
self.gain = gain |
self.set_tun_gain(self.gain) |
def get_address(self): |
return self.address |
def set_address(self, address): |
self.address = address |
def get_samp_rate(self): |
return self.samp_rate |
def set_samp_rate(self, samp_rate): |
self.samp_rate = samp_rate |
self.rtl2832_source_0.set_sample_rate(self.samp_rate) |
self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, 115e3, 30e3, firdes.WIN_HANN, 6.76)) |
self.qtgui_sink_x_0.set_frequency_range(0, self.samp_rate) |
def get_volume(self): |
return self.volume |
def set_volume(self, volume): |
self.volume = volume |
self.gr_multiply_const_vxx.set_k((self.volume, )) |
self._volume_knob.setValue(self.volume) |
def get_tun_gain(self): |
return self.tun_gain |
def set_tun_gain(self, tun_gain): |
self.tun_gain = tun_gain |
self.rtl2832_source_0.set_gain(self.tun_gain) |
self._tun_gain_knob.setValue(self.tun_gain) |
def get_tun_freq(self): |
return self.tun_freq |
def set_tun_freq(self, tun_freq): |
self.tun_freq = tun_freq |
self.rtl2832_source_0.set_frequency(self.tun_freq+self.fine) |
self._tun_freq_counter.setValue(self.tun_freq) |
self._tun_freq_slider.setValue(self.tun_freq) |
def get_fine(self): |
return self.fine |
def set_fine(self, fine): |
self.fine = fine |
self.rtl2832_source_0.set_frequency(self.tun_freq+self.fine) |
self._fine_counter.setValue(self.fine) |
self._fine_slider.setValue(self.fine) |
def get_audio_decim(self): |
return self.audio_decim |
def set_audio_decim(self, audio_decim): |
self.audio_decim = audio_decim |
if __name__ == '__main__': |
parser = OptionParser(option_class=eng_option, usage="%prog: [options]") |
parser.add_option("-O", "--audio-output", dest="audio_output", type="string", default="", |
help="Set Audio Output Device [default=%default]") |
parser.add_option("-f", "--freq", dest="freq", type="eng_float", default=eng_notation.num_to_str(107.6e6), |
help="Set Default Frequency [default=%default]") |
parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(10), |
help="Set Default Gain [default=%default]") |
parser.add_option("-a", "--address", dest="address", type="string", default="addr=192.168.10.2", |
help="Set IP Address [default=%default]") |
parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(1056e3), |
help="Set Sample Rate [default=%default]") |
(options, args) = parser.parse_args() |
qapp = Qt.QApplication(sys.argv) |
tb = uhd_wbfm_receive(audio_output=options.audio_output, freq=options.freq, gain=options.gain, address=options.address, samp_rate=options.samp_rate) |
tb.start() |
tb.show() |
qapp.exec_() |
tb.stop() |