summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/python
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2012-11-01 10:50:10 -0400
committerTom Rondeau <trondeau@vt.edu>2012-11-01 10:50:10 -0400
commit1b83549181135e79ad00b9bae0d11ab27efa4148 (patch)
tree6b036dd9d26423528f49bad563c199a25a33f646 /gnuradio-core/src/python
parentbbe599e4606b728c9610a17285b1e50f9e9d4dcb (diff)
analog: removing PLL blocks. Also moved blks2impl files that used PLLs to gr-analog.
This probably impacts a lot of examples; once we've removed all files in gnuradio-core, we'll need to retest.
Diffstat (limited to 'gnuradio-core/src/python')
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/CMakeLists.txt10
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/am_demod.py71
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/fm_demod.py103
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/fm_emph.py151
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/nbfm_rx.py85
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/nbfm_tx.py89
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/standard_squelch.py76
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv.py68
-rwxr-xr-xgnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_fmdet.py215
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_pll.py189
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/wfm_tx.py76
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_pll_carriertracking.py156
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_pll_freqdet.py160
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_pll_refout.py156
14 files changed, 0 insertions, 1605 deletions
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/CMakeLists.txt b/gnuradio-core/src/python/gnuradio/blks2impl/CMakeLists.txt
index b8ec6c88c4..dae287ca3a 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/CMakeLists.txt
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/CMakeLists.txt
@@ -21,19 +21,9 @@ include(GrPython)
GR_PYTHON_INSTALL(FILES
__init__.py
- am_demod.py
filterbank.py
- fm_demod.py
- fm_emph.py
- nbfm_rx.py
- nbfm_tx.py
rational_resampler.py
- standard_squelch.py
stream_to_vector_decimator.py
- wfm_rcv.py
- wfm_rcv_fmdet.py
- wfm_rcv_pll.py
- wfm_tx.py
DESTINATION ${GR_PYTHON_DIR}/gnuradio/blks2impl
COMPONENT "core_python"
)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/am_demod.py b/gnuradio-core/src/python/gnuradio/blks2impl/am_demod.py
deleted file mode 100644
index 6420348be3..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/am_demod.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Copyright 2006,2007 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.
-#
-
-from gnuradio import gr, optfir
-
-class am_demod_cf(gr.hier_block2):
- """
- Generalized AM demodulation block with audio filtering.
-
- This block demodulates a band-limited, complex down-converted AM
- channel into the the original baseband signal, applying low pass
- filtering to the audio output. It produces a float stream in the
- range [-1.0, +1.0].
-
- Args:
- channel_rate: incoming sample rate of the AM baseband (integer)
- audio_decim: input to output decimation rate (integer)
- audio_pass: audio low pass filter passband frequency (float)
- audio_stop: audio low pass filter stop frequency (float)
- """
- def __init__(self, channel_rate, audio_decim, audio_pass, audio_stop):
- gr.hier_block2.__init__(self, "am_demod_cf",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Input signature
-
- MAG = gr.complex_to_mag()
- DCR = gr.add_const_ff(-1.0)
-
- audio_taps = optfir.low_pass(0.5, # Filter gain
- channel_rate, # Sample rate
- audio_pass, # Audio passband
- audio_stop, # Audio stopband
- 0.1, # Passband ripple
- 60) # Stopband attenuation
- LPF = gr.fir_filter_fff(audio_decim, audio_taps)
-
- self.connect(self, MAG, DCR, LPF, self)
-
-class demod_10k0a3e_cf(am_demod_cf):
- """
- AM demodulation block, 10 KHz channel.
-
- This block demodulates an AM channel conformant to 10K0A3E emission
- standards, such as broadcast band AM transmissions.
-
- Args:
- channel_rate: incoming sample rate of the AM baseband (integer)
- audio_decim: input to output decimation rate (integer)
- """
- def __init__(self, channel_rate, audio_decim):
- am_demod_cf.__init__(self, channel_rate, audio_decim,
- 5000, # Audio passband
- 5500) # Audio stopband
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/fm_demod.py b/gnuradio-core/src/python/gnuradio/blks2impl/fm_demod.py
deleted file mode 100644
index cc93d5b45c..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/fm_demod.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#
-# Copyright 2006,2007 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.
-#
-
-from gnuradio import gr, optfir
-from gnuradio.blks2impl.fm_emph import fm_deemph
-from math import pi
-
-class fm_demod_cf(gr.hier_block2):
- """
- Generalized FM demodulation block with deemphasis and audio
- filtering.
-
- This block demodulates a band-limited, complex down-converted FM
- channel into the the original baseband signal, optionally applying
- deemphasis. Low pass filtering is done on the resultant signal. It
- produces an output float strem in the range of [-1.0, +1.0].
-
- Args:
- channel_rate: incoming sample rate of the FM baseband (integer)
- deviation: maximum FM deviation (default = 5000) (float)
- audio_decim: input to output decimation rate (integer)
- audio_pass: audio low pass filter passband frequency (float)
- audio_stop: audio low pass filter stop frequency (float)
- gain: gain applied to audio output (default = 1.0) (float)
- tau: deemphasis time constant (default = 75e-6), specify 'None' to prevent deemphasis
- """
- def __init__(self, channel_rate, audio_decim, deviation,
- audio_pass, audio_stop, gain=1.0, tau=75e-6):
- gr.hier_block2.__init__(self, "fm_demod_cf",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- k = channel_rate/(2*pi*deviation)
- QUAD = gr.quadrature_demod_cf(k)
-
- audio_taps = optfir.low_pass(gain, # Filter gain
- channel_rate, # Sample rate
- audio_pass, # Audio passband
- audio_stop, # Audio stopband
- 0.1, # Passband ripple
- 60) # Stopband attenuation
- LPF = gr.fir_filter_fff(audio_decim, audio_taps)
-
- if tau is not None:
- DEEMPH = fm_deemph(channel_rate, tau)
- self.connect(self, QUAD, DEEMPH, LPF, self)
- else:
- self.connect(self, QUAD, LPF, self)
-
-class demod_20k0f3e_cf(fm_demod_cf):
- """
- NBFM demodulation block, 20 KHz channels
-
- This block demodulates a complex, downconverted, narrowband FM
- channel conforming to 20K0F3E emission standards, outputting
- floats in the range [-1.0, +1.0].
-
- Args:
- sample_rate: incoming sample rate of the FM baseband (integer)
- audio_decim: input to output decimation rate (integer)
- """
- def __init__(self, channel_rate, audio_decim):
- fm_demod_cf.__init__(self, channel_rate, audio_decim,
- 5000, # Deviation
- 3000, # Audio passband frequency
- 4500) # Audio stopband frequency
-
-class demod_200kf3e_cf(fm_demod_cf):
- """
- WFM demodulation block, mono.
-
- This block demodulates a complex, downconverted, wideband FM
- channel conforming to 200KF3E emission standards, outputting
- floats in the range [-1.0, +1.0].
-
- Args:
- sample_rate: incoming sample rate of the FM baseband (integer)
- audio_decim: input to output decimation rate (integer)
- """
- def __init__(self, channel_rate, audio_decim):
- fm_demod_cf.__init__(self, channel_rate, audio_decim,
- 75000, # Deviation
- 15000, # Audio passband
- 16000, # Audio stopband
- 20.0) # Audio gain
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/fm_emph.py b/gnuradio-core/src/python/gnuradio/blks2impl/fm_emph.py
deleted file mode 100644
index 080ebe151f..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/fm_emph.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#
-# Copyright 2005,2007 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.
-#
-
-from gnuradio import gr, filter
-import math
-
-
-#
-# 1
-# H(s) = -------
-# 1 + s
-#
-# tau is the RC time constant.
-# critical frequency: w_p = 1/tau
-#
-# We prewarp and use the bilinear z-transform to get our IIR coefficients.
-# See "Digital Signal Processing: A Practical Approach" by Ifeachor and Jervis
-#
-
-class fm_deemph(gr.hier_block2):
- """
- FM Deemphasis IIR filter.
- """
-
-
- def __init__(self, fs, tau=75e-6):
- """
-
- Args:
- fs: sampling frequency in Hz (float)
- tau: Time constant in seconds (75us in US, 50us in EUR) (float)
- """
- gr.hier_block2.__init__(self, "fm_deemph",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- w_p = 1/tau
- w_pp = math.tan (w_p / (fs * 2)) # prewarped analog freq
-
- a1 = (w_pp - 1)/(w_pp + 1)
- b0 = w_pp/(1 + w_pp)
- b1 = b0
-
- btaps = [b0, b1]
- ataps = [1, a1]
-
- if 0:
- print "btaps =", btaps
- print "ataps =", ataps
- global plot1
- plot1 = gru.gnuplot_freqz (gru.freqz (btaps, ataps), fs, True)
-
- deemph = filter.iir_filter_ffd(btaps, ataps)
- self.connect(self, deemph, self)
-
-#
-# 1 + s*t1
-# H(s) = ----------
-# 1 + s*t2
-#
-# I think this is the right transfer function.
-#
-#
-# This fine ASCII rendition is based on Figure 5-15
-# in "Digital and Analog Communication Systems", Leon W. Couch II
-#
-#
-# R1
-# +-----||------+
-# | |
-# o------+ +-----+--------o
-# | C1 | |
-# +----/\/\/\/--+ \
-# /
-# \ R2
-# /
-# \
-# |
-# o--------------------------+--------o
-#
-# f1 = 1/(2*pi*t1) = 1/(2*pi*R1*C)
-#
-# 1 R1 + R2
-# f2 = ------- = ------------
-# 2*pi*t2 2*pi*R1*R2*C
-#
-# t1 is 75us in US, 50us in EUR
-# f2 should be higher than our audio bandwidth.
-#
-#
-# The Bode plot looks like this:
-#
-#
-# /----------------
-# /
-# / <-- slope = 20dB/decade
-# /
-# -------------/
-# f1 f2
-#
-# We prewarp and use the bilinear z-transform to get our IIR coefficients.
-# See "Digital Signal Processing: A Practical Approach" by Ifeachor and Jervis
-#
-
-class fm_preemph(gr.hier_block2):
- """
- FM Preemphasis IIR filter.
- """
- def __init__(self, fs, tau=75e-6):
- """
-
- Args:
- fs: sampling frequency in Hz (float)
- tau: Time constant in seconds (75us in US, 50us in EUR) (float)
- """
-
- gr.hier_block2.__init__(self, "fm_deemph",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- # FIXME make this compute the right answer
-
- btaps = [1]
- ataps = [1]
-
- if 0:
- print "btaps =", btaps
- print "ataps =", ataps
- global plot2
- plot2 = gru.gnuplot_freqz (gru.freqz (btaps, ataps), fs, True)
-
- preemph = filter.iir_filter_ffd(btaps, ataps)
- self.connect(self, preemph, self)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/nbfm_rx.py b/gnuradio-core/src/python/gnuradio/blks2impl/nbfm_rx.py
deleted file mode 100644
index 40eb255e1e..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/nbfm_rx.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#
-# Copyright 2005 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.
-#
-
-import math
-from gnuradio import gr, optfir
-from gnuradio.blks2impl.fm_emph import fm_deemph
-#from gnuradio.blks2impl.standard_squelch import standard_squelch
-
-class nbfm_rx(gr.hier_block2):
- def __init__(self, audio_rate, quad_rate, tau=75e-6, max_dev=5e3):
- """
- Narrow Band FM Receiver.
-
- Takes a single complex baseband input stream and produces a single
- float output stream of audio sample in the range [-1, +1].
-
- Args:
- audio_rate: sample rate of audio stream, >= 16k (integer)
- quad_rate: sample rate of output stream (integer)
- tau: preemphasis time constant (default 75e-6) (float)
- max_dev: maximum deviation in Hz (default 5e3) (float)
-
- quad_rate must be an integer multiple of audio_rate.
-
- Exported sub-blocks (attributes):
- squelch
- quad_demod
- deemph
- audio_filter
- """
-
- gr.hier_block2.__init__(self, "nbfm_rx",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- # FIXME audio_rate and quad_rate ought to be exact rationals
- audio_rate = int(audio_rate)
- quad_rate = int(quad_rate)
-
- if quad_rate % audio_rate != 0:
- raise ValueError, "quad_rate is not an integer multiple of audio_rate"
-
- squelch_threshold = 20 # dB
- #self.squelch = gr.simple_squelch_cc(squelch_threshold, 0.001)
-
- # FM Demodulator input: complex; output: float
- k = quad_rate/(2*math.pi*max_dev)
- self.quad_demod = gr.quadrature_demod_cf(k)
-
- # FM Deemphasis IIR filter
- self.deemph = fm_deemph (quad_rate, tau=tau)
-
- # compute FIR taps for audio filter
- audio_decim = quad_rate // audio_rate
- audio_taps = gr.firdes.low_pass (1.0, # gain
- quad_rate, # sampling rate
- 2.7e3, # Audio LPF cutoff
- 0.5e3, # Transition band
- gr.firdes.WIN_HAMMING) # filter type
-
- print "len(audio_taps) =", len(audio_taps)
-
- # Decimating audio filter
- # input: float; output: float; taps: float
- self.audio_filter = gr.fir_filter_fff(audio_decim, audio_taps)
-
- self.connect(self, self.quad_demod, self.deemph, self.audio_filter, self)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/nbfm_tx.py b/gnuradio-core/src/python/gnuradio/blks2impl/nbfm_tx.py
deleted file mode 100644
index 75e96f2374..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/nbfm_tx.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#
-# Copyright 2005 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.
-#
-
-import math
-from gnuradio import gr, optfir, filter
-from gnuradio.blks2impl.fm_emph import fm_preemph
-
-#from gnuradio import ctcss
-
-class nbfm_tx(gr.hier_block2):
- def __init__(self, audio_rate, quad_rate, tau=75e-6, max_dev=5e3):
- """
- Narrow Band FM Transmitter.
-
- Takes a single float input stream of audio samples in the range [-1,+1]
- and produces a single FM modulated complex baseband output.
-
- Args:
- audio_rate: sample rate of audio stream, >= 16k (integer)
- quad_rate: sample rate of output stream (integer)
- tau: preemphasis time constant (default 75e-6) (float)
- max_dev: maximum deviation in Hz (default 5e3) (float)
-
- quad_rate must be an integer multiple of audio_rate.
- """
-
- gr.hier_block2.__init__(self, "nbfm_tx",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
-
- # FIXME audio_rate and quad_rate ought to be exact rationals
- audio_rate = int(audio_rate)
- quad_rate = int(quad_rate)
-
- if quad_rate % audio_rate != 0:
- raise ValueError, "quad_rate is not an integer multiple of audio_rate"
-
-
- do_interp = audio_rate != quad_rate
-
- if do_interp:
- interp_factor = quad_rate / audio_rate
- interp_taps = optfir.low_pass (interp_factor, # gain
- quad_rate, # Fs
- 4500, # passband cutoff
- 7000, # stopband cutoff
- 0.1, # passband ripple dB
- 40) # stopband atten dB
-
- #print "len(interp_taps) =", len(interp_taps)
- self.interpolator = filter.interp_fir_filter_fff (interp_factor, interp_taps)
-
- self.preemph = fm_preemph (quad_rate, tau=tau)
-
- k = 2 * math.pi * max_dev / quad_rate
- self.modulator = gr.frequency_modulator_fc (k)
-
- if do_interp:
- self.connect (self, self.interpolator, self.preemph, self.modulator, self)
- else:
- self.connect(self, self.preemph, self.modulator, self)
-
-
-class ctcss_gen_f(gr.hier_block2):
- def __init__(self, sample_rate, tone_freq):
- gr.hier_block2.__init__(self, "ctcss_gen_f",
- gr.io_signature(0, 0, 0), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- self.plgen = gr.sig_source_f(sample_rate, gr.GR_SIN_WAVE, tone_freq, 0.1, 0.0)
- self.connect(self.plgen, self)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/standard_squelch.py b/gnuradio-core/src/python/gnuradio/blks2impl/standard_squelch.py
deleted file mode 100644
index bd7fb535ae..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/standard_squelch.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# Copyright 2005,2007 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.
-#
-
-import math
-from gnuradio import gr, optfir
-
-class standard_squelch(gr.hier_block2):
- def __init__(self, audio_rate):
- gr.hier_block2.__init__(self, "standard_squelch",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- self.input_node = gr.add_const_ff(0) # FIXME kludge
-
- self.low_iir = gr.iir_filter_ffd((0.0193,0,-0.0193),(1,1.9524,-0.9615))
- self.low_square = gr.multiply_ff()
- self.low_smooth = gr.single_pole_iir_filter_ff(1/(0.01*audio_rate)) # 100ms time constant
-
- self.hi_iir = gr.iir_filter_ffd((0.0193,0,-0.0193),(1,1.3597,-0.9615))
- self.hi_square = gr.multiply_ff()
- self.hi_smooth = gr.single_pole_iir_filter_ff(1/(0.01*audio_rate))
-
- self.sub = gr.sub_ff();
- self.add = gr.add_ff();
- self.gate = gr.threshold_ff(0.3,0.43,0)
- self.squelch_lpf = gr.single_pole_iir_filter_ff(1/(0.01*audio_rate))
-
- self.div = gr.divide_ff()
- self.squelch_mult = gr.multiply_ff()
-
- self.connect (self, self.input_node)
- self.connect (self.input_node, (self.squelch_mult, 0))
-
- self.connect (self.input_node,self.low_iir)
- self.connect (self.low_iir,(self.low_square,0))
- self.connect (self.low_iir,(self.low_square,1))
- self.connect (self.low_square,self.low_smooth,(self.sub,0))
- self.connect (self.low_smooth, (self.add,0))
-
- self.connect (self.input_node,self.hi_iir)
- self.connect (self.hi_iir,(self.hi_square,0))
- self.connect (self.hi_iir,(self.hi_square,1))
- self.connect (self.hi_square,self.hi_smooth,(self.sub,1))
- self.connect (self.hi_smooth, (self.add,1))
-
- self.connect (self.sub, (self.div, 0))
- self.connect (self.add, (self.div, 1))
- self.connect (self.div, self.gate, self.squelch_lpf, (self.squelch_mult,1))
- self.connect (self.squelch_mult, self)
-
- def set_threshold(self, threshold):
- self.gate.set_hi(threshold)
-
- def threshold(self):
- return self.gate.hi()
-
- def squelch_range(self):
- return (0.0, 1.0, 1.0/100)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv.py b/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv.py
deleted file mode 100644
index fe4fdd1a6a..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#
-# Copyright 2005,2007 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.
-#
-
-from gnuradio import gr
-from gnuradio.blks2impl.fm_emph import fm_deemph
-import math
-
-class wfm_rcv(gr.hier_block2):
- def __init__ (self, quad_rate, audio_decimation):
- """
- Hierarchical block for demodulating a broadcast FM signal.
-
- The input is the downconverted complex baseband signal (gr_complex).
- The output is the demodulated audio (float).
-
- Args:
- quad_rate: input sample rate of complex baseband input. (float)
- audio_decimation: how much to decimate quad_rate to get to audio. (integer)
- """
- gr.hier_block2.__init__(self, "wfm_rcv",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
-
- volume = 20.
-
- max_dev = 75e3
- fm_demod_gain = quad_rate/(2*math.pi*max_dev)
- audio_rate = quad_rate / audio_decimation
-
-
- # We assign to self so that outsiders can grab the demodulator
- # if they need to. E.g., to plot its output.
- #
- # input: complex; output: float
- self.fm_demod = gr.quadrature_demod_cf (fm_demod_gain)
-
- # input: float; output: float
- self.deemph = fm_deemph (audio_rate)
-
- # compute FIR filter taps for audio filter
- width_of_transition_band = audio_rate / 32
- audio_coeffs = gr.firdes.low_pass (1.0, # gain
- quad_rate, # sampling rate
- audio_rate/2 - width_of_transition_band,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
- # input: float; output: float
- self.audio_filter = gr.fir_filter_fff (audio_decimation, audio_coeffs)
-
- self.connect (self, self.fm_demod, self.audio_filter, self.deemph, self)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_fmdet.py b/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_fmdet.py
deleted file mode 100755
index 24c710a494..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_fmdet.py
+++ /dev/null
@@ -1,215 +0,0 @@
-#
-# Copyright 2005,2006 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.
-#
-
-from gnuradio import gr
-from gnuradio.blks2impl.fm_emph import fm_deemph
-import math
-
-class wfm_rcv_fmdet(gr.hier_block2):
- def __init__ (self, demod_rate, audio_decimation):
- """
- Hierarchical block for demodulating a broadcast FM signal.
-
- The input is the downconverted complex baseband signal
- (gr_complex). The output is two streams of the demodulated
- audio (float) 0=Left, 1=Right.
-
- Args:
- demod_rate: input sample rate of complex baseband input. (float)
- audio_decimation: how much to decimate demod_rate to get to audio. (integer)
- """
- gr.hier_block2.__init__(self, "wfm_rcv_fmdet",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(2, 2, gr.sizeof_float)) # Output signature
- lowfreq = -125e3/demod_rate
- highfreq = 125e3/demod_rate
- audio_rate = demod_rate / audio_decimation
-
- # We assign to self so that outsiders can grab the demodulator
- # if they need to. E.g., to plot its output.
- #
- # input: complex; output: float
-
- self.fm_demod = gr.fmdet_cf (demod_rate, lowfreq, highfreq, 0.05)
-
- # input: float; output: float
- self.deemph_Left = fm_deemph (audio_rate)
- self.deemph_Right = fm_deemph (audio_rate)
-
- # compute FIR filter taps for audio filter
- width_of_transition_band = audio_rate / 32
- audio_coeffs = gr.firdes.low_pass (1.0 , # gain
- demod_rate, # sampling rate
- 15000 ,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
-
- # input: float; output: float
- self.audio_filter = gr.fir_filter_fff (audio_decimation, audio_coeffs)
- if 1:
- # Pick off the stereo carrier/2 with this filter. It
- # attenuated 10 dB so apply 10 dB gain We pick off the
- # negative frequency half because we want to base band by
- # it!
- ## NOTE THIS WAS HACKED TO OFFSET INSERTION LOSS DUE TO
- ## DEEMPHASIS
-
- stereo_carrier_filter_coeffs = gr.firdes.complex_band_pass(10.0,
- demod_rate,
- -19020,
- -18980,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
-
- #print "len stereo carrier filter = ",len(stereo_carrier_filter_coeffs)
- #print "stereo carrier filter ", stereo_carrier_filter_coeffs
- #print "width of transition band = ",width_of_transition_band, " audio rate = ", audio_rate
-
- # Pick off the double side band suppressed carrier
- # Left-Right audio. It is attenuated 10 dB so apply 10 dB
- # gain
-
- stereo_dsbsc_filter_coeffs = gr.firdes.complex_band_pass(20.0,
- demod_rate,
- 38000-15000/2,
- 38000+15000/2,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
- #print "len stereo dsbsc filter = ",len(stereo_dsbsc_filter_coeffs)
- #print "stereo dsbsc filter ", stereo_dsbsc_filter_coeffs
-
- # construct overlap add filter system from coefficients
- # for stereo carrier
- self.stereo_carrier_filter = gr.fir_filter_fcc(audio_decimation,
- stereo_carrier_filter_coeffs)
-
- # carrier is twice the picked off carrier so arrange to do
- # a commplex multiply
- self.stereo_carrier_generator = gr.multiply_cc();
-
- # Pick off the rds signal
- stereo_rds_filter_coeffs = gr.firdes.complex_band_pass(30.0,
- demod_rate,
- 57000 - 1500,
- 57000 + 1500,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
- #print "len stereo dsbsc filter = ",len(stereo_dsbsc_filter_coeffs)
- #print "stereo dsbsc filter ", stereo_dsbsc_filter_coeffs
- # construct overlap add filter system from coefficients for stereo carrier
-
- self.rds_signal_filter = gr.fir_filter_fcc(audio_decimation,
- stereo_rds_filter_coeffs)
- self.rds_carrier_generator = gr.multiply_cc();
- self.rds_signal_generator = gr.multiply_cc();
- self_rds_signal_processor = gr.null_sink(gr.sizeof_gr_complex);
-
- loop_bw = 2*math.pi/100.0
- max_freq = -2.0*math.pi*18990/audio_rate;
- min_freq = -2.0*math.pi*19010/audio_rate;
- self.stereo_carrier_pll_recovery = gr.pll_refout_cc(loop_bw,
- max_freq,
- min_freq);
-
- #self.stereo_carrier_pll_recovery.squelch_enable(False)
- ##pll_refout does not have squelch yet, so disabled for
- #now
-
- # set up mixer (multiplier) to get the L-R signal at
- # baseband
-
- self.stereo_basebander = gr.multiply_cc();
-
- # pick off the real component of the basebanded L-R
- # signal. The imaginary SHOULD be zero
-
- self.LmR_real = gr.complex_to_real();
- self.Make_Left = gr.add_ff();
- self.Make_Right = gr.sub_ff();
-
- self.stereo_dsbsc_filter = gr.fir_filter_fcc(audio_decimation,
- stereo_dsbsc_filter_coeffs)
-
-
- if 1:
-
- # send the real signal to complex filter to pick off the
- # carrier and then to one side of a multiplier
- self.connect (self, self.fm_demod, self.stereo_carrier_filter,
- self.stereo_carrier_pll_recovery,
- (self.stereo_carrier_generator,0))
-
- # send the already filtered carrier to the otherside of the carrier
- # the resulting signal from this multiplier is the carrier
- # with correct phase but at -38000 Hz.
- self.connect (self.stereo_carrier_pll_recovery, (self.stereo_carrier_generator,1))
-
- # send the new carrier to one side of the mixer (multiplier)
- self.connect (self.stereo_carrier_generator, (self.stereo_basebander,0))
-
- # send the demphasized audio to the DSBSC pick off filter, the complex
- # DSBSC signal at +38000 Hz is sent to the other side of the mixer/multiplier
- # the result is BASEBANDED DSBSC with phase zero!
- self.connect (self.fm_demod,self.stereo_dsbsc_filter, (self.stereo_basebander,1))
-
- # Pick off the real part since the imaginary is
- # theoretically zero and then to one side of a summer
- self.connect (self.stereo_basebander, self.LmR_real, (self.Make_Left,0))
-
- #take the same real part of the DSBSC baseband signal and
- #send it to negative side of a subtracter
- self.connect (self.LmR_real,(self.Make_Right,1))
-
- # Make rds carrier by taking the squared pilot tone and
- # multiplying by pilot tone
- self.connect (self.stereo_basebander,(self.rds_carrier_generator,0))
- self.connect (self.stereo_carrier_pll_recovery,(self.rds_carrier_generator,1))
-
- # take signal, filter off rds, send into mixer 0 channel
- self.connect (self.fm_demod,self.rds_signal_filter,(self.rds_signal_generator,0))
-
- # take rds_carrier_generator output and send into mixer 1
- # channel
- self.connect (self.rds_carrier_generator,(self.rds_signal_generator,1))
-
- # send basebanded rds signal and send into "processor"
- # which for now is a null sink
- self.connect (self.rds_signal_generator,self_rds_signal_processor)
-
-
- if 1:
- # pick off the audio, L+R that is what we used to have and
- # send it to the summer
- self.connect(self.fm_demod, self.audio_filter, (self.Make_Left, 1))
-
- # take the picked off L+R audio and send it to the PLUS
- # side of the subtractor
- self.connect(self.audio_filter,(self.Make_Right, 0))
-
- # The result of Make_Left gets (L+R) + (L-R) and results in 2*L
- # The result of Make_Right gets (L+R) - (L-R) and results in 2*R
- self.connect(self.Make_Left , self.deemph_Left, (self, 0))
- self.connect(self.Make_Right, self.deemph_Right, (self, 1))
-
- # NOTE: mono support will require variable number of outputs in hier_block2s
- # See ticket:174 in Trac database
- #else:
- # self.connect (self.fm_demod, self.audio_filter, self)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_pll.py b/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_pll.py
deleted file mode 100644
index 0b8706bf27..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_rcv_pll.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#
-# Copyright 2005,2006 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.
-#
-
-from gnuradio import gr
-from gnuradio.blks2impl.fm_emph import fm_deemph
-import math
-
-class wfm_rcv_pll(gr.hier_block2):
- def __init__ (self, demod_rate, audio_decimation):
- """
- Hierarchical block for demodulating a broadcast FM signal.
-
- The input is the downconverted complex baseband signal (gr_complex).
- The output is two streams of the demodulated audio (float) 0=Left, 1=Right.
-
- Args:
- demod_rate: input sample rate of complex baseband input. (float)
- audio_decimation: how much to decimate demod_rate to get to audio. (integer)
- """
- gr.hier_block2.__init__(self, "wfm_rcv_pll",
- gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
- gr.io_signature(2, 2, gr.sizeof_float)) # Output signature
- bandwidth = 250e3
- audio_rate = demod_rate / audio_decimation
-
-
- # We assign to self so that outsiders can grab the demodulator
- # if they need to. E.g., to plot its output.
- #
- # input: complex; output: float
- loop_bw = 2*math.pi/100.0
- max_freq = 2.0*math.pi*90e3/demod_rate
- self.fm_demod = gr.pll_freqdet_cf (loop_bw, max_freq,-max_freq)
-
- # input: float; output: float
- self.deemph_Left = fm_deemph (audio_rate)
- self.deemph_Right = fm_deemph (audio_rate)
-
- # compute FIR filter taps for audio filter
- width_of_transition_band = audio_rate / 32
- audio_coeffs = gr.firdes.low_pass (1.0 , # gain
- demod_rate, # sampling rate
- 15000 ,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
- # input: float; output: float
- self.audio_filter = gr.fir_filter_fff (audio_decimation, audio_coeffs)
- if 1:
- # Pick off the stereo carrier/2 with this filter. It attenuated 10 dB so apply 10 dB gain
- # We pick off the negative frequency half because we want to base band by it!
- ## NOTE THIS WAS HACKED TO OFFSET INSERTION LOSS DUE TO DEEMPHASIS
-
- stereo_carrier_filter_coeffs = gr.firdes.complex_band_pass(10.0,
- demod_rate,
- -19020,
- -18980,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
-
- #print "len stereo carrier filter = ",len(stereo_carrier_filter_coeffs)
- #print "stereo carrier filter ", stereo_carrier_filter_coeffs
- #print "width of transition band = ",width_of_transition_band, " audio rate = ", audio_rate
-
- # Pick off the double side band suppressed carrier Left-Right audio. It is attenuated 10 dB so apply 10 dB gain
-
- stereo_dsbsc_filter_coeffs = gr.firdes.complex_band_pass(20.0,
- demod_rate,
- 38000-15000/2,
- 38000+15000/2,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
- #print "len stereo dsbsc filter = ",len(stereo_dsbsc_filter_coeffs)
- #print "stereo dsbsc filter ", stereo_dsbsc_filter_coeffs
- # construct overlap add filter system from coefficients for stereo carrier
-
- self.stereo_carrier_filter = gr.fir_filter_fcc(audio_decimation, stereo_carrier_filter_coeffs)
-
- # carrier is twice the picked off carrier so arrange to do a commplex multiply
-
- self.stereo_carrier_generator = gr.multiply_cc();
-
- # Pick off the rds signal
-
- stereo_rds_filter_coeffs = gr.firdes.complex_band_pass(30.0,
- demod_rate,
- 57000 - 1500,
- 57000 + 1500,
- width_of_transition_band,
- gr.firdes.WIN_HAMMING)
- #print "len stereo dsbsc filter = ",len(stereo_dsbsc_filter_coeffs)
- #print "stereo dsbsc filter ", stereo_dsbsc_filter_coeffs
- # construct overlap add filter system from coefficients for stereo carrier
-
- self.rds_signal_filter = gr.fir_filter_fcc(audio_decimation, stereo_rds_filter_coeffs)
-
-
-
-
-
-
- self.rds_carrier_generator = gr.multiply_cc();
- self.rds_signal_generator = gr.multiply_cc();
- self_rds_signal_processor = gr.null_sink(gr.sizeof_gr_complex);
-
-
-
- loop_bw = 2*math.pi/100.0
- max_freq = -2.0*math.pi*18990/audio_rate;
- min_freq = -2.0*math.pi*19010/audio_rate;
-
- self.stereo_carrier_pll_recovery = gr.pll_refout_cc(loop_bw, max_freq, min_freq);
- #self.stereo_carrier_pll_recovery.squelch_enable(False) #pll_refout does not have squelch yet, so disabled for now
-
-
- # set up mixer (multiplier) to get the L-R signal at baseband
-
- self.stereo_basebander = gr.multiply_cc();
-
- # pick off the real component of the basebanded L-R signal. The imaginary SHOULD be zero
-
- self.LmR_real = gr.complex_to_real();
- self.Make_Left = gr.add_ff();
- self.Make_Right = gr.sub_ff();
-
- self.stereo_dsbsc_filter = gr.fir_filter_fcc(audio_decimation, stereo_dsbsc_filter_coeffs)
-
-
- if 1:
-
- # send the real signal to complex filter to pick off the carrier and then to one side of a multiplier
- self.connect (self, self.fm_demod,self.stereo_carrier_filter,self.stereo_carrier_pll_recovery, (self.stereo_carrier_generator,0))
- # send the already filtered carrier to the otherside of the carrier
- self.connect (self.stereo_carrier_pll_recovery, (self.stereo_carrier_generator,1))
- # the resulting signal from this multiplier is the carrier with correct phase but at -38000 Hz.
-
- # send the new carrier to one side of the mixer (multiplier)
- self.connect (self.stereo_carrier_generator, (self.stereo_basebander,0))
- # send the demphasized audio to the DSBSC pick off filter, the complex
- # DSBSC signal at +38000 Hz is sent to the other side of the mixer/multiplier
- self.connect (self.fm_demod,self.stereo_dsbsc_filter, (self.stereo_basebander,1))
- # the result is BASEBANDED DSBSC with phase zero!
-
- # Pick off the real part since the imaginary is theoretically zero and then to one side of a summer
- self.connect (self.stereo_basebander, self.LmR_real, (self.Make_Left,0))
- #take the same real part of the DSBSC baseband signal and send it to negative side of a subtracter
- self.connect (self.LmR_real,(self.Make_Right,1))
-
- # Make rds carrier by taking the squared pilot tone and multiplying by pilot tone
- self.connect (self.stereo_basebander,(self.rds_carrier_generator,0))
- self.connect (self.stereo_carrier_pll_recovery,(self.rds_carrier_generator,1))
- # take signal, filter off rds, send into mixer 0 channel
- self.connect (self.fm_demod,self.rds_signal_filter,(self.rds_signal_generator,0))
- # take rds_carrier_generator output and send into mixer 1 channel
- self.connect (self.rds_carrier_generator,(self.rds_signal_generator,1))
- # send basebanded rds signal and send into "processor" which for now is a null sink
- self.connect (self.rds_signal_generator,self_rds_signal_processor)
-
-
- if 1:
- # pick off the audio, L+R that is what we used to have and send it to the summer
- self.connect(self.fm_demod, self.audio_filter, (self.Make_Left, 1))
- # take the picked off L+R audio and send it to the PLUS side of the subtractor
- self.connect(self.audio_filter,(self.Make_Right, 0))
- # The result of Make_Left gets (L+R) + (L-R) and results in 2*L
- # The result of Make_Right gets (L+R) - (L-R) and results in 2*R
- self.connect(self.Make_Left , self.deemph_Left, (self, 0))
- self.connect(self.Make_Right, self.deemph_Right, (self, 1))
- # NOTE: mono support will require variable number of outputs in hier_block2s
- # See ticket:174 in Trac database
- #else:
- # self.connect (self.fm_demod, self.audio_filter, self)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_tx.py b/gnuradio-core/src/python/gnuradio/blks2impl/wfm_tx.py
deleted file mode 100644
index e7547d6524..0000000000
--- a/gnuradio-core/src/python/gnuradio/blks2impl/wfm_tx.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# Copyright 2005,2007 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.
-#
-
-import math
-from gnuradio import gr, optfir
-from gnuradio.blks2impl.fm_emph import fm_preemph
-
-class wfm_tx(gr.hier_block2):
- def __init__(self, audio_rate, quad_rate, tau=75e-6, max_dev=75e3):
- """
- Wide Band FM Transmitter.
-
- Takes a single float input stream of audio samples in the range [-1,+1]
- and produces a single FM modulated complex baseband output.
-
- Args:
- audio_rate: sample rate of audio stream, >= 16k (integer)
- quad_rate: sample rate of output stream (integer)
- tau: preemphasis time constant (default 75e-6) (float)
- max_dev: maximum deviation in Hz (default 75e3) (float)
-
- quad_rate must be an integer multiple of audio_rate.
- """
- gr.hier_block2.__init__(self, "wfm_tx",
- gr.io_signature(1, 1, gr.sizeof_float), # Input signature
- gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
-
- # FIXME audio_rate and quad_rate ought to be exact rationals
- audio_rate = int(audio_rate)
- quad_rate = int(quad_rate)
-
- if quad_rate % audio_rate != 0:
- raise ValueError, "quad_rate is not an integer multiple of audio_rate"
-
-
- do_interp = audio_rate != quad_rate
-
- if do_interp:
- interp_factor = quad_rate / audio_rate
- interp_taps = optfir.low_pass (interp_factor, # gain
- quad_rate, # Fs
- 16000, # passband cutoff
- 18000, # stopband cutoff
- 0.1, # passband ripple dB
- 40) # stopband atten dB
-
- print "len(interp_taps) =", len(interp_taps)
- self.interpolator = gr.interp_fir_filter_fff (interp_factor, interp_taps)
-
- self.preemph = fm_preemph (quad_rate, tau=tau)
-
- k = 2 * math.pi * max_dev / quad_rate
- self.modulator = gr.frequency_modulator_fc (k)
-
- if do_interp:
- self.connect (self, self.interpolator, self.preemph, self.modulator, self)
- else:
- self.connect(self, self.preemph, self.modulator, self)
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_pll_carriertracking.py b/gnuradio-core/src/python/gnuradio/gr/qa_pll_carriertracking.py
deleted file mode 100755
index 8964db53db..0000000000
--- a/gnuradio-core/src/python/gnuradio/gr/qa_pll_carriertracking.py
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2004,2007,2010,2011 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.
-#
-
-from gnuradio import gr, gr_unittest
-import math
-
-class test_pll_carriertracking (gr_unittest.TestCase):
-
- def setUp (self):
- self.tb = gr.top_block()
-
- def tearDown (self):
- self.tb = None
-
- def test_pll_carriertracking (self):
- expected_result = ((1.00000238419+7.21919457547e-09j),
- (0.998025715351+0.062790453434j),
- (0.992777824402+0.119947694242j),
- (0.985192835331+0.171441286802j),
- (0.976061582565+0.217501848936j),
- (0.966034710407+0.258409559727j),
- (0.95565611124+0.294477283955j),
- (0.945357382298+0.326030552387j),
- (0.935475051403+0.353395611048j),
- (0.926258146763+0.376889169216j),
- (0.917895197868+0.39681750536j),
- (0.910515546799+0.413470208645j),
- (0.904196679592+0.427117019892j),
- (0.898972511292+0.438006043434j),
- (0.894769787788+0.446523308754j),
- (0.891652584076+0.452715367079j),
- (0.8895829916+0.456773489714j),
- (0.888502895832+0.458873122931j),
- (0.888343691826+0.459175437689j),
- (0.889035582542+0.457833081484j),
- (0.890497922897+0.454985737801j),
- (0.892645597458+0.450762689114j),
- (0.895388305187+0.445282936096j),
- (0.898648142815+0.438664674759j),
- (0.902342617512+0.431016951799j),
- (0.906392872334+0.422441422939j),
- (0.910642921925+0.413191765547j),
- (0.915039420128+0.403358519077j),
- (0.919594764709+0.392864197493j),
- (0.92425006628+0.381792247295j),
- (0.928944349289+0.370217680931j),
- (0.933634519577+0.358220815659j),
- (0.938279032707+0.345874190331j),
- (0.942840516567+0.333247303963j),
- (0.947280526161+0.32040438056j),
- (0.951574921608+0.307409763336j),
- (0.955703914165+0.294323593378j),
- (0.959648966789+0.281201630831j),
- (0.963392794132+0.268095195293j),
- (0.966880619526+0.255221515894j),
- (0.970162451267+0.242447137833j),
- (0.973235487938+0.229809194803j),
- (0.97609680891+0.217341512442j),
- (0.978744983673+0.20507311821j),
- (0.981189727783+0.193033605814j),
- (0.983436584473+0.181248426437j),
- (0.985490739346+0.169738590717j),
- (0.987353682518+0.158523857594j),
- (0.989041447639+0.147622272372j),
- (0.990563035011+0.137049794197j),
- (0.991928339005+0.126818582416j),
- (0.993117690086+0.117111675441j),
- (0.994156062603+0.107930034399j),
- (0.995076179504+0.0990980416536j),
- (0.995887458324+0.0906178802252j),
- (0.996591091156+0.0824909061193j),
- (0.997202515602+0.0747182965279j),
- (0.997730851173+0.0672992765903j),
- (0.998185396194+0.0602316558361j),
- (0.99856698513+0.0535135567188j),
- (0.998885989189+0.0471420884132j),
- (0.99915266037+0.0411129891872j),
- (0.999372899532+0.0354214012623j),
- (0.999548316002+0.0300626158714j),
- (0.999680638313+0.0252036750317j),
- (0.999784469604+0.020652115345j),
- (0.999865531921+0.0163950324059j),
- (0.999923825264+0.0124222636223j),
- (0.999960243702+0.00872156023979j),
- (0.999983668327+0.00528120994568j),
- (0.999997138977+0.00209015607834j),
- (1.00000119209-0.00086285173893j),
- (0.999992132187-0.00358882546425j),
- (0.999979138374-0.00609711557627j),
- (0.999963641167-0.00839691981673j),
- (0.999947249889-0.0104993218556j),
- (0.999924004078-0.0122378543019j),
- (0.999904811382-0.0136305987835j),
- (0.999888062477-0.0148707330227j),
- (0.9998742342-0.0159679055214j),
- (0.999856114388-0.0169314742088j),
- (0.999839782715-0.0177700817585j),
- (0.999826967716-0.0184917747974j),
- (0.999818325043-0.0191045701504j),
- (0.999807476997-0.0196143388748j),
- (0.999797284603-0.0200265944004j),
- (0.999791204929-0.0203481912613j),
- (0.99978852272-0.0205836892128j),
- (0.99978530407-0.0207380950451j),
- (0.999785065651-0.0206423997879j),
- (0.999787807465-0.0204866230488j),
- (0.999794304371-0.0202808082104j),
- (0.999800384045-0.0200312435627j),
- (0.999803245068-0.0197458267212j),
- (0.9998087883-0.0194311738014j),
- (0.999816894531-0.0190933048725j),
- (0.999825954437-0.0187371373177j),
- (0.999829888344-0.0183679759502j),
- (0.999835848808-0.017987690866j),
- (0.999844014645-0.0176006518304j))
-
- sampling_freq = 10e3
- freq = sampling_freq / 100
-
- loop_bw = math.pi/100.0
- maxf = 1
- minf = -1
-
- src = gr.sig_source_c (sampling_freq, gr.GR_COS_WAVE, freq, 1.0)
- pll = gr.pll_carriertracking_cc(loop_bw, maxf, minf)
- head = gr.head (gr.sizeof_gr_complex, int (freq))
- dst = gr.vector_sink_c ()
-
- self.tb.connect (src, pll, head)
- self.tb.connect (head, dst)
-
- self.tb.run ()
- dst_data = dst.data ()
- self.assertComplexTuplesAlmostEqual (expected_result, dst_data, 5)
-
-if __name__ == '__main__':
- gr_unittest.run(test_pll_carriertracking, "test_pll_carriertracking.xml")
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_pll_freqdet.py b/gnuradio-core/src/python/gnuradio/gr/qa_pll_freqdet.py
deleted file mode 100755
index 219e9b84b6..0000000000
--- a/gnuradio-core/src/python/gnuradio/gr/qa_pll_freqdet.py
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2004,2007,2010,2011 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.
-#
-
-from gnuradio import gr, gr_unittest
-import math
-
-class test_pll_freqdet (gr_unittest.TestCase):
-
- def setUp (self):
- self.tb = gr.top_block()
-
- def tearDown (self):
- self.tb = None
-
- def test_pll_freqdet (self):
- expected_result = (0.0,
- 4.33888922882e-08,
- 0.367369994515,
- 1.08135249597,
- 2.10983253908,
- 3.42221529438,
- 4.98940390402,
- 6.78379190842,
- 8.77923286024,
- 10.9510106794,
- 13.2758363182,
- 15.7317829127,
- 18.2982902299,
- 20.9561068599,
- 23.6755271122,
- 26.452952094,
- 29.2731265301,
- 32.1219053479,
- 34.9862418188,
- 37.8540971414,
- 40.7144315483,
- 43.5571390869,
- 46.3730179743,
- 49.1537231663,
- 51.8917218889,
- 54.58026103,
- 57.2015358514,
- 59.7513664199,
- 62.2380533124,
- 64.657612252,
- 67.006640002,
- 69.2822432184,
- 71.4820384499,
- 73.6041047056,
- 75.6469478817,
- 77.6094829742,
- 79.4909866472,
- 81.2911031615,
- 83.0097850853,
- 84.6355598352,
- 86.1820937186,
- 87.6504420946,
- 89.0418441206,
- 90.3577286819,
- 91.5996432431,
- 92.7692775646,
- 93.8684162704,
- 94.8989269904,
- 95.8627662892,
- 96.7619381633,
- 97.598505899,
- 98.362769679,
- 99.0579904444,
- 99.6992633875,
- 100.288805948,
- 100.828805921,
- 101.321421457,
- 101.76878699,
- 102.17300138,
- 102.536116055,
- 102.860158727,
- 103.147085962,
- 103.398830608,
- 103.617254366,
- 103.792467691,
- 103.939387906,
- 104.060030865,
- 104.15631756,
- 104.230085975,
- 104.283067372,
- 104.316933727,
- 104.333238432,
- 104.333440018,
- 104.318914008,
- 104.290941063,
- 104.250742554,
- 104.187634452,
- 104.103822339,
- 104.013227468,
- 103.916810336,
- 103.815448432,
- 103.709936239,
- 103.600997093,
- 103.489283183,
- 103.375351833,
- 103.259712936,
- 103.142828952,
- 103.025091195,
- 102.90686726,
- 102.776726069,
- 102.648078982,
- 102.521459607,
- 102.397294831,
- 102.275999684,
- 102.157882471,
- 102.043215927,
- 101.93218978,
- 101.824958181,
- 101.72159228,
- 101.622151366)
-
- sampling_freq = 10e3
- freq = sampling_freq / 100
-
- loop_bw = math.pi/100.0
- maxf = 1
- minf = -1
-
- src = gr.sig_source_c (sampling_freq, gr.GR_COS_WAVE, freq, 1.0)
- pll = gr.pll_freqdet_cf(loop_bw, maxf, minf)
- head = gr.head (gr.sizeof_float, int (freq))
- dst = gr.vector_sink_f ()
-
- self.tb.connect (src, pll, head)
- self.tb.connect (head, dst)
-
- self.tb.run ()
- dst_data = dst.data ()
-
- # convert it from normalized frequency to absolute frequency (Hz)
- dst_data = [i*(sampling_freq/(2*math.pi)) for i in dst_data]
-
- self.assertFloatTuplesAlmostEqual (expected_result, dst_data, 3)
-
-if __name__ == '__main__':
- gr_unittest.run(test_pll_freqdet, "test_pll_freqdet.xml")
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_pll_refout.py b/gnuradio-core/src/python/gnuradio/gr/qa_pll_refout.py
deleted file mode 100755
index f319f63814..0000000000
--- a/gnuradio-core/src/python/gnuradio/gr/qa_pll_refout.py
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2004,2010 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.
-#
-
-from gnuradio import gr, gr_unittest
-import math
-
-class test_pll_refout (gr_unittest.TestCase):
-
- def setUp (self):
- self.tb = gr.top_block()
-
- def tearDown (self):
- self.tb = None
-
- def test_pll_refout (self):
- expected_result = ((1+0j),
- (1+6.4087357643e-10j),
- (0.999985277653+0.00542619498447j),
- (0.999868750572+0.0162021834403j),
- (0.99948567152+0.0320679470897j),
- (0.99860727787+0.0527590736747j),
- (0.996953129768+0.0780025869608j),
- (0.994203746319+0.107512556016j),
- (0.990011692047+0.140985429287j),
- (0.984013140202+0.178095817566j),
- (0.975838363171+0.218493551016j),
- (0.965121984482+0.261800557375j),
- (0.95151245594+0.307610183954j),
- (0.934681296349+0.355486690998j),
- (0.914401650429+0.404808044434j),
- (0.890356600285+0.455263823271j),
- (0.862329125404+0.506348133087j),
- (0.830152392387+0.557536482811j),
- (0.793714106083+0.608290970325j),
- (0.752960026264+0.658066213131j),
- (0.707896590233+0.706316053867j),
- (0.658591926098+0.752500295639j),
- (0.605175673962+0.796091973782j),
- (0.547837555408+0.836584687233j),
- (0.48682525754+0.873499393463j),
- (0.42244040966+0.906390726566j),
- (0.355197101831+0.934791445732j),
- (0.285494059324+0.958380460739j),
- (0.213591173291+0.976923108101j),
- (0.139945343137+0.990159213543j),
- (0.065038472414+0.997882783413j),
- (-0.0106285437942+0.999943494797j),
- (-0.0865436866879+0.996248066425j),
- (-0.162189796567+0.986759603024j),
- (-0.23705175519+0.971496999264j),
- (-0.310622543097+0.950533330441j),
- (-0.38240903616+0.923993110657j),
- (-0.451937526464+0.89204955101j),
- (-0.518758952618+0.854920566082j),
- (-0.582311093807+0.812966048717j),
- (-0.642372369766+0.76639264822j),
- (-0.698591887951+0.715520322323j),
- (-0.750654160976+0.660695314407j),
- (-0.798280358315+0.602286040783j),
- (-0.841228663921+0.540679454803j),
- (-0.87929558754+0.476276367903j),
- (-0.912315964699+0.409486919641j),
- (-0.940161883831+0.340728074312j),
- (-0.962742805481+0.270418733358j),
- (-0.980004072189+0.198977485299j),
- (-0.991925954819+0.126818284392j),
- (-0.99851256609+0.0545223206282j),
- (-0.999846458435-0.0175215266645j),
- (-0.996021270752-0.0891158208251j),
- (-0.987133920193-0.159895718098j),
- (-0.973306238651-0.2295101583j),
- (-0.954683184624-0.297624111176j),
- (-0.931430280209-0.363919824362j),
- (-0.903732538223-0.428097635508j),
- (-0.871792256832-0.489875763655j),
- (-0.835827112198-0.548992812634j),
- (-0.796068251133-0.605206847191j),
- (-0.752758979797-0.658296227455j),
- (-0.706152498722-0.70805978775j),
- (-0.656641483307-0.754202902317j),
- (-0.604367733002-0.79670548439j),
- (-0.549597978592-0.835429251194j),
- (-0.492602348328-0.870254516602j),
- (-0.433654457331-0.901079237461j),
- (-0.373029649258-0.927819430828j),
- (-0.31100410223-0.950408577919j),
- (-0.247853919864-0.968797445297j),
- (-0.183855071664-0.982953369617j),
- (-0.119282215834-0.992860376835j),
- (-0.0544078871608-0.998518764973j),
- (0.0104992967099-0.999944865704j),
- (0.0749994292855-0.997183561325j),
- (0.138844624162-0.990314185619j),
- (0.201967850327-0.979392170906j),
- (0.264124274254-0.964488625526j),
- (0.325075358152-0.945688128471j),
- (0.3845885396-0.92308807373j),
- (0.442438393831-0.89679890871j),
- (0.498407125473-0.866943061352j),
- (0.552284479141-0.833655714989j),
- (0.603869199753-0.797083437443j),
- (0.652970373631-0.757383465767j),
- (0.69940674305-0.714723825455j),
- (0.743007957935-0.66928255558j),
- (0.78350687027-0.62138313055j),
- (0.820889055729-0.571087777615j),
- (0.855021059513-0.51859331131j),
- (0.885780930519-0.46410369873j),
- (0.913058102131-0.407829582691j),
- (0.936754107475-0.349988251925j),
- (0.956783294678-0.290801793337j),
- (0.973072886467-0.230497643352j),
- (0.985563337803-0.169307261705j),
- (0.9942086339-0.1074674353j),
- (0.9989772439-0.0452152714133j))
-
- sampling_freq = 10e3
- freq = sampling_freq / 100
-
- loop_bw = math.pi/100.0
- maxf = 1
- minf = -1
-
- src = gr.sig_source_c (sampling_freq, gr.GR_COS_WAVE, freq, 1.0)
- pll = gr.pll_refout_cc(loop_bw, maxf, minf)
- head = gr.head (gr.sizeof_gr_complex, int (freq))
- dst = gr.vector_sink_c ()
-
- self.tb.connect (src, pll, head)
- self.tb.connect (head, dst)
-
- self.tb.run ()
- dst_data = dst.data ()
- self.assertComplexTuplesAlmostEqual (expected_result, dst_data, 4)
-
-if __name__ == '__main__':
- gr_unittest.run(test_pll_refout, "test_pll_refout.xml")