using LPF taps for interpolator and decimator now and adding documentation to wrapper...
authortrondeau <trondeau@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 24 Apr 2007 21:34:27 +0000 (21:34 +0000)
committertrondeau <trondeau@221aa14e-8319-0410-a670-987f0aec2ac5>
Tue, 24 Apr 2007 21:34:27 +0000 (21:34 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@5097 221aa14e-8319-0410-a670-987f0aec2ac5

gr-cvsd-vocoder/src/python/cvsd.py

index dcb6bb5074a900abdbd53b888f0062d83556d843..e1638f3744196cf5b618177a7df6edcd17a8dde9 100644 (file)
@@ -24,12 +24,26 @@ from gnuradio import gr
 from gnuradio.vocoder import cvsd_vocoder
 
 class cvsd_encode(gr.hier_block):
-    def __init__(self, fg, resample=8):
+    '''
+    This is a wrapper for the CVSD encoder that performs interpolation and filtering
+    necessary to work with the vocoding. It converts an incoming float (+-1) to a short, scales
+    it (to 32000; slightly below the maximum value), interpolates it, and then vocodes it.
+
+    The incoming sampling rate can be anything, though, of course, the higher the sampling rate and the
+    higher the interpolation rate are, the better the sound quality.
+    '''
+    
+    def __init__(self, fg, resample=8, bw=0.5):
+        '''
+        When using the CVSD vocoder, appropriate sampling rates are from 8k to 64k with resampling rates
+        from 1 to 8. A rate of 8k with a resampling rate of 8 provides a good quality signal.
+        '''
         scale_factor = 32000.0
         self.interp = resample
 
         src_scale = gr.multiply_const_ff(scale_factor)
-        interp = gr.interp_fir_filter_fff(self.interp, self.interp*(1,))
+        taps = gr.firdes.low_pass(self.interp, self.interp, bw, 2*bw)
+        interp = gr.interp_fir_filter_fff(self.interp, taps)
         f2s = gr.float_to_short()
         enc = cvsd_vocoder.encode_sb()
 
@@ -38,13 +52,27 @@ class cvsd_encode(gr.hier_block):
 
 
 class cvsd_decode(gr.hier_block):
-    def __init__(self, fg, resample=8):
+    '''
+    This is a wrapper for the CVSD decoder that performs decimation and filtering
+    necessary to work with the vocoding. It converts an incoming CVSD-encoded short to a float, decodes it
+    to a float, decimates it, and scales it (by 32000; slightly below the maximum value to avoid clipping).
+
+    The sampling rate can be anything, though, of course, the higher the sampling rate and the
+    higher the interpolation rate are, the better the sound quality.
+    '''
+
+    def __init__(self, fg, resample=8, bw=0.5):
+        '''
+        When using the CVSD vocoder, appropriate sampling rates are from 8k to 64k with resampling rates
+        from 1 to 8. A rate of 8k with a resampling rate of 8 provides a good quality signal.
+        '''
         scale_factor = 32000.0
         self.decim = resample
 
         dec = cvsd_vocoder.decode_bs()
         s2f = gr.short_to_float()
-        decim = gr.fir_filter_fff(self.decim, (1,))
+        taps = gr.firdes.low_pass(1, 1, bw, 2*bw)
+        decim = gr.fir_filter_fff(self.decim, taps)
         sink_scale = gr.multiply_const_ff(1.0/scale_factor)
 
         fg.connect(dec, s2f, decim, sink_scale)