adding proper documentation to CVSD vocoder
[debian/gnuradio] / gr-cvsd-vocoder / src / lib / cvsd_decode_bs.h
index d23c20e30a4c0cc1654528dd4b5900a42c6a667f..8f2bbbe01b2e6cd72dcda00cd7a26f4484ca403f 100644 (file)
@@ -28,6 +28,22 @@ class cvsd_decode_bs;
 
 typedef boost::shared_ptr<cvsd_decode_bs> cvsd_decode_bs_sptr;
 
+ /*!
+  * \brief Constructor parameters to initialize the CVSD decoder.  The default
+  * values are modeled after the Bluetooth standard and should not be changed,
+  * except by an advanced user
+  *
+  * \param min_step       Minimum step size used to update the internal reference.  Default: "10"
+  * \param max_step       Maximum step size used to update the internal reference.  Default: "1280"
+  * \param step_decay     Decay factor applied to step size when there is not a run of J output 1s or 0s.  Default: "0.9990234375"  (i.e. 1-1/1024)
+  * \param accum_decay    Decay factor applied to the internal reference during every interation of the codec.  Default: "0.96875"  (i.e. 1-1/32)
+  * \param K;             Size of shift register; the number of output bits remembered by codec (must be less or equal to 32).  Default: "32"
+  * \param J;             Number of bits in the shift register that are equal; i.e. the size of a run of 1s, 0s. Default: "4"
+  * \param pos_accum_max  Maximum integer value allowed for the internal reference.  Default: "32767" (2^15 - 1 or MAXSHORT)
+  * \param neg_accum_max  Minimum integer value allowed for the internal reference.  Default: "-32767" (-2^15 + 1 or MINSHORT+1)
+  *
+  */
+
 cvsd_decode_bs_sptr cvsd_make_decode_bs (short min_step=10,
                                           short max_step=1280,
                                           double step_decay=0.9990234375,
@@ -37,6 +53,58 @@ cvsd_decode_bs_sptr cvsd_make_decode_bs (short min_step=10,
                                           short pos_accum_max=32767,
                                           short neg_accum_max=-32767);
 
+/*!
+ * \brief This block performs CVSD audio decoding.  Its design and implementation
+ * is modeled after the CVSD encoder/decoder specifications defined in the
+ * Bluetooth standard.
+ *
+ * \ingroup block
+ *
+ * CVSD is a method for encoding speech that seeks to reduce the
+ * bandwidth required for digital voice transmission.  CVSD takes
+ * advantage of strong correlation between samples, quantizing the
+ * difference in amplitude between two consecutive samples.  This
+ * difference requires fewer quantization levels as compared to other
+ * methods that quantize the actual amplitude level, reducing the
+ * bandwidth.  CVSD employs a two level quantizer (one bit) and an
+ * adaptive algorithm that allows for continuous step size adjustment.
+ *
+ * The coder can represent low amplitude signals with accuracy without
+ * sacrificing performance on large amplitude signals, a trade off that
+ * occurs in some non-adaptive modulations.
+ *
+ * The CVSD decoder effectively provides 1-to-8 decompression.  More
+ * specifically, for each incoming input bit, the decoder outputs one
+ * audio sample.  If the input is a "1" bit, the internal reference is
+ * increased appropriately and then outputted as the next estimated audio
+ * sample.  If the input is a "0" bit, the internal reference is
+ * decreased appropriately and then likewise outputted as the next estimated
+ * audio sample.  Grouping 8 input bits together, the encoder essentially
+ * produces 8 output audio samples for everyone one input byte.
+ *
+ * This decoder requires that output audio samples are 2-byte short signed
+ * integers.  The result bandwidth conversion, therefore, is 1 byte of
+ * encoded audio data to 16 output bytes of raw audio data.
+ *
+ * The CVSD decoder module must be post-fixed by a down-converter to
+ * under-sample the audio data after decoding.  The Bluetooth standard
+ * specifically calls for a 8-to-1 decimating down-converter.  This is
+ * required so that so that output sampling rate equals the original input
+ * sampling rate present before the encoder.  In all cases, the output
+ * down-converter rate must be the inverse of the input up-converter rate
+ * before the CVSD encoder.
+ *
+ * References:
+ * 1.  Continuously Variable Slope Delta Modulation (CVSD) A Tutorial,
+ *         Available: http://www.eetkorea.com/ARTICLES/2003AUG/A/2003AUG29_NTEK_RFD_AN02.PDF.
+ * 2.  Specification of The Bluetooth System
+ *         Available: http://grouper.ieee.org/groups/802/15/Bluetooth/core_10_b.pdf.
+ * 3.  McGarrity, S., Bluetooth Full Duplex Voice and Data Transmission. 2002.
+ *         Bluetooth Voice Simulink® Model, Available:
+ *         http://www.mathworks.com/company/newsletters/digest/nov01/bluetooth.html
+ *
+ */
+
 class cvsd_decode_bs : public gr_sync_interpolator
 {
 private:
@@ -53,8 +121,17 @@ private:
                  double accum_decay, int K, int J,
                  short pos_accum_max, short neg_accum_max);
 
+  //! Member functions required by the encoder/decoder
+  //! \brief Rounding function specific to CVSD
+  //! \return the input value rounded to the nearest integer
   int cvsd_round(double input);
+  
+  //! \brief A power function specific to CVSD data formats
+  //! \return (radix)^power, where radix and power are short integers
   unsigned int cvsd_pow (short radix, short power);
+  //! \brief Sums number of 1's in the input
+  //! \return the number of 1s in the four bytes of an input unsigned integer
   unsigned char cvsd_bitwise_sum (unsigned int input);
 
   short d_min_step;
@@ -62,20 +139,17 @@ private:
   double d_step_decay;
   double d_accum_decay;
 
-  //! \brief Size of shift register; the number of output bits remembered in shift register
-  int d_K;
-
-  //! \brief Number of bits in the shift register that are equal; size of run of 1s, 0s
-  int d_J;
+  int d_K;  //!< \brief Size of shift register; the number of output bits remembered in shift register
+  int d_J;  //!< \brief Number of bits in the shift register that are equal; size of run of 1s, 0s
 
   short d_pos_accum_max;
   short d_neg_accum_max;
 
-  int d_accum;
-  int d_loop_counter;
-  unsigned int d_runner;
-  unsigned int d_runner_mask;   // 4 bytes, 0 .. 4,294,967,295
-  short d_stepsize;
+  int d_accum;                //!< \brief Current value of internal reference
+  int d_loop_counter;         //!< \brief Current value of the loop counter
+  unsigned int d_runner;      //!< \brief Current value of the shift register
+  unsigned int d_runner_mask; //!< \brief Value of the mask to access the last J bits of the shift register
+  short d_stepsize;           //!< \brief Current value of the step sizer
 
  public:
   ~cvsd_decode_bs ();  // public destructor