summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-core/src/lib/filter/gr_dc_blocker_cc.h34
-rw-r--r--gnuradio-core/src/lib/filter/gr_dc_blocker_ff.h35
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h127
-rw-r--r--gr-digital/include/digital_clock_recovery_mm_cc.h9
-rw-r--r--grc/python/extract_docs.py5
5 files changed, 115 insertions, 95 deletions
diff --git a/gnuradio-core/src/lib/filter/gr_dc_blocker_cc.h b/gnuradio-core/src/lib/filter/gr_dc_blocker_cc.h
index d299cc7ef..aa23bc135 100644
--- a/gnuradio-core/src/lib/filter/gr_dc_blocker_cc.h
+++ b/gnuradio-core/src/lib/filter/gr_dc_blocker_cc.h
@@ -27,18 +27,33 @@
#include <gr_sync_block.h>
#include <deque>
+class moving_averager_c
+{
+public:
+ moving_averager_c(int D);
+ ~moving_averager_c();
+
+ gr_complex filter(gr_complex x);
+ gr_complex delayed_sig() { return d_out; }
+
+private:
+ int d_length;
+ gr_complex d_out, d_out_d1, d_out_d2;
+ std::deque<gr_complex> d_delay_line;
+};
+
class gr_dc_blocker_cc;
typedef boost::shared_ptr<gr_dc_blocker_cc> gr_dc_blocker_cc_sptr;
gr_dc_blocker_cc_sptr gr_make_dc_blocker_cc (int D=32, bool long_form=true);
/*!
* \class gr_dc_blocker_cc
- * \brief a computationally efficient controllabel DC blocker
+ * \brief a computationally efficient controllable DC blocker
*
* \ingroup filter_blk
*
* This block implements a computationally efficient DC blocker that produces
- * a tigher notch filter around DC for a smaller group delay than an
+ * a tighter notch filter around DC for a smaller group delay than an
* equivalent FIR filter or using a single pole IIR filter (though the IIR
* filter is computationally cheaper).
*
@@ -57,21 +72,6 @@ gr_dc_blocker_cc_sptr gr_make_dc_blocker_cc (int D=32, bool long_form=true);
* <B><EM>R. Yates, "DC Blocker Algorithms," IEEE Signal Processing Magazine,
* Mar. 2008, pp 132-134.</EM></B>
*/
-class moving_averager_c
-{
-public:
- moving_averager_c(int D);
- ~moving_averager_c();
-
- gr_complex filter(gr_complex x);
- gr_complex delayed_sig() { return d_out; }
-
-private:
- int d_length;
- gr_complex d_out, d_out_d1, d_out_d2;
- std::deque<gr_complex> d_delay_line;
-};
-
class gr_dc_blocker_cc : public gr_sync_block
{
private:
diff --git a/gnuradio-core/src/lib/filter/gr_dc_blocker_ff.h b/gnuradio-core/src/lib/filter/gr_dc_blocker_ff.h
index 8ffb6cf6f..231710a53 100644
--- a/gnuradio-core/src/lib/filter/gr_dc_blocker_ff.h
+++ b/gnuradio-core/src/lib/filter/gr_dc_blocker_ff.h
@@ -27,18 +27,34 @@
#include <gr_sync_block.h>
#include <deque>
+class moving_averager_f
+{
+public:
+ moving_averager_f(int D);
+ ~moving_averager_f();
+
+ float filter(float x);
+ float delayed_sig() { return d_out; }
+
+private:
+ int d_length;
+ float d_out, d_out_d1, d_out_d2;
+ std::deque<float> d_delay_line;
+};
+
+
class gr_dc_blocker_ff;
typedef boost::shared_ptr<gr_dc_blocker_ff> gr_dc_blocker_ff_sptr;
gr_dc_blocker_ff_sptr gr_make_dc_blocker_ff (int D=32, bool long_form=true);
/*!
* \class gr_dc_blocker_ff
- * \brief a computationally efficient controllabel DC blocker
+ * \brief a computationally efficient controllable DC blocker
*
* \ingroup filter_blk
*
* This block implements a computationally efficient DC blocker that produces
- * a tigher notch filter around DC for a smaller group delay than an
+ * a tighter notch filter around DC for a smaller group delay than an
* equivalent FIR filter or using a single pole IIR filter (though the IIR
* filter is computationally cheaper).
*
@@ -57,21 +73,6 @@ gr_dc_blocker_ff_sptr gr_make_dc_blocker_ff (int D=32, bool long_form=true);
* <B><EM>R. Yates, "DC Blocker Algorithms," IEEE Signal Processing Magazine,
* Mar. 2008, pp 132-134.</EM></B>
*/
-class moving_averager_f
-{
-public:
- moving_averager_f(int D);
- ~moving_averager_f();
-
- float filter(float x);
- float delayed_sig() { return d_out; }
-
-private:
- int d_length;
- float d_out, d_out_d1, d_out_d2;
- std::deque<float> d_delay_line;
-};
-
class gr_dc_blocker_ff : public gr_sync_block
{
private:
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
index 06a6f5720..1ef5fb6ff 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -44,70 +44,83 @@ class gr_fir_ccf;
*
* \ingroup filter_blk
*
- * This block performs timing synchronization for PAM signals by minimizing the
- * derivative of the filtered signal, which in turn maximizes the SNR and
- * minimizes ISI.
+ * This block performs timing synchronization for PAM signals by
+ * minimizing the derivative of the filtered signal, which in turn
+ * maximizes the SNR and minimizes ISI.
*
- * This approach works by setting up two filterbanks; one filterbank contains the
- * signal's pulse shaping matched filter (such as a root raised cosine filter),
- * where each branch of the filterbank contains a different phase of the filter.
- * The second filterbank contains the derivatives of the filters in the first
- * filterbank. Thinking of this in the time domain, the first filterbank contains
- * filters that have a sinc shape to them. We want to align the output signal to
- * be sampled at exactly the peak of the sinc shape. The derivative of the sinc
- * contains a zero at the maximum point of the sinc (sinc(0) = 1, sinc(0)' = 0).
- * Furthermore, the region around the zero point is relatively linear. We make
- * use of this fact to generate the error signal.
+ * This approach works by setting up two filterbanks; one filterbank
+ * contains the signal's pulse shaping matched filter (such as a root
+ * raised cosine filter), where each branch of the filterbank contains
+ * a different phase of the filter. The second filterbank contains
+ * the derivatives of the filters in the first filterbank. Thinking of
+ * this in the time domain, the first filterbank contains filters that
+ * have a sinc shape to them. We want to align the output signal to be
+ * sampled at exactly the peak of the sinc shape. The derivative of
+ * the sinc contains a zero at the maximum point of the sinc (sinc(0)
+ * = 1, sinc(0)' = 0). Furthermore, the region around the zero point
+ * is relatively linear. We make use of this fact to generate the
+ * error signal.
*
- * If the signal out of the derivative filters is d_i[n] for the ith filter, and
- * the output of the matched filter is x_i[n], we calculate the error as:
- * e[n] = (Re{x_i[n]} * Re{d_i[n]} + Im{x_i[n]} * Im{d_i[n]}) / 2.0
- * This equation averages the error in the real and imaginary parts. There are two
- * reasons we multiply by the signal itself. First, if the symbol could be positive
- * or negative going, but we want the error term to always tell us to go in the
- * same direction depending on which side of the zero point we are on. The sign of
- * x_i[n] adjusts the error term to do this. Second, the magnitude of x_i[n] scales
- * the error term depending on the symbol's amplitude, so larger signals give us
- * a stronger error term because we have more confidence in that symbol's value.
- * Using the magnitude of x_i[n] instead of just the sign is especially good for
- * signals with low SNR.
+ * If the signal out of the derivative filters is d_i[n] for the ith
+ * filter, and the output of the matched filter is x_i[n], we
+ * calculate the error as: e[n] = (Re{x_i[n]} * Re{d_i[n]} +
+ * Im{x_i[n]} * Im{d_i[n]}) / 2.0 This equation averages the error in
+ * the real and imaginary parts. There are two reasons we multiply by
+ * the signal itself. First, if the symbol could be positive or
+ * negative going, but we want the error term to always tell us to go
+ * in the same direction depending on which side of the zero point we
+ * are on. The sign of x_i[n] adjusts the error term to do
+ * this. Second, the magnitude of x_i[n] scales the error term
+ * depending on the symbol's amplitude, so larger signals give us a
+ * stronger error term because we have more confidence in that
+ * symbol's value. Using the magnitude of x_i[n] instead of just the
+ * sign is especially good for signals with low SNR.
*
- * The error signal, e[n], gives us a value proportional to how far away from the zero
- * point we are in the derivative signal. We want to drive this value to zero, so we
- * set up a second order loop. We have two variables for this loop; d_k is the filter
- * number in the filterbank we are on and d_rate is the rate which we travel through
- * the filters in the steady state. That is, due to the natural clock differences between
- * the transmitter and receiver, d_rate represents that difference and would traverse
- * the filter phase paths to keep the receiver locked. Thinking of this as a second-order
- * PLL, the d_rate is the frequency and d_k is the phase. So we update d_rate and d_k
- * using the standard loop equations based on two error signals, d_alpha and d_beta.
- * We have these two values set based on each other for a critically damped system, so in
- * the block constructor, we just ask for "gain," which is d_alpha while d_beta is
- * equal to (gain^2)/4.
+ * The error signal, e[n], gives us a value proportional to how far
+ * away from the zero point we are in the derivative signal. We want
+ * to drive this value to zero, so we set up a second order loop. We
+ * have two variables for this loop; d_k is the filter number in the
+ * filterbank we are on and d_rate is the rate which we travel through
+ * the filters in the steady state. That is, due to the natural clock
+ * differences between the transmitter and receiver, d_rate represents
+ * that difference and would traverse the filter phase paths to keep
+ * the receiver locked. Thinking of this as a second-order PLL, the
+ * d_rate is the frequency and d_k is the phase. So we update d_rate
+ * and d_k using the standard loop equations based on two error
+ * signals, d_alpha and d_beta. We have these two values set based on
+ * each other for a critically damped system, so in the block
+ * constructor, we just ask for "gain," which is d_alpha while d_beta
+ * is equal to (gain^2)/4.
*
- * The clock sync block needs to know the number of samples per symbol (sps), because it
- * only returns a single point representing the symbol. The sps can be any positive real
- * number and does not need to be an integer. The filter taps must also be specified. The
- * taps are generated by first conceiving of the prototype filter that would be the signal's
- * matched filter. Then interpolate this by the number of filters in the filterbank. These
- * are then distributed among all of the filters. So if the prototype filter was to have
- * 45 taps in it, then each path of the filterbank will also have 45 taps. This is easily
- * done by building the filter with the sample rate multiplied by the number of filters
- * to use.
+ * The clock sync block needs to know the number of samples per symbol
+ * (sps), because it only returns a single point representing the
+ * symbol. The sps can be any positive real number and does not need
+ * to be an integer. The filter taps must also be specified. The taps
+ * are generated by first conceiving of the prototype filter that
+ * would be the signal's matched filter. Then interpolate this by the
+ * number of filters in the filterbank. These are then distributed
+ * among all of the filters. So if the prototype filter was to have 45
+ * taps in it, then each path of the filterbank will also have 45
+ * taps. This is easily done by building the filter with the sample
+ * rate multiplied by the number of filters to use.
*
- * The number of filters can also be set and defaults to 32. With 32 filters, you get a
- * good enough resolution in the phase to produce very small, almost unnoticeable, ISI.
- * Going to 64 filters can reduce this more, but after that there is very little gained
- * for the extra complexity.
+ * The number of filters can also be set and defaults to 32. With 32
+ * filters, you get a good enough resolution in the phase to produce
+ * very small, almost unnoticeable, ISI. Going to 64 filters can
+ * reduce this more, but after that there is very little gained for
+ * the extra complexity.
*
- * The initial phase is another settable parameter and refers to the filter path the
- * algorithm initially looks at (i.e., d_k starts at init_phase). This value defaults
- * to zero, but it might be useful to start at a different phase offset, such as the mid-
- * point of the filters.
+ * The initial phase is another settable parameter and refers to the
+ * filter path the algorithm initially looks at (i.e., d_k starts at
+ * init_phase). This value defaults to zero, but it might be useful to
+ * start at a different phase offset, such as the mid- point of the
+ * filters.
*
- * The final parameter is the max_rate_devitation, which defaults to 1.5. This is how far
- * we allow d_rate to swing, positive or negative, from 0. Constraining the rate can help
- * keep the algorithm from walking too far away to lock during times when there is no signal.
+ * The final parameter is the max_rate_devitation, which defaults to
+ * 1.5. This is how far we allow d_rate to swing, positive or
+ * negative, from 0. Constraining the rate can help keep the algorithm
+ * from walking too far away to lock during times when there is no
+ * signal.
*
*/
diff --git a/gr-digital/include/digital_clock_recovery_mm_cc.h b/gr-digital/include/digital_clock_recovery_mm_cc.h
index 023891a66..5d9c8c5e5 100644
--- a/gr-digital/include/digital_clock_recovery_mm_cc.h
+++ b/gr-digital/include/digital_clock_recovery_mm_cc.h
@@ -43,12 +43,15 @@ digital_make_clock_recovery_mm_cc (float omega, float gain_omega,
* \ingroup sync_blk
* \ingroup digital
*
- * This implements the Mueller and Müller (M&M) discrete-time error-tracking synchronizer.
+ * This implements the Mueller and Müller (M&M) discrete-time
+ * error-tracking synchronizer.
+ *
* The complex version here is based on:
* Modified Mueller and Muller clock recovery circuit
* Based:
- * G. R. Danesfahani, T.G. Jeans, "Optimisation of modified Mueller and Muller
- * algorithm," Electronics Letters, Vol. 31, no. 13, 22 June 1995, pp. 1032 - 1033.
+ * G. R. Danesfahani, T.G. Jeans, "Optimisation of modified Mueller
+ * and Muller algorithm," Electronics Letters, Vol. 31, no. 13, 22
+ * June 1995, pp. 1032 - 1033.
*/
class digital_clock_recovery_mm_cc : public gr_block
{
diff --git a/grc/python/extract_docs.py b/grc/python/extract_docs.py
index aa85397f9..be55fd239 100644
--- a/grc/python/extract_docs.py
+++ b/grc/python/extract_docs.py
@@ -26,6 +26,8 @@ DOXYGEN_NAME_XPATH = '/doxygen/compounddef/compoundname'
DOXYGEN_BRIEFDESC_GR_XPATH = '/doxygen/compounddef/briefdescription'
DOXYGEN_DETAILDESC_GR_XPATH = '/doxygen/compounddef/detaileddescription'
+GROUP_KEYS = "gr|usrp2|trellis|noaa|vocoder|digital"
+
def extract_txt(xml):
"""
Recursivly pull the text out of an xml tree.
@@ -63,7 +65,8 @@ def _extract(key):
#extract descriptions
comp_name = extract_txt(xml.xpath(DOXYGEN_NAME_XPATH)[0]).strip()
comp_name = ' --- ' + comp_name + ' --- '
- if re.match('(gr|usrp2|trellis|noaa)_.*', key):
+# if re.match('(gr|usrp2|trellis|noaa)_.*', key):
+ if re.match(('(%s)_.*' % GROUP_KEYS), key):
brief_desc = extract_txt(xml.xpath(DOXYGEN_BRIEFDESC_GR_XPATH)[0]).strip()
detailed_desc = extract_txt(xml.xpath(DOXYGEN_DETAILDESC_GR_XPATH)[0]).strip()
else: