summaryrefslogtreecommitdiff
path: root/gr-uhd/apps/hf_radio
diff options
context:
space:
mode:
Diffstat (limited to 'gr-uhd/apps/hf_radio')
-rw-r--r--gr-uhd/apps/hf_radio/.gitignore3
-rw-r--r--gr-uhd/apps/hf_radio/Makefile.am39
-rw-r--r--gr-uhd/apps/hf_radio/README.TXT60
-rw-r--r--gr-uhd/apps/hf_radio/hfir.sci59
-rw-r--r--gr-uhd/apps/hf_radio/input.py46
-rw-r--r--gr-uhd/apps/hf_radio/output.py17
-rwxr-xr-xgr-uhd/apps/hf_radio/radio.py304
-rw-r--r--gr-uhd/apps/hf_radio/radio.xml441
-rw-r--r--gr-uhd/apps/hf_radio/ssb_taps1023
-rw-r--r--gr-uhd/apps/hf_radio/ssbagc.py48
-rw-r--r--gr-uhd/apps/hf_radio/ssbdemod.py97
-rw-r--r--gr-uhd/apps/hf_radio/startup.py1
-rwxr-xr-xgr-uhd/apps/hf_radio/ui.py295
13 files changed, 2433 insertions, 0 deletions
diff --git a/gr-uhd/apps/hf_radio/.gitignore b/gr-uhd/apps/hf_radio/.gitignore
new file mode 100644
index 000000000..b6950912c
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/.gitignore
@@ -0,0 +1,3 @@
+/Makefile
+/Makefile.in
+/*.pyc
diff --git a/gr-uhd/apps/hf_radio/Makefile.am b/gr-uhd/apps/hf_radio/Makefile.am
new file mode 100644
index 000000000..e514076f6
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/Makefile.am
@@ -0,0 +1,39 @@
+#
+# Copyright 2006,2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+include $(top_srcdir)/Makefile.common
+
+ourdatadir = $(exampledir)/hf_radio
+
+dist_ourdata_DATA = \
+ hfir.sci \
+ radio.xml \
+ input.py \
+ output.py \
+ README.TXT \
+ ssbagc.py \
+ ssbdemod.py \
+ startup.py \
+ ssb_taps
+
+dist_ourdata_SCRIPTS = \
+ radio.py \
+ ui.py
diff --git a/gr-uhd/apps/hf_radio/README.TXT b/gr-uhd/apps/hf_radio/README.TXT
new file mode 100644
index 000000000..7c7edf5e0
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/README.TXT
@@ -0,0 +1,60 @@
+# 2008-02-07
+#
+# These files have not yet been update to use the new top_block/hier_block2
+# interfaces. Until someone does that, this files will no longer run.
+#
+
+
+The files in this directory implement a fairly simple HF radio that works
+with the basic rx daughter board on the USRP.
+
+Many thanks to the Gnu Radio folks for a great new way to waste large blocks
+of time in infinitely tweaking a huge number of free parameters.
+
+Start the receiver by running the radio.py in this directory. Or from the
+Python prompt type "from radio import *" and you'll get the prompt back
+with the receiver running. You can then poke around to see what's going on.
+
+There are two spectrum displays. One is the output of the USRP and displays
+about 300KHz of bandwidth centered at the current tuning freq. The other
+displays the output spectrum of the demodulator.
+
+The demodulator does AM demod using the complex modulus block from gr. It
+does SSB demod using the frequency translating fir filter as a complex
+hilbert transformer. The taps for this filter were generated using a program
+called Scilab and the Scilab program in the file hfir.sci. More details in
+the associated files.
+
+Tune the receiver using the spin buttons under the big frequency display.
+
+The agc block is a roll your own. The standard agc in the newer CVS updates
+seems to work but doesn't seem to have adjustable time constants or provide
+access to internal signal nodes which are used for the RSSI.
+
+The AGC authority (a sort of gain parameter) and the reference level used
+in the power to dB computagion can be adjusted using the spin buttons.
+
+The audio bandwidth can be similarly adjusted from about 50Hz to 10KHz.
+
+The GUI layout was produced using wxGlade. The file radio.xml is the GUI
+specification. It will produce a file called ui.py which is subclassed
+by classes defined in radio.py. The ui.py is purely generated by wxGlade
+all app specific code for the GUI is in radio.py.
+
+Most of the actual signal processing code is built up in the other included
+files using the hierarchical block facilities. This organization should
+make it easier to tweak to your heart's content.
+
+Known bugs weakness and other
+
+wxPython and wxGlade seem to conspire to insure that the layout can never
+be exactly what you have in mind.
+
+Some of the controls don't behave as one might like. wx spin controls
+and spin boxes only support integers so it is rather a nuisance to make
+units come out nice. In the process of development I came up with a reasonable
+kluge so there is a mixture of approaches.
+
+Enjoy.
+
+M. Revnell 2006-Jan-06
diff --git a/gr-uhd/apps/hf_radio/hfir.sci b/gr-uhd/apps/hf_radio/hfir.sci
new file mode 100644
index 000000000..a2d5e2a62
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/hfir.sci
@@ -0,0 +1,59 @@
+// designs a complex tap fir filter akin to the hilbert transformer.
+//
+// The hilbert transformer is classified as a linear phase fir
+// with allpass magnitude response and 90 degree phase response for
+// positive frequencies and -90 degrees phase for negative frequencies.
+// Or, if you prefer, normalized frequencies between .5 and 1 since
+// negative frequencies don't really have much meaning outside the complex
+// domain.
+//
+// Normally one would use the hilbert transformer in one leg of a complex
+// processing block and a compensating delay in the other.
+//
+// This one differs in the following respects:
+// It is low pass with a cutoff of .078125
+// The filter is a lowpass kaiser windowed filter with parameter 3
+// The phase response is 45 degrees for positive frequencies and -45
+// for negative frequencies.
+// The coefficent set is used in one path and the same coefficients
+// are used time reversed in the other. This results in the net effect
+// of +/- 90 degrees as in the usual hilbert application.
+//
+// The coefficient set can be used in the gnuradio frequency translating
+// fir filter for ssb demodulation.
+//
+// This isn't as computationally efficient as using the hilbert transformer
+// and compensating delay but fascinating none the less.
+//
+// This program is for the scilab language a very powerful free math
+// package similar to Matlab with infinitely better price/performace.
+//
+// compute the prototype lowpass fir
+// length is 255 (odd) for the same symmetry reasons as the hilbert transformer
+
+len = 1023;
+l2 = floor(len/2);
+md = l2 + 1;
+l3 = md + 1;
+
+h = wfir( 'lp', len, [10.0/256 0], 'kr', [3 0] );
+
+H = fft(h);
+
+H(1:l2)=H(1:l2)*exp(%i*%pi/4);
+H(md)=0+%i*0;
+H(l3:len)=H(l3:len)*exp(-%i*%pi/4);
+
+j=real(ifft(H));
+k(1:len)=j(len:-1:1);
+x=j+%i.*k;
+X=fft(x);
+plot(abs(X))
+
+f = file('open','taps')
+for i=(1:len)
+ fprintf( f, '%f%+fj', j(i), k(i) )
+end
+
+file('close',f)
+
diff --git a/gr-uhd/apps/hf_radio/input.py b/gr-uhd/apps/hf_radio/input.py
new file mode 100644
index 000000000..5984d8254
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/input.py
@@ -0,0 +1,46 @@
+# Basic USRP setup and control.
+# It's only ever been tried with a basic rx daughter card.
+#
+# Imagine that the gnuradio boilerplate is here.
+#
+# M. Revnell 2005-Dec
+
+from gnuradio import gr, gru, optfir
+from gnuradio import usrp
+from usrpm import usrp_dbid
+import math
+
+# Put special knowlege of usrp here.
+
+class input:
+ def __init__( self, decim ):
+ self.freq = -2.5e6
+ self.src = usrp.source_c( )
+ self.subdev = usrp.pick_subdev( self.src,
+ (usrp_dbid.BASIC_RX,
+ usrp_dbid.TV_RX,
+ usrp_dbid.TV_RX_REV_2,
+ usrp_dbid.TV_RX_REV_3,
+ usrp_dbid.TV_RX_MIMO,
+ usrp_dbid.TV_RX_REV_2_MIMO,
+ usrp_dbid.TV_RX_REV_3_MIMO))
+
+ print self.subdev
+
+ self.subdevice = usrp.selected_subdev( self.src,
+ self.subdev )
+
+ self.mux = usrp.determine_rx_mux_value( self.src,
+ self.subdev )
+ self.decim = decim
+
+ self.adc_rate = self.src.adc_rate()
+ self.usrp_rate = self.adc_rate / self.decim
+ self.src.set_decim_rate( self.decim )
+ self.src.set_mux( self.mux )
+ usrp.tune( self.src, 0, self.subdevice, self.freq )
+
+ def set_freq( self, x ):
+ r = usrp.tune( self.src, 0, self.subdevice, -x )
+ if r:
+ self.freq = -x
diff --git a/gr-uhd/apps/hf_radio/output.py b/gr-uhd/apps/hf_radio/output.py
new file mode 100644
index 000000000..dc9caf528
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/output.py
@@ -0,0 +1,17 @@
+# Audio output with a volume control.
+#
+# M. Revnell 2005-Dec
+
+from gnuradio import gr, gru
+from gnuradio import audio
+
+class output( gr.hier_block ):
+ def __init__( self, fg, rate ):
+ self.out = audio.sink( rate )
+ self.vol = gr.multiply_const_ff( 0.1 )
+ fg.connect( self.vol, self.out )
+ gr.hier_block.__init__(self, fg, self.vol, None )
+
+ def set( self, val ):
+ self.vol.set_k( val )
+
diff --git a/gr-uhd/apps/hf_radio/radio.py b/gr-uhd/apps/hf_radio/radio.py
new file mode 100755
index 000000000..9f444b916
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/radio.py
@@ -0,0 +1,304 @@
+#!/usr/bin/env python
+
+# GUI interactions and high level connections handled here.
+#
+# Interacts with classes defined by wxGlade in ui.py.
+#
+# The usual gnuradio copyright boilerplate incorperated here by reference.
+#
+# M. Revnell 2006-Jan
+
+from threading import *
+import wx
+import wx.lib.evtmgr as em
+import time
+
+from gnuradio import gr, gru, eng_notation, optfir
+from gnuradio import audio
+from gnuradio import usrp
+from gnuradio import blks
+from gnuradio.wxgui import fftsink
+from gnuradio.wxgui import waterfallsink
+from gnuradio.wxgui import scopesink
+
+from input import *
+from output import *
+from ssbdemod import *
+from ssbagc import *
+from ui import *
+from math import log10
+
+class graph( gr.hier_block ):
+ def __init__( self, fg ):
+ self.graph = fg
+ self.fe_decim = 250
+ self.src = input( self.fe_decim )
+ self.adc_rate = self.src.adc_rate
+ self.fe_rate = self.adc_rate / self.fe_decim
+ self.filter_decim = 1
+ self.audio_decim = 16
+ self.demod_rate = self.fe_rate / self.filter_decim
+ self.audio_rate = self.demod_rate / self.audio_decim
+
+ self.demod = ssb_demod( fg, self.demod_rate, self.audio_rate )
+ self.agc = agc( fg )
+ #self.agc = gr.agc_ff()
+ self.out = output( fg, self.audio_rate )
+
+ fg.connect( self.src.src,
+ self.demod,
+ self.agc,
+ self.out )
+
+ gr.hier_block.__init__( self, fg, None, None )
+
+ def tune( self, freq ):
+ fe_target = -freq
+ self.src.set_freq( fe_target )
+ fe_freq = self.src.src.rx_freq( 0 )
+ demod_cf = fe_target - fe_freq
+ self.demod.tune( demod_cf )
+
+class radio_frame( ui_frame ):
+ def __init__( self, block, *args, **kwds ):
+ ui_frame.__init__( self, *args, **kwds )
+ self.block = block
+ self.freq_disp.SetRange(0, 30e6)
+ f = self.block.src.freq
+ self.freq_disp.SetValue( -f )
+ self.volume.SetRange( 0, 20 )
+ self.pga.SetRange( 0, 20 )
+ self.rssi_range = 1
+ self.rssi.SetRange( self.rssi_range )
+ self.agc_max.SetValue( str( self.rssi_range ) )
+ self.spin_e0.SetValue( 50 )
+ self.spin_e1.SetValue( 50 )
+ self.spin_e2.SetValue( 50 )
+ self.spin_e3.SetValue( 50 )
+ self.spin_e4.SetValue( 50 )
+ self.spin_e5.SetValue( 50 )
+ self.spin_e6.SetValue( 50 )
+ bw = 3.3e3
+ self.bandwidth.SetValue( str( bw ) )
+ self.block.demod.set_bw( bw )
+ self.bw_spin.SetValue( 5 )
+ agc_gain = self.block.agc.gain.k()
+ self.agc_gain_s.SetValue( 5 )
+ self.agc_gain.SetValue( str( agc_gain ) )
+ agc_ref = self.block.agc.offs.k()
+ self.agc_ref.SetValue( str( agc_ref ) )
+ self.agc_ref_s.SetValue( 5 )
+
+ self.fespectrum = fftsink.fft_sink_c(
+ self.block.graph,
+ self.fe_panel,
+ fft_size=512,
+ sample_rate = block.fe_rate,
+ baseband_freq = 0,
+ average = False,
+ size = ( 680, 140 ) )
+
+ self.ifspectrum = fftsink.fft_sink_c(
+ self.block.graph,
+ self.if_panel,
+ fft_size=512,
+ sample_rate = block.audio_rate,
+ baseband_freq = 0,
+ average = False,
+ size = ( 680, 140 ) )
+
+ em.eventManager.Register( self.fe_mouse,
+ wx.EVT_MOTION,
+ self.fespectrum.win )
+
+ em.eventManager.Register( self.fe_click,
+ wx.EVT_LEFT_DOWN,
+ self.fespectrum.win )
+
+ block.graph.connect( block.src.src, self.fespectrum )
+ block.graph.connect( block.demod.xlate, self.ifspectrum )
+
+ def agc_ref_up( self, event ):
+ self.agc_ref_s.SetValue( 5 )
+ r = float( self.agc_ref.GetValue() )
+ r = r + 5
+ self.agc_ref.SetValue( str( r ) )
+ self.block.agc.offs.set_k( r )
+
+ def agc_ref_down( self, event ):
+ self.agc_ref_s.SetValue( 5 )
+ r = float( self.agc_ref.GetValue() )
+ r = r - 5
+ self.agc_ref.SetValue( str( r ) )
+ self.block.agc.offs.set_k( r )
+
+ def agc_gain_up( self, event ):
+ self.agc_gain_s.SetValue( 5 )
+ g = float(self.agc_gain.GetValue())
+ g = g + 10
+ self.agc_gain.SetValue( str( g ) )
+ self.block.agc.gain.set_k( g )
+
+ def agc_gain_down( self, event ):
+ self.agc_gain_s.SetValue( 5 )
+ g = float(self.agc_gain.GetValue())
+ g = g - 10
+ self.agc_gain.SetValue( str( g ) )
+ self.block.agc.gain.set_k( g )
+
+ def fe_mouse( self, event ):
+ f = int(self.freq_disp.GetValue())
+ f = f+((event.GetX()-346.)*(400./610.))*1000
+ self.fespectrum.win.SetToolTip(
+ wx.ToolTip( eng_notation.num_to_str(f)))
+
+ def fe_click( self, event ):
+ f = int(self.freq_disp.GetValue())
+ f = f+((event.GetX()-346.)*(400./610.))*1000
+ self.tune( f )
+
+ def setrssi( self, level ):
+ if level < 0:
+ level = 0
+ if level > self.rssi_range:
+ self.rssi_range = level
+ self.rssi.SetRange( level )
+ self.agc_max.SetValue( str( level ))
+ self.rssi.SetValue( level )
+ self.agc_level.SetValue( str( level ))
+
+ def tune_evt( self, event ):
+ f = self.freq_disp.GetValue()
+ self.tune( f )
+
+ def tune( self, frequency ):
+ self.freq_disp.SetValue( frequency )
+ self.block.tune( frequency )
+
+ def up_e0( self, event ):
+ self.spin_e0.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e0 )
+
+ def down_e0( self, event ):
+ self.spin_e0.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e0 )
+
+ def up_e1( self, event ):
+ self.spin_e1.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e1 )
+
+ def down_e1( self, event ):
+ self.spin_e1.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e1 )
+
+ def up_e2( self, event ):
+ self.spin_e2.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e2 )
+
+ def down_e2( self, event ):
+ self.spin_e2.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e2 )
+
+ def up_e3( self, event ):
+ self.spin_e3.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e3 )
+
+ def down_e3( self, event ):
+ self.spin_e3.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e3 )
+
+ def up_e4( self, event ):
+ self.spin_e4.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e4 )
+
+ def down_e4( self, event ):
+ self.spin_e4.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e4 )
+
+ def up_e5( self, event ):
+ self.spin_e5.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e5 )
+
+ def down_e5( self, event ):
+ self.spin_e5.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e5 )
+
+ def up_e6( self, event ):
+ self.spin_e6.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() + 1e6 )
+
+ def down_e6( self, event ):
+ self.spin_e6.SetValue( 50 )
+ self.tune( self.freq_disp.GetValue() - 1e6 )
+
+ def event_pga( self, event ):
+ self.block.src.src.set_pga( 0, self.pga.GetValue())
+
+ def event_vol( self, event ):
+ self.block.out.set( self.volume.GetValue()/20.0 )
+
+ def set_usb( self, event ):
+ self.block.demod.upper_sb()
+
+ def set_lsb( self, event ):
+ self.block.demod.lower_sb()
+
+ def set_am( self, event ):
+ self.block.demod.set_am()
+
+ def bw_up( self, event ):
+ self.bw_spin.SetValue( 5 )
+ bw = float(self.bandwidth.GetValue())
+ bw = bw + 20.0
+ if bw > 10e3:
+ bw = 10e3
+ self.bandwidth.SetValue( str( bw ) )
+ self.block.demod.set_bw( bw )
+
+ def bw_down( self, event ):
+ self.bw_spin.SetValue( 5 )
+ bw = float(self.bandwidth.GetValue())
+ bw = bw - 20.0
+ if bw < 50:
+ bw = 50
+ self.bandwidth.SetValue( str( bw ) )
+ self.block.demod.set_bw( bw )
+
+
+class radio( wx.App ):
+ def OnInit( self ):
+ self.graph = gr.flow_graph()
+ self.block = graph( self.graph )
+ self.frame = radio_frame( self.block, None, -1, "Title" )
+ self.frame.Show( True )
+ self.SetTopWindow( self.frame )
+ return True
+
+a=radio( 0 )
+
+l=gr.probe_signal_f()
+#l=gr.probe_avg_mag_sqrd_f(1,.001)
+a.graph.connect(a.block.agc.offs,l )
+#a.graph.connect(a.block.demod,l)
+
+def main_function():
+ global a
+ a.MainLoop()
+
+
+def rssi_function():
+ global a
+ global l
+ while 1:
+ level = l.level()
+ wx.CallAfter( a.frame.setrssi, level )
+ time.sleep( .1 )
+
+thread1 = Thread( target = main_function )
+thread2 = Thread( target = rssi_function )
+
+thread1.start()
+thread2.start()
+
+a.graph.start()
+
diff --git a/gr-uhd/apps/hf_radio/radio.xml b/gr-uhd/apps/hf_radio/radio.xml
new file mode 100644
index 000000000..81daa19b0
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/radio.xml
@@ -0,0 +1,441 @@
+<?xml version="1.0"?>
+<!-- generated by wxGlade 0.4 on Fri Jan 6 09:51:36 2006 -->
+
+<application path="/root/radio/ui.py" name="" class="" option="0" language="python" top_window="" encoding="UTF-8" use_gettext="0" overwrite="0" use_new_namespace="1" for_version="2.6">
+ <object class="ui_frame" name="frame_1" base="EditFrame">
+ <style>wxDEFAULT_FRAME_STYLE</style>
+ <title>frame_1</title>
+ <object class="wxStaticBoxSizer" name="sizer_1" base="EditStaticBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <label>sizer_1</label>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxBoxSizer" name="sizer_2" base="EditBoxSizer">
+ <orient>wxHORIZONTAL</orient>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxBoxSizer" name="sizer_3" base="EditBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <flag>wxEXPAND|wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxSpinCtrl" name="freq_disp" base="EditSpinCtrl">
+ <font>
+ <size>32</size>
+ <family>default</family>
+ <style>normal</style>
+ <weight>normal</weight>
+ <underlined>0</underlined>
+ <face></face>
+ </font>
+ <events>
+ <handler event="EVT_SPINCTRL">tune_evt</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxGridSizer" name="grid_sizer_1" base="EditGridSizer">
+ <hgap>0</hgap>
+ <rows>2</rows>
+ <cols>3</cols>
+ <vgap>0</vgap>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxGridSizer" name="grid_sizer_2" base="EditGridSizer">
+ <hgap>0</hgap>
+ <rows>1</rows>
+ <cols>7</cols>
+ <vgap>0</vgap>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e6" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e6</handler>
+ <handler event="EVT_SPIN_DOWN">down_e6</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e5" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e5</handler>
+ <handler event="EVT_SPIN_DOWN">down_e5</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e4" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e4</handler>
+ <handler event="EVT_SPIN_DOWN">down_e4</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e3" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e3</handler>
+ <handler event="EVT_SPIN_DOWN">down_e3</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e2" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e2</handler>
+ <handler event="EVT_SPIN_DOWN">down_e2</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e1" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e1</handler>
+ <handler event="EVT_SPIN_DOWN">down_e1</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="spin_e0" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">up_e0</handler>
+ <handler event="EVT_SPIN_DOWN">down_e0</handler>
+ </events>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxPanel" name="panel_1" base="EditPanel">
+ <style>wxTAB_TRAVERSAL</style>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxPanel" name="panel_2" base="EditPanel">
+ <style>wxTAB_TRAVERSAL</style>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxButton" name="button_lsb" base="EditButton">
+ <label>LSB</label>
+ <events>
+ <handler event="EVT_BUTTON">set_lsb</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxButton" name="button_usb" base="EditButton">
+ <label>USB</label>
+ <events>
+ <handler event="EVT_BUTTON">set_usb</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxButton" name="button_am" base="EditButton">
+ <label>AM</label>
+ <events>
+ <handler event="EVT_BUTTON">set_am</handler>
+ </events>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxBoxSizer" name="sizer_4" base="EditBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxGridSizer" name="grid_sizer_3" base="EditGridSizer">
+ <hgap>0</hgap>
+ <rows>2</rows>
+ <cols>4</cols>
+ <vgap>0</vgap>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_1" base="EditStaticText">
+ <attribute>1</attribute>
+ <label>VOLUME</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_2" base="EditStaticText">
+ <attribute>1</attribute>
+ <label>PGA</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxTextCtrl" name="agc_level" base="EditTextCtrl">
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_6" base="EditStaticText">
+ <attribute>1</attribute>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinCtrl" name="volume" base="EditSpinCtrl">
+ <events>
+ <handler event="EVT_SPINCTRL">event_vol</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinCtrl" name="pga" base="EditSpinCtrl">
+ <events>
+ <handler event="EVT_SPINCTRL">event_pga</handler>
+ </events>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxTextCtrl" name="agc_max" base="EditTextCtrl">
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_7" base="EditStaticText">
+ <attribute>1</attribute>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxGridSizer" name="grid_sizer_4" base="EditGridSizer">
+ <hgap>0</hgap>
+ <rows>2</rows>
+ <cols>4</cols>
+ <vgap>0</vgap>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_4" base="EditStaticText">
+ <attribute>1</attribute>
+ <label>AGC AUTHORITY</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_5" base="EditStaticText">
+ <attribute>1</attribute>
+ <label>AGC REF LVL</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_3" base="EditStaticText">
+ <attribute>1</attribute>
+ <label>BANDWIDTH</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_8" base="EditStaticText">
+ <attribute>1</attribute>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxBoxSizer" name="sizer_6" base="EditBoxSizer">
+ <orient>wxHORIZONTAL</orient>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxTextCtrl" name="agc_gain" base="EditTextCtrl">
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="agc_gain_s" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">agc_gain_up</handler>
+ <handler event="EVT_SPIN_DOWN">agc_gain_down</handler>
+ </events>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxBoxSizer" name="sizer_7" base="EditBoxSizer">
+ <orient>wxHORIZONTAL</orient>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxTextCtrl" name="agc_ref" base="EditTextCtrl">
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="agc_ref_s" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">agc_ref_up</handler>
+ <handler event="EVT_SPIN_DOWN">agc_ref_down</handler>
+ </events>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxBoxSizer" name="sizer_5" base="EditBoxSizer">
+ <orient>wxHORIZONTAL</orient>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxTextCtrl" name="bandwidth" base="EditTextCtrl">
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxSpinButton" name="bw_spin" base="EditSpinButton">
+ <events>
+ <handler event="EVT_SPIN_UP">bw_up</handler>
+ <handler event="EVT_SPIN_DOWN">bw_down</handler>
+ </events>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>0</option>
+ <object class="wxStaticText" name="label_9" base="EditStaticText">
+ <attribute>1</attribute>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND|wxADJUST_MINSIZE</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxGauge" name="rssi" base="EditGauge">
+ <foreground>#ff0000</foreground>
+ <style>wxGA_HORIZONTAL|wxGA_SMOOTH</style>
+ <range>10</range>
+ <size>315, 10</size>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxPanel" name="fe_panel" base="EditPanel">
+ <style>wxTAB_TRAVERSAL</style>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <flag>wxEXPAND</flag>
+ <border>0</border>
+ <option>1</option>
+ <object class="wxPanel" name="if_panel" base="EditPanel">
+ <style>wxTAB_TRAVERSAL</style>
+ </object>
+ </object>
+ </object>
+ </object>
+</application>
diff --git a/gr-uhd/apps/hf_radio/ssb_taps b/gr-uhd/apps/hf_radio/ssb_taps
new file mode 100644
index 000000000..0ef3bbf26
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/ssb_taps
@@ -0,0 +1,1023 @@
+-0.000035-0.000009j
+-0.000066-0.000020j
+-0.000080-0.000044j
+-0.000084-0.000071j
+-0.000077-0.000100j
+-0.000063-0.000127j
+-0.000041-0.000150j
+-0.000013-0.000167j
+0.000020-0.000177j
+0.000054-0.000180j
+0.000089-0.000174j
+0.000121-0.000161j
+0.000150-0.000140j
+0.000173-0.000113j
+0.000188-0.000081j
+0.000196-0.000046j
+0.000194-0.000011j
+0.000184+0.000022j
+0.000165+0.000052j
+0.000139+0.000077j
+0.000107+0.000093j
+0.000071+0.000102j
+0.000034+0.000101j
+-0.000002+0.000090j
+-0.000036+0.000070j
+-0.000064+0.000042j
+-0.000086+0.000006j
+-0.000098-0.000034j
+-0.000101-0.000077j
+-0.000093-0.000120j
+-0.000076-0.000161j
+-0.000049-0.000197j
+-0.000014-0.000227j
+0.000026-0.000248j
+0.000071-0.000259j
+0.000117-0.000259j
+0.000162-0.000249j
+0.000203-0.000228j
+0.000237-0.000199j
+0.000263-0.000162j
+0.000279-0.000120j
+0.000284-0.000075j
+0.000278-0.000031j
+0.000260+0.000010j
+0.000232+0.000045j
+0.000196+0.000073j
+0.000153+0.000090j
+0.000106+0.000095j
+0.000059+0.000089j
+0.000014+0.000071j
+-0.000027+0.000041j
+-0.000059+0.000002j
+-0.000082-0.000046j
+-0.000093-0.000098j
+-0.000091-0.000152j
+-0.000077-0.000206j
+-0.000050-0.000255j
+-0.000012-0.000298j
+0.000034-0.000330j
+0.000088-0.000351j
+0.000145-0.000359j
+0.000202-0.000354j
+0.000256-0.000335j
+0.000304-0.000304j
+0.000343-0.000262j
+0.000370-0.000213j
+0.000384-0.000158j
+0.000384-0.000102j
+0.000369-0.000048j
+0.000341+0.000002j
+0.000302+0.000042j
+0.000252+0.000072j
+0.000196+0.000088j
+0.000137+0.000089j
+0.000078+0.000075j
+0.000024+0.000047j
+-0.000023+0.000005j
+-0.000059-0.000048j
+-0.000082-0.000109j
+-0.000090-0.000175j
+-0.000081-0.000242j
+-0.000058-0.000306j
+-0.000019-0.000364j
+0.000032-0.000411j
+0.000093-0.000445j
+0.000161-0.000465j
+0.000232-0.000467j
+0.000301-0.000453j
+0.000365-0.000423j
+0.000419-0.000379j
+0.000461-0.000323j
+0.000487-0.000259j
+0.000497-0.000190j
+0.000489-0.000121j
+0.000464-0.000056j
+0.000423+0.000001j
+0.000369+0.000046j
+0.000304+0.000076j
+0.000233+0.000089j
+0.000160+0.000083j
+0.000089+0.000060j
+0.000025+0.000018j
+-0.000027-0.000038j
+-0.000065-0.000107j
+-0.000086-0.000185j
+-0.000088-0.000266j
+-0.000071-0.000347j
+-0.000035-0.000422j
+0.000019-0.000487j
+0.000086-0.000538j
+0.000164-0.000573j
+0.000248-0.000588j
+0.000334-0.000582j
+0.000415-0.000557j
+0.000488-0.000513j
+0.000548-0.000452j
+0.000592-0.000379j
+0.000616-0.000297j
+0.000619-0.000213j
+0.000600-0.000130j
+0.000561-0.000054j
+0.000504+0.000010j
+0.000432+0.000058j
+0.000350+0.000086j
+0.000261+0.000093j
+0.000173+0.000078j
+0.000090+0.000040j
+0.000017-0.000017j
+-0.000040-0.000092j
+-0.000078-0.000180j
+-0.000095-0.000275j
+-0.000088-0.000374j
+-0.000058-0.000469j
+-0.000006-0.000555j
+0.000065-0.000627j
+0.000152-0.000681j
+0.000250-0.000712j
+0.000352-0.000720j
+0.000454-0.000703j
+0.000548-0.000663j
+0.000630-0.000601j
+0.000694-0.000521j
+0.000737-0.000428j
+0.000755-0.000327j
+0.000748-0.000225j
+0.000715-0.000128j
+0.000659-0.000042j
+0.000582+0.000028j
+0.000490+0.000077j
+0.000387+0.000101j
+0.000280+0.000099j
+0.000175+0.000070j
+0.000080+0.000015j
+-0.000001-0.000063j
+-0.000061-0.000159j
+-0.000097-0.000268j
+-0.000106-0.000385j
+-0.000087-0.000501j
+-0.000040-0.000611j
+0.000032-0.000708j
+0.000125-0.000786j
+0.000235-0.000839j
+0.000354-0.000866j
+0.000477-0.000863j
+0.000595-0.000831j
+0.000702-0.000772j
+0.000792-0.000688j
+0.000859-0.000585j
+0.000898-0.000469j
+0.000907-0.000347j
+0.000886-0.000227j
+0.000835-0.000115j
+0.000757-0.000019j
+0.000657+0.000055j
+0.000540+0.000102j
+0.000415+0.000119j
+0.000287+0.000103j
+0.000165+0.000056j
+0.000058-0.000020j
+-0.000029-0.000122j
+-0.000090-0.000243j
+-0.000121-0.000378j
+-0.000118-0.000517j
+-0.000082-0.000653j
+-0.000014-0.000778j
+0.000082-0.000885j
+0.000201-0.000966j
+0.000337-0.001017j
+0.000481-0.001034j
+0.000626-0.001016j
+0.000762-0.000965j
+0.000882-0.000882j
+0.000978-0.000772j
+0.001044-0.000643j
+0.001076-0.000501j
+0.001072-0.000355j
+0.001032-0.000215j
+0.000958-0.000089j
+0.000854+0.000016j
+0.000726+0.000091j
+0.000582+0.000133j
+0.000431+0.000138j
+0.000281+0.000105j
+0.000143+0.000035j
+0.000024-0.000068j
+-0.000068-0.000199j
+-0.000126-0.000350j
+-0.000147-0.000513j
+-0.000128-0.000677j
+-0.000070-0.000834j
+0.000024-0.000974j
+0.000150-0.001089j
+0.000300-0.001171j
+0.000465-0.001216j
+0.000637-0.001219j
+0.000805-0.001182j
+0.000960-0.001105j
+0.001091-0.000993j
+0.001191-0.000853j
+0.001253-0.000692j
+0.001274-0.000521j
+0.001252-0.000350j
+0.001188-0.000189j
+0.001085-0.000049j
+0.000950+0.000062j
+0.000790+0.000136j
+0.000614+0.000168j
+0.000435+0.000156j
+0.000261+0.000099j
+0.000105+0.000000j
+-0.000024-0.000136j
+-0.000117-0.000301j
+-0.000169-0.000486j
+-0.000175-0.000680j
+-0.000134-0.000872j
+-0.000048-0.001051j
+0.000079-0.001206j
+0.000240-0.001326j
+0.000426-0.001406j
+0.000626-0.001439j
+0.000829-0.001424j
+0.001022-0.001361j
+0.001195-0.001252j
+0.001336-0.001106j
+0.001437-0.000929j
+0.001491-0.000733j
+0.001496-0.000529j
+0.001449-0.000330j
+0.001354-0.000148j
+0.001217+0.000005j
+0.001044+0.000120j
+0.000846+0.000188j
+0.000635+0.000206j
+0.000424+0.000170j
+0.000226+0.000083j
+0.000053-0.000053j
+-0.000084-0.000228j
+-0.000176-0.000434j
+-0.000216-0.000659j
+-0.000201-0.000889j
+-0.000131-0.001111j
+-0.000009-0.001312j
+0.000158-0.001480j
+0.000362-0.001604j
+0.000590-0.001677j
+0.000829-0.001694j
+0.001066-0.001653j
+0.001286-0.001556j
+0.001477-0.001408j
+0.001626-0.001219j
+0.001724-0.001000j
+0.001765-0.000762j
+0.001746-0.000522j
+0.001668-0.000293j
+0.001534-0.000090j
+0.001353+0.000075j
+0.001135+0.000190j
+0.000893+0.000247j
+0.000642+0.000243j
+0.000396+0.000176j
+0.000172+0.000049j
+-0.000017-0.000131j
+-0.000159-0.000355j
+-0.000244-0.000609j
+-0.000266-0.000880j
+-0.000222-0.001151j
+-0.000114-0.001406j
+0.000053-0.001630j
+0.000270-0.001810j
+0.000524-0.001934j
+0.000802-0.001994j
+0.001087-0.001987j
+0.001362-0.001911j
+0.001611-0.001772j
+0.001819-0.001576j
+0.001973-0.001336j
+0.002063-0.001065j
+0.002084-0.000779j
+0.002033-0.000497j
+0.001914-0.000236j
+0.001732-0.000011j
+0.001498+0.000162j
+0.001225+0.000272j
+0.000931+0.000312j
+0.000633+0.000277j
+0.000349+0.000168j
+0.000097-0.000009j
+-0.000107-0.000246j
+-0.000250-0.000528j
+-0.000322-0.000841j
+-0.000316-0.001166j
+-0.000233-0.001484j
+-0.000076-0.001775j
+0.000148-0.002024j
+0.000426-0.002213j
+0.000743-0.002332j
+0.001080-0.002373j
+0.001418-0.002332j
+0.001736-0.002211j
+0.002017-0.002017j
+0.002241-0.001760j
+0.002397-0.001457j
+0.002473-0.001124j
+0.002464-0.000783j
+0.002371-0.000453j
+0.002198-0.000156j
+0.001954+0.000091j
+0.001654+0.000269j
+0.001316+0.000369j
+0.000959+0.000381j
+0.000606+0.000303j
+0.000279+0.000139j
+-0.000003-0.000103j
+-0.000220-0.000411j
+-0.000359-0.000768j
+-0.000408-0.001152j
+-0.000365-0.001542j
+-0.000229-0.001915j
+-0.000006-0.002248j
+0.000292-0.002522j
+0.000648-0.002719j
+0.001042-0.002826j
+0.001452-0.002837j
+0.001853-0.002750j
+0.002223-0.002569j
+0.002537-0.002304j
+0.002778-0.001971j
+0.002930-0.001588j
+0.002984-0.001179j
+0.002933-0.000770j
+0.002782-0.000384j
+0.002538-0.000046j
+0.002215+0.000222j
+0.001831+0.000402j
+0.001410+0.000481j
+0.000976+0.000452j
+0.000557+0.000316j
+0.000179+0.000077j
+-0.000134-0.000252j
+-0.000362-0.000654j
+-0.000490-0.001105j
+-0.000506-0.001580j
+-0.000407-0.002052j
+-0.000197-0.002492j
+0.000113-0.002875j
+0.000508-0.003176j
+0.000966-0.003377j
+0.001460-0.003464j
+0.001963-0.003432j
+0.002444-0.003281j
+0.002876-0.003019j
+0.003231-0.002659j
+0.003488-0.002224j
+0.003631-0.001739j
+0.003649-0.001233j
+0.003540-0.000737j
+0.003309-0.000282j
+0.002969+0.000103j
+0.002539+0.000393j
+0.002044+0.000568j
+0.001515+0.000614j
+0.000982+0.000525j
+0.000480+0.000304j
+0.000039-0.000039j
+-0.000311-0.000487j
+-0.000547-0.001016j
+-0.000652-0.001595j
+-0.000615-0.002193j
+-0.000436-0.002773j
+-0.000122-0.003301j
+0.000311-0.003746j
+0.000842-0.004081j
+0.001440-0.004282j
+0.002071-0.004338j
+0.002700-0.004243j
+0.003289-0.004000j
+0.003803-0.003622j
+0.004210-0.003132j
+0.004485-0.002556j
+0.004610-0.001930j
+0.004574-0.001291j
+0.004379-0.000679j
+0.004034-0.000133j
+0.003558+0.000313j
+0.002977+0.000627j
+0.002327+0.000787j
+0.001647+0.000779j
+0.000977+0.000598j
+0.000360+0.000250j
+-0.000163-0.000249j
+-0.000559-0.000872j
+-0.000799-0.001587j
+-0.000864-0.002354j
+-0.000744-0.003129j
+-0.000442-0.003866j
+0.000031-0.004522j
+0.000651-0.005057j
+0.001385-0.005437j
+0.002193-0.005637j
+0.003030-0.005643j
+0.003848-0.005451j
+0.004597-0.005069j
+0.005234-0.004519j
+0.005718-0.003830j
+0.006019-0.003044j
+0.006114-0.002206j
+0.005997-0.001368j
+0.005669-0.000583j
+0.005147+0.000099j
+0.004460+0.000631j
+0.003647+0.000975j
+0.002757+0.001105j
+0.001842+0.001003j
+0.000961+0.000668j
+0.000168+0.000111j
+-0.000482-0.000643j
+-0.000944-0.001555j
+-0.001183-0.002578j
+-0.001176-0.003656j
+-0.000912-0.004727j
+-0.000397-0.005728j
+0.000346-0.006601j
+0.001284-0.007292j
+0.002368-0.007755j
+0.003540-0.007959j
+0.004735-0.007886j
+0.005885-0.007535j
+0.006922-0.006922j
+0.007782-0.006078j
+0.008412-0.005050j
+0.008769-0.003898j
+0.008825-0.002691j
+0.008572-0.001504j
+0.008016-0.000412j
+0.007185+0.000510j
+0.006123+0.001196j
+0.004891+0.001591j
+0.003560+0.001657j
+0.002212+0.001372j
+0.000933+0.000734j
+-0.000192-0.000236j
+-0.001083-0.001500j
+-0.001672-0.002998j
+-0.001905-0.004655j
+-0.001747-0.006384j
+-0.001182-0.008090j
+-0.000222-0.009676j
+0.001101-0.011045j
+0.002732-0.012114j
+0.004593-0.012810j
+0.006591-0.013081j
+0.008621-0.012896j
+0.010571-0.012253j
+0.012328-0.011175j
+0.013785-0.009712j
+0.014847-0.007941j
+0.015438-0.005962j
+0.015507-0.003893j
+0.015029-0.001863j
+0.014011-0.000011j
+0.012494+0.001529j
+0.010549+0.002630j
+0.008277+0.003179j
+0.005809+0.003090j
+0.003294+0.002304j
+0.000896+0.000795j
+-0.001212-0.001423j
+-0.002859-0.004299j
+-0.003886-0.007744j
+-0.004151-0.011630j
+-0.003539-0.015799j
+-0.001969-0.020066j
+0.000601-0.024225j
+0.004168-0.028064j
+0.008684-0.031367j
+0.014056-0.033927j
+0.020145-0.035558j
+0.026775-0.036101j
+0.033735-0.035433j
+0.040789-0.033475j
+0.047684-0.030197j
+0.054164-0.025619j
+0.059974-0.019815j
+0.064878-0.012907j
+0.068665-0.005067j
+0.071159+0.003494j
+0.072228+0.012531j
+0.071791+0.021776j
+0.069818+0.030947j
+0.066339+0.039761j
+0.061435+0.047944j
+0.055243+0.055243j
+0.047944+0.061435j
+0.039761+0.066339j
+0.030947+0.069818j
+0.021776+0.071791j
+0.012531+0.072228j
+0.003494+0.071159j
+-0.005067+0.068665j
+-0.012907+0.064878j
+-0.019815+0.059974j
+-0.025619+0.054164j
+-0.030197+0.047684j
+-0.033475+0.040789j
+-0.035433+0.033735j
+-0.036101+0.026775j
+-0.035558+0.020145j
+-0.033927+0.014056j
+-0.031367+0.008684j
+-0.028064+0.004168j
+-0.024225+0.000601j
+-0.020066-0.001969j
+-0.015799-0.003539j
+-0.011630-0.004151j
+-0.007744-0.003886j
+-0.004299-0.002859j
+-0.001423-0.001212j
+0.000795+0.000896j
+0.002304+0.003294j
+0.003090+0.005809j
+0.003179+0.008277j
+0.002630+0.010549j
+0.001529+0.012494j
+-0.000011+0.014011j
+-0.001863+0.015029j
+-0.003893+0.015507j
+-0.005962+0.015438j
+-0.007941+0.014847j
+-0.009712+0.013785j
+-0.011175+0.012328j
+-0.012253+0.010571j
+-0.012896+0.008621j
+-0.013081+0.006591j
+-0.012810+0.004593j
+-0.012114+0.002732j
+-0.011045+0.001101j
+-0.009676-0.000222j
+-0.008090-0.001182j
+-0.006384-0.001747j
+-0.004655-0.001905j
+-0.002998-0.001672j
+-0.001500-0.001083j
+-0.000236-0.000192j
+0.000734+0.000933j
+0.001372+0.002212j
+0.001657+0.003560j
+0.001591+0.004891j
+0.001196+0.006123j
+0.000510+0.007185j
+-0.000412+0.008016j
+-0.001504+0.008572j
+-0.002691+0.008825j
+-0.003898+0.008769j
+-0.005050+0.008412j
+-0.006078+0.007782j
+-0.006922+0.006922j
+-0.007535+0.005885j
+-0.007886+0.004735j
+-0.007959+0.003540j
+-0.007755+0.002368j
+-0.007292+0.001284j
+-0.006601+0.000346j
+-0.005728-0.000397j
+-0.004727-0.000912j
+-0.003656-0.001176j
+-0.002578-0.001183j
+-0.001555-0.000944j
+-0.000643-0.000482j
+0.000111+0.000168j
+0.000668+0.000961j
+0.001003+0.001842j
+0.001105+0.002757j
+0.000975+0.003647j
+0.000631+0.004460j
+0.000099+0.005147j
+-0.000583+0.005669j
+-0.001368+0.005997j
+-0.002206+0.006114j
+-0.003044+0.006019j
+-0.003830+0.005718j
+-0.004519+0.005234j
+-0.005069+0.004597j
+-0.005451+0.003848j
+-0.005643+0.003030j
+-0.005637+0.002193j
+-0.005437+0.001385j
+-0.005057+0.000651j
+-0.004522+0.000031j
+-0.003866-0.000442j
+-0.003129-0.000744j
+-0.002354-0.000864j
+-0.001587-0.000799j
+-0.000872-0.000559j
+-0.000249-0.000163j
+0.000250+0.000360j
+0.000598+0.000977j
+0.000779+0.001647j
+0.000787+0.002327j
+0.000627+0.002977j
+0.000313+0.003558j
+-0.000133+0.004034j
+-0.000679+0.004379j
+-0.001291+0.004574j
+-0.001930+0.004610j
+-0.002556+0.004485j
+-0.003132+0.004210j
+-0.003622+0.003803j
+-0.004000+0.003289j
+-0.004243+0.002700j
+-0.004338+0.002071j
+-0.004282+0.001440j
+-0.004081+0.000842j
+-0.003746+0.000311j
+-0.003301-0.000122j
+-0.002773-0.000436j
+-0.002193-0.000615j
+-0.001595-0.000652j
+-0.001016-0.000547j
+-0.000487-0.000311j
+-0.000039+0.000039j
+0.000304+0.000480j
+0.000525+0.000982j
+0.000614+0.001515j
+0.000568+0.002044j
+0.000393+0.002539j
+0.000103+0.002969j
+-0.000282+0.003309j
+-0.000737+0.003540j
+-0.001233+0.003649j
+-0.001739+0.003631j
+-0.002224+0.003488j
+-0.002659+0.003231j
+-0.003019+0.002876j
+-0.003281+0.002444j
+-0.003432+0.001963j
+-0.003464+0.001460j
+-0.003377+0.000966j
+-0.003176+0.000508j
+-0.002875+0.000113j
+-0.002492-0.000197j
+-0.002052-0.000407j
+-0.001580-0.000506j
+-0.001105-0.000490j
+-0.000654-0.000362j
+-0.000252-0.000134j
+0.000077+0.000179j
+0.000316+0.000557j
+0.000452+0.000976j
+0.000481+0.001410j
+0.000402+0.001831j
+0.000222+0.002215j
+-0.000046+0.002538j
+-0.000384+0.002782j
+-0.000770+0.002933j
+-0.001179+0.002984j
+-0.001588+0.002930j
+-0.001971+0.002778j
+-0.002304+0.002537j
+-0.002569+0.002223j
+-0.002750+0.001853j
+-0.002837+0.001452j
+-0.002826+0.001042j
+-0.002719+0.000648j
+-0.002522+0.000292j
+-0.002248-0.000006j
+-0.001915-0.000229j
+-0.001542-0.000365j
+-0.001152-0.000408j
+-0.000768-0.000359j
+-0.000411-0.000220j
+-0.000103-0.000003j
+0.000139+0.000279j
+0.000303+0.000606j
+0.000381+0.000959j
+0.000369+0.001316j
+0.000269+0.001654j
+0.000091+0.001954j
+-0.000156+0.002198j
+-0.000453+0.002371j
+-0.000783+0.002464j
+-0.001124+0.002473j
+-0.001457+0.002397j
+-0.001760+0.002241j
+-0.002017+0.002017j
+-0.002211+0.001736j
+-0.002332+0.001418j
+-0.002373+0.001080j
+-0.002332+0.000743j
+-0.002213+0.000426j
+-0.002024+0.000148j
+-0.001775-0.000076j
+-0.001484-0.000233j
+-0.001166-0.000316j
+-0.000841-0.000322j
+-0.000528-0.000250j
+-0.000246-0.000107j
+-0.000009+0.000097j
+0.000168+0.000349j
+0.000277+0.000633j
+0.000312+0.000931j
+0.000272+0.001225j
+0.000162+0.001498j
+-0.000011+0.001732j
+-0.000236+0.001914j
+-0.000497+0.002033j
+-0.000779+0.002084j
+-0.001065+0.002063j
+-0.001336+0.001973j
+-0.001576+0.001819j
+-0.001772+0.001611j
+-0.001911+0.001362j
+-0.001987+0.001087j
+-0.001994+0.000802j
+-0.001934+0.000524j
+-0.001810+0.000270j
+-0.001630+0.000053j
+-0.001406-0.000114j
+-0.001151-0.000222j
+-0.000880-0.000266j
+-0.000609-0.000244j
+-0.000355-0.000159j
+-0.000131-0.000017j
+0.000049+0.000172j
+0.000176+0.000396j
+0.000243+0.000642j
+0.000247+0.000893j
+0.000190+0.001135j
+0.000075+0.001353j
+-0.000090+0.001534j
+-0.000293+0.001668j
+-0.000522+0.001746j
+-0.000762+0.001765j
+-0.001000+0.001724j
+-0.001219+0.001626j
+-0.001408+0.001477j
+-0.001556+0.001286j
+-0.001653+0.001066j
+-0.001694+0.000829j
+-0.001677+0.000590j
+-0.001604+0.000362j
+-0.001480+0.000158j
+-0.001312-0.000009j
+-0.001111-0.000131j
+-0.000889-0.000201j
+-0.000659-0.000216j
+-0.000434-0.000176j
+-0.000228-0.000084j
+-0.000053+0.000053j
+0.000083+0.000226j
+0.000170+0.000424j
+0.000206+0.000635j
+0.000188+0.000846j
+0.000120+0.001044j
+0.000005+0.001217j
+-0.000148+0.001354j
+-0.000330+0.001449j
+-0.000529+0.001496j
+-0.000733+0.001491j
+-0.000929+0.001437j
+-0.001106+0.001336j
+-0.001252+0.001195j
+-0.001361+0.001022j
+-0.001424+0.000829j
+-0.001439+0.000626j
+-0.001406+0.000426j
+-0.001326+0.000240j
+-0.001206+0.000079j
+-0.001051-0.000048j
+-0.000872-0.000134j
+-0.000680-0.000175j
+-0.000486-0.000169j
+-0.000301-0.000117j
+-0.000136-0.000024j
+0.000000+0.000105j
+0.000099+0.000261j
+0.000156+0.000435j
+0.000168+0.000614j
+0.000136+0.000790j
+0.000062+0.000950j
+-0.000049+0.001085j
+-0.000189+0.001188j
+-0.000350+0.001252j
+-0.000521+0.001274j
+-0.000692+0.001253j
+-0.000853+0.001191j
+-0.000993+0.001091j
+-0.001105+0.000960j
+-0.001182+0.000805j
+-0.001219+0.000637j
+-0.001216+0.000465j
+-0.001171+0.000300j
+-0.001089+0.000150j
+-0.000974+0.000024j
+-0.000834-0.000070j
+-0.000677-0.000128j
+-0.000513-0.000147j
+-0.000350-0.000126j
+-0.000199-0.000068j
+-0.000068+0.000024j
+0.000035+0.000143j
+0.000105+0.000281j
+0.000138+0.000431j
+0.000133+0.000582j
+0.000091+0.000726j
+0.000016+0.000854j
+-0.000089+0.000958j
+-0.000215+0.001032j
+-0.000355+0.001072j
+-0.000501+0.001076j
+-0.000643+0.001044j
+-0.000772+0.000978j
+-0.000882+0.000882j
+-0.000965+0.000762j
+-0.001016+0.000626j
+-0.001034+0.000481j
+-0.001017+0.000337j
+-0.000966+0.000201j
+-0.000885+0.000082j
+-0.000778-0.000014j
+-0.000653-0.000082j
+-0.000517-0.000118j
+-0.000378-0.000121j
+-0.000243-0.000090j
+-0.000122-0.000029j
+-0.000020+0.000058j
+0.000056+0.000165j
+0.000103+0.000287j
+0.000119+0.000415j
+0.000102+0.000540j
+0.000055+0.000657j
+-0.000019+0.000757j
+-0.000115+0.000835j
+-0.000227+0.000886j
+-0.000347+0.000907j
+-0.000469+0.000898j
+-0.000585+0.000859j
+-0.000688+0.000792j
+-0.000772+0.000702j
+-0.000831+0.000595j
+-0.000863+0.000477j
+-0.000866+0.000354j
+-0.000839+0.000235j
+-0.000786+0.000125j
+-0.000708+0.000032j
+-0.000611-0.000040j
+-0.000501-0.000087j
+-0.000385-0.000106j
+-0.000268-0.000097j
+-0.000159-0.000061j
+-0.000063-0.000001j
+0.000015+0.000080j
+0.000070+0.000175j
+0.000099+0.000280j
+0.000101+0.000387j
+0.000077+0.000490j
+0.000028+0.000582j
+-0.000042+0.000659j
+-0.000128+0.000715j
+-0.000225+0.000748j
+-0.000327+0.000755j
+-0.000428+0.000737j
+-0.000521+0.000694j
+-0.000601+0.000630j
+-0.000663+0.000548j
+-0.000703+0.000454j
+-0.000720+0.000352j
+-0.000712+0.000250j
+-0.000681+0.000152j
+-0.000627+0.000065j
+-0.000555-0.000006j
+-0.000469-0.000058j
+-0.000374-0.000088j
+-0.000275-0.000095j
+-0.000180-0.000078j
+-0.000092-0.000040j
+-0.000017+0.000017j
+0.000040+0.000090j
+0.000078+0.000173j
+0.000093+0.000261j
+0.000086+0.000350j
+0.000058+0.000432j
+0.000010+0.000504j
+-0.000054+0.000561j
+-0.000130+0.000600j
+-0.000213+0.000619j
+-0.000297+0.000616j
+-0.000379+0.000592j
+-0.000452+0.000548j
+-0.000513+0.000488j
+-0.000557+0.000415j
+-0.000582+0.000334j
+-0.000588+0.000248j
+-0.000573+0.000164j
+-0.000538+0.000086j
+-0.000487+0.000019j
+-0.000422-0.000035j
+-0.000347-0.000071j
+-0.000266-0.000088j
+-0.000185-0.000086j
+-0.000107-0.000065j
+-0.000038-0.000027j
+0.000018+0.000025j
+0.000060+0.000089j
+0.000083+0.000160j
+0.000089+0.000233j
+0.000076+0.000304j
+0.000046+0.000369j
+0.000001+0.000423j
+-0.000056+0.000464j
+-0.000121+0.000489j
+-0.000190+0.000497j
+-0.000259+0.000487j
+-0.000323+0.000461j
+-0.000379+0.000419j
+-0.000423+0.000365j
+-0.000453+0.000301j
+-0.000467+0.000232j
+-0.000465+0.000161j
+-0.000445+0.000093j
+-0.000411+0.000032j
+-0.000364-0.000019j
+-0.000306-0.000058j
+-0.000242-0.000081j
+-0.000175-0.000090j
+-0.000109-0.000082j
+-0.000048-0.000059j
+0.000005-0.000023j
+0.000047+0.000024j
+0.000075+0.000078j
+0.000089+0.000137j
+0.000088+0.000196j
+0.000072+0.000252j
+0.000042+0.000302j
+0.000002+0.000341j
+-0.000048+0.000369j
+-0.000102+0.000384j
+-0.000158+0.000384j
+-0.000213+0.000370j
+-0.000262+0.000343j
+-0.000304+0.000304j
+-0.000335+0.000256j
+-0.000354+0.000202j
+-0.000359+0.000145j
+-0.000351+0.000088j
+-0.000330+0.000034j
+-0.000298-0.000012j
+-0.000255-0.000050j
+-0.000206-0.000077j
+-0.000152-0.000091j
+-0.000098-0.000093j
+-0.000046-0.000082j
+0.000002-0.000059j
+0.000041-0.000027j
+0.000071+0.000014j
+0.000089+0.000059j
+0.000095+0.000106j
+0.000090+0.000153j
+0.000073+0.000196j
+0.000045+0.000232j
+0.000010+0.000260j
+-0.000031+0.000278j
+-0.000075+0.000284j
+-0.000120+0.000279j
+-0.000162+0.000263j
+-0.000199+0.000237j
+-0.000228+0.000203j
+-0.000249+0.000162j
+-0.000259+0.000117j
+-0.000259+0.000071j
+-0.000248+0.000026j
+-0.000227-0.000014j
+-0.000197-0.000049j
+-0.000161-0.000076j
+-0.000120-0.000093j
+-0.000077-0.000101j
+-0.000034-0.000098j
+0.000006-0.000086j
+0.000042-0.000064j
+0.000070-0.000036j
+0.000090-0.000002j
+0.000101+0.000034j
+0.000102+0.000071j
+0.000093+0.000107j
+0.000077+0.000139j
+0.000052+0.000165j
+0.000022+0.000184j
+-0.000011+0.000194j
+-0.000046+0.000196j
+-0.000081+0.000188j
+-0.000113+0.000173j
+-0.000140+0.000150j
+-0.000161+0.000121j
+-0.000174+0.000089j
+-0.000180+0.000054j
+-0.000177+0.000020j
+-0.000167-0.000013j
+-0.000150-0.000041j
+-0.000127-0.000063j
+-0.000100-0.000077j
+-0.000071-0.000084j
+-0.000044-0.000080j
+-0.000020-0.000066j
+-0.000009-0.000035j
diff --git a/gr-uhd/apps/hf_radio/ssbagc.py b/gr-uhd/apps/hf_radio/ssbagc.py
new file mode 100644
index 000000000..fdf40bc6b
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/ssbagc.py
@@ -0,0 +1,48 @@
+# post detection agc processing
+#
+# Imagine that the usual gnuradio copyright stuff is right here.
+#
+# This agc strategy is copied more or less verbatim from
+# weaver_isb_am1_usrp3.py by cswiger.
+#
+# Thanks.
+#
+# Then modified in a variety of ways.
+#
+# There doesn't appear to be a way to hook multiple blocks to the
+# input port when building a hier block like this. Thus the
+# split below.
+#
+# Basic operation.
+# Power is estimated by squaring the input.
+# Low pass filter using a 1 pole iir.
+# The time constant can be tweaked by changing the taps.
+# Currently there is no implementation to change this while operating
+# a potentially useful addition.
+# The log block turns this into dB
+# gain adjusts the agc authority.
+#
+# M. Revnell 2006-Jan
+
+from gnuradio import gr, gru
+
+class agc( gr.hier_block ):
+ def __init__( self, fg ):
+ self.split = gr.multiply_const_ff( 1 )
+ self.sqr = gr.multiply_ff( )
+ self.int0 = gr.iir_filter_ffd( [.004, 0], [0, .999] )
+ self.offs = gr.add_const_ff( -30 )
+ self.gain = gr.multiply_const_ff( 70 )
+ self.log = gr.nlog10_ff( 10, 1 )
+ self.agc = gr.divide_ff( )
+
+ fg.connect( self.split, ( self.agc, 0 ) )
+ fg.connect( self.split, ( self.sqr, 0 ) )
+ fg.connect( self.split, ( self.sqr, 1 ) )
+ fg.connect( self.sqr, self.int0 )
+ fg.connect( self.int0, self.log )
+ fg.connect( self.log, self.offs )
+ fg.connect( self.offs, self.gain )
+ fg.connect( self.gain, ( self.agc, 1 ) )
+
+ gr.hier_block.__init__( self, fg, self.split, self.agc )
diff --git a/gr-uhd/apps/hf_radio/ssbdemod.py b/gr-uhd/apps/hf_radio/ssbdemod.py
new file mode 100644
index 000000000..c73567b66
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/ssbdemod.py
@@ -0,0 +1,97 @@
+# This tries to push the hilbert transform for ssb demod back into the
+# freq. xlating filter.
+#
+# The usual gnuradio copyright notice is hereby included by reference.
+#
+# The starting point for this was weaver_isb_am1_usrp3.py.
+#
+# The tap coefficients for freq_xlating_fir_filter_ccf were generated
+# externally and are read from a file because I didn't want to learn how
+# to make fir filters with arbitrary phase response using python numeric
+# facilities.
+#
+# They were generated using Scilab which I am already familiar with.
+# M. Revnell Jan 06
+
+from gnuradio import gr, gru
+from gnuradio import audio
+from gnuradio import usrp
+
+class ssb_demod( gr.hier_block ):
+ def __init__( self, fg, if_rate, af_rate ):
+
+ self.if_rate = if_rate
+ self.af_rate = af_rate
+ self.if_decim = if_rate / af_rate
+ self.sideband = 1
+
+ self.xlate_taps = ([complex(v) for v in file('ssb_taps').readlines()])
+
+ self.audio_taps = gr.firdes.low_pass(
+ 1.0,
+ self.af_rate,
+ 3e3,
+ 600,
+ gr.firdes.WIN_HAMMING )
+
+ self.xlate = gr.freq_xlating_fir_filter_ccc(
+ self.if_decim,
+ self.xlate_taps,
+ 0,
+ self.if_rate )
+
+ self.split = gr.complex_to_float()
+
+ self.lpf = gr.fir_filter_fff(
+ 1, self.audio_taps )
+
+ self.sum = gr.add_ff( )
+ self.am_sel = gr.multiply_const_ff( 0 )
+ self.sb_sel = gr.multiply_const_ff( 1 )
+ self.mixer = gr.add_ff()
+ self.am_det = gr.complex_to_mag()
+
+ fg.connect( self.xlate, self.split )
+ fg.connect( ( self.split,0 ), ( self.sum,0 ) )
+ fg.connect( ( self.split,1 ), ( self.sum,1 ) )
+ fg.connect( self.sum, self.sb_sel )
+ fg.connect( self.xlate, self.am_det )
+ fg.connect( self.sb_sel, ( self.mixer, 0 ) )
+ fg.connect( self.am_det, self.am_sel )
+ fg.connect( self.am_sel, ( self.mixer, 1 ) )
+ fg.connect( self.mixer, self.lpf )
+
+ gr.hier_block.__init__( self, fg, self.xlate, self.lpf )
+
+ def upper_sb( self ):
+ self.xlate.set_taps([v.conjugate() for v in self.xlate_taps])
+ self.sb_sel.set_k( 1.0 )
+ self.am_sel.set_k( 0.0 )
+
+ def lower_sb( self ):
+ self.xlate.set_taps(self.xlate_taps)
+ self.sb_sel.set_k( 1.0 )
+ self.am_sel.set_k( 0.0 )
+
+ def set_am( self ):
+ taps = gr.firdes.low_pass( 1.0,
+ self.if_rate,
+ 5e3,
+ 2e3,
+ gr.firdes.WIN_HAMMING )
+ self.xlate.set_taps( taps )
+ self.sb_sel.set_k( 0.0 )
+ self.am_sel.set_k( 1.0 )
+
+ def set_bw( self, bw ):
+ self.audio_taps = gr.firdes.low_pass(
+ 1.0,
+ self.af_rate,
+ bw,
+ 600,
+ gr.firdes.WIN_HAMMING )
+ self.lpf.set_taps( self.audio_taps )
+
+ def tune( self, freq ):
+ self.xlate.set_center_freq( freq )
+
diff --git a/gr-uhd/apps/hf_radio/startup.py b/gr-uhd/apps/hf_radio/startup.py
new file mode 100644
index 000000000..093369b57
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/startup.py
@@ -0,0 +1 @@
+from radio import *
diff --git a/gr-uhd/apps/hf_radio/ui.py b/gr-uhd/apps/hf_radio/ui.py
new file mode 100755
index 000000000..71b73c128
--- /dev/null
+++ b/gr-uhd/apps/hf_radio/ui.py
@@ -0,0 +1,295 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+# generated by wxGlade 0.4 on Mon Jan 2 19:02:03 2006
+
+import wx
+
+class ui_frame(wx.Frame):
+ def __init__(self, *args, **kwds):
+ # begin wxGlade: ui_frame.__init__
+ kwds["style"] = wx.DEFAULT_FRAME_STYLE
+ wx.Frame.__init__(self, *args, **kwds)
+ self.sizer_1_staticbox = wx.StaticBox(self, -1, "sizer_1")
+ self.freq_disp = wx.SpinCtrl(self, -1, "", min=0, max=100)
+ self.spin_e6 = wx.SpinButton(self, -1 )
+ self.spin_e5 = wx.SpinButton(self, -1 )
+ self.spin_e4 = wx.SpinButton(self, -1 )
+ self.spin_e3 = wx.SpinButton(self, -1 )
+ self.spin_e2 = wx.SpinButton(self, -1 )
+ self.spin_e1 = wx.SpinButton(self, -1 )
+ self.spin_e0 = wx.SpinButton(self, -1 )
+ self.panel_1 = wx.Panel(self, -1)
+ self.panel_2 = wx.Panel(self, -1)
+ self.button_lsb = wx.Button(self, -1, "LSB")
+ self.button_usb = wx.Button(self, -1, "USB")
+ self.button_am = wx.Button(self, -1, "AM")
+ self.label_1 = wx.StaticText(self, -1, "VOLUME")
+ self.label_2 = wx.StaticText(self, -1, "PGA")
+ self.agc_level = wx.TextCtrl(self, -1, "")
+ self.label_6 = wx.StaticText(self, -1, "")
+ self.volume = wx.SpinCtrl(self, -1, "", min=0, max=100)
+ self.pga = wx.SpinCtrl(self, -1, "", min=0, max=100)
+ self.agc_max = wx.TextCtrl(self, -1, "")
+ self.label_7 = wx.StaticText(self, -1, "")
+ self.label_4 = wx.StaticText(self, -1, "AGC AUTHORITY")
+ self.label_5 = wx.StaticText(self, -1, "AGC REF LVL")
+ self.label_3 = wx.StaticText(self, -1, "BANDWIDTH")
+ self.label_8 = wx.StaticText(self, -1, "")
+ self.agc_gain = wx.TextCtrl(self, -1, "")
+ self.agc_gain_s = wx.SpinButton(self, -1 )
+ self.agc_ref = wx.TextCtrl(self, -1, "")
+ self.agc_ref_s = wx.SpinButton(self, -1 )
+ self.bandwidth = wx.TextCtrl(self, -1, "")
+ self.bw_spin = wx.SpinButton(self, -1 )
+ self.label_9 = wx.StaticText(self, -1, "")
+ self.rssi = wx.Gauge(self, -1, 10, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
+ self.fe_panel = wx.Panel(self, -1)
+ self.if_panel = wx.Panel(self, -1)
+
+ self.__set_properties()
+ self.__do_layout()
+
+ self.Bind(wx.EVT_SPINCTRL, self.tune_evt, self.freq_disp)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e6, self.spin_e6)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e6, self.spin_e6)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e5, self.spin_e5)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e5, self.spin_e5)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e4, self.spin_e4)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e4, self.spin_e4)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e3, self.spin_e3)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e3, self.spin_e3)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e2, self.spin_e2)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e2, self.spin_e2)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e1, self.spin_e1)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e1, self.spin_e1)
+ self.Bind(wx.EVT_SPIN_DOWN, self.down_e0, self.spin_e0)
+ self.Bind(wx.EVT_SPIN_UP, self.up_e0, self.spin_e0)
+ self.Bind(wx.EVT_BUTTON, self.set_lsb, self.button_lsb)
+ self.Bind(wx.EVT_BUTTON, self.set_usb, self.button_usb)
+ self.Bind(wx.EVT_BUTTON, self.set_am, self.button_am)
+ self.Bind(wx.EVT_SPINCTRL, self.event_vol, self.volume)
+ self.Bind(wx.EVT_SPINCTRL, self.event_pga, self.pga)
+ self.Bind(wx.EVT_SPIN_DOWN, self.agc_gain_down, self.agc_gain_s)
+ self.Bind(wx.EVT_SPIN_UP, self.agc_gain_up, self.agc_gain_s)
+ self.Bind(wx.EVT_SPIN_DOWN, self.agc_ref_down, self.agc_ref_s)
+ self.Bind(wx.EVT_SPIN_UP, self.agc_ref_up, self.agc_ref_s)
+ self.Bind(wx.EVT_SPIN_DOWN, self.bw_down, self.bw_spin)
+ self.Bind(wx.EVT_SPIN_UP, self.bw_up, self.bw_spin)
+ # end wxGlade
+
+ def __set_properties(self):
+ # begin wxGlade: ui_frame.__set_properties
+ self.SetTitle("frame_1")
+ self.freq_disp.SetFont(wx.Font(32, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
+ self.rssi.SetMinSize((315, 10))
+ self.rssi.SetForegroundColour(wx.Colour(255, 0, 0))
+ # end wxGlade
+
+ def __do_layout(self):
+ # begin wxGlade: ui_frame.__do_layout
+ sizer_1 = wx.StaticBoxSizer(self.sizer_1_staticbox, wx.VERTICAL)
+ sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
+ sizer_4 = wx.BoxSizer(wx.VERTICAL)
+ grid_sizer_4 = wx.GridSizer(2, 4, 0, 0)
+ sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
+ sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
+ sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
+ grid_sizer_3 = wx.GridSizer(2, 4, 0, 0)
+ sizer_3 = wx.BoxSizer(wx.VERTICAL)
+ grid_sizer_1 = wx.GridSizer(2, 3, 0, 0)
+ grid_sizer_2 = wx.GridSizer(1, 7, 0, 0)
+ sizer_3.Add(self.freq_disp, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e6, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e5, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e4, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e3, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e2, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e1, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_2.Add(self.spin_e0, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_1.Add(grid_sizer_2, 1, wx.EXPAND, 0)
+ grid_sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
+ grid_sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
+ grid_sizer_1.Add(self.button_lsb, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_1.Add(self.button_usb, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_1.Add(self.button_am, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_3.Add(grid_sizer_1, 1, wx.EXPAND, 0)
+ sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
+ grid_sizer_3.Add(self.label_1, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.label_2, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.agc_level, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.label_6, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.volume, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.pga, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.agc_max, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_3.Add(self.label_7, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_4.Add(grid_sizer_3, 1, wx.EXPAND, 0)
+ grid_sizer_4.Add(self.label_4, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_4.Add(self.label_5, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_4.Add(self.label_3, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_4.Add(self.label_8, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_6.Add(self.agc_gain, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_6.Add(self.agc_gain_s, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_4.Add(sizer_6, 1, wx.EXPAND, 0)
+ sizer_7.Add(self.agc_ref, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_7.Add(self.agc_ref_s, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_4.Add(sizer_7, 1, wx.EXPAND, 0)
+ sizer_5.Add(self.bandwidth, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_5.Add(self.bw_spin, 0, wx.ADJUST_MINSIZE, 0)
+ grid_sizer_4.Add(sizer_5, 1, wx.EXPAND, 0)
+ grid_sizer_4.Add(self.label_9, 0, wx.ADJUST_MINSIZE, 0)
+ sizer_4.Add(grid_sizer_4, 1, wx.EXPAND, 0)
+ sizer_4.Add(self.rssi, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
+ sizer_2.Add(sizer_4, 1, wx.EXPAND, 0)
+ sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
+ sizer_1.Add(self.fe_panel, 1, wx.EXPAND, 0)
+ sizer_1.Add(self.if_panel, 1, wx.EXPAND, 0)
+ self.SetAutoLayout(True)
+ self.SetSizer(sizer_1)
+ sizer_1.Fit(self)
+ sizer_1.SetSizeHints(self)
+ self.Layout()
+ # end wxGlade
+
+ def down_e6(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e6' not implemented"
+ event.Skip()
+
+ def up_e6(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e6' not implemented"
+ event.Skip()
+
+ def down_e5(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e5' not implemented"
+ event.Skip()
+
+ def up_e5(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e5' not implemented"
+ event.Skip()
+
+ def down_e4(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e4' not implemented"
+ event.Skip()
+
+ def up_e4(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e4' not implemented"
+ event.Skip()
+
+ def down_e3(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e3' not implemented"
+ event.Skip()
+
+ def up_e3(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e3' not implemented"
+ event.Skip()
+
+ def down_e2(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e2' not implemented"
+ event.Skip()
+
+ def up_e2(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e2' not implemented"
+ event.Skip()
+
+ def down_e1(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e1' not implemented"
+ event.Skip()
+
+ def up_e1(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e1' not implemented"
+ event.Skip()
+
+ def down_e0(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `down_e0' not implemented"
+ event.Skip()
+
+ def up_e0(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `up_e0' not implemented"
+ event.Skip()
+
+ def event_vol(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `event_vol' not implemented"
+ event.Skip()
+
+ def event_pga(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `event_pga' not implemented"
+ event.Skip()
+
+ def set_lsb(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `set_lsb' not implemented"
+ event.Skip()
+
+ def set_usb(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `set_usb' not implemented"
+ event.Skip()
+
+ def set_am(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `set_am' not implemented"
+ event.Skip()
+
+ def set_bw(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `set_bw' not implemented"
+ event.Skip()
+
+ def tune_evt(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `tune_evt' not implemented"
+ event.Skip()
+
+ def bw_down(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `bw_down' not implemented"
+ event.Skip()
+
+ def bw_up(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `bw_up' not implemented"
+ event.Skip()
+
+ def agc_gain_down(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `agc_gain_down' not implemented"
+ event.Skip()
+
+ def agc_gain_up(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `agc_gain_up' not implemented"
+ event.Skip()
+
+ def agc_ref_down(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `agc_ref_down' not implemented"
+ event.Skip()
+
+ def agc_ref_up(self, event): # wxGlade: ui_frame.<event_handler>
+ print "Event handler `agc_ref_up' not implemented"
+ event.Skip()
+
+# end of class ui_frame
+
+
+class RadioFrame(wx.Frame):
+ def __init__(self, *args, **kwds):
+ # content of this block not found: did you rename this class?
+ pass
+
+ def __set_properties(self):
+ # content of this block not found: did you rename this class?
+ pass
+
+ def __do_layout(self):
+ # content of this block not found: did you rename this class?
+ pass
+
+# end of class RadioFrame
+
+
+class MyFrame(wx.Frame):
+ def __init__(self, *args, **kwds):
+ # content of this block not found: did you rename this class?
+ pass
+
+ def __set_properties(self):
+ # content of this block not found: did you rename this class?
+ pass
+
+ def __do_layout(self):
+ # content of this block not found: did you rename this class?
+ pass
+
+# end of class MyFrame
+
+