Still debugging the codec.
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 30 May 2014 03:51:34 +0000 (03:51 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 30 May 2014 03:51:34 +0000 (03:51 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1614 01035d8c-6547-0410-b346-abe4f91aad63

freedv-server/source/codec2.cpp
freedv-server/source/drivers.h
freedv-server/source/interpolate.cpp [new file with mode: 0644]
freedv-server/source/modem_codec2_reverse.cpp

index 380c1ef4d0febee363ded819fb12ed1945c593fd..5457b08283b16da178ca3ed192ec50a679a072b4 100644 (file)
@@ -113,8 +113,10 @@ namespace FreeDV {
    std::size_t *       data_length,
    std::size_t         sample_length)
   {
+    // FIX: Interpolate.
+
     std::size_t        bytes_read = 0;
-    std::size_t        samples_read = 0;
+    std::size_t        samples_written = 0;
 
     while ( *data_length >= bytes_per && sample_length >= samples_per ) {
 
@@ -125,11 +127,11 @@ namespace FreeDV {
       *data_length -= bytes_per;
 
       o += samples_per;
-      samples_read += samples_per;
+      samples_written += samples_per;
       sample_length -= samples_per;
     }
     *data_length = bytes_read;
-    return samples_read;
+    return samples_written;
   }
 
   std::size_t
@@ -139,7 +141,9 @@ namespace FreeDV {
    std::size_t         data_length,
    std::size_t *       sample_length)
   {
-    std::size_t        bytes_read = 0;
+    // FIX: Interpolate.
+
+    std::size_t        bytes_written = 0;
     std::size_t        samples_read = 0;
 
     while ( data_length >= bytes_per && *sample_length >= samples_per ) {
@@ -148,7 +152,7 @@ namespace FreeDV {
       codec2_encode(c, o, (std::int16_t *)i);
 
       o += bytes_per;
-      bytes_read += bytes_per;
+      bytes_written += bytes_per;
       data_length -= bytes_per;
 
       i += samples_per;
@@ -156,7 +160,7 @@ namespace FreeDV {
       *sample_length -= samples_per;
     }
     *sample_length = samples_read;
-    return bytes_read;
+    return bytes_written;
   }
 
   std::size_t
index 567af728e1041116e25f108098f50c909a50867b..12ee40a4ccbdfaea16fc539c632900af18af411b 100644 (file)
@@ -53,7 +53,7 @@ extern const char *   program_name;
 /// the only reliable sample rate they all have in common. SampleRate
 /// may be lower than that and thus there may be resampling in the
 /// drivers.
-const unsigned int     SampleRate = 48000;
+const unsigned int     SampleRate = 8000;
 
 /// The number of audio samples per millisecond, at SampleRate.
 ///
diff --git a/freedv-server/source/interpolate.cpp b/freedv-server/source/interpolate.cpp
new file mode 100644 (file)
index 0000000..ff10a15
--- /dev/null
@@ -0,0 +1,36 @@
+#if 0
+#include <soxr.h>
+#include "drivers.h"
+
+namespace FreeDV {
+  void
+  Interpolate16(
+   const std::int16_t *        in,
+   std::int16_t *      out, 
+   std::size_t         in_rate,
+   std::size_t         out_rate, 
+   std::size_t         in_length,
+   std::size_t         out_length)
+  {
+    std::size_t        out_done = 0;
+
+    /// The "Gibbs effect" may be seen because I don't save data from the
+    /// previous block. Fix this by making the resampler a class,
+    /// instantiate it to save state, and use the iterative rather than the
+    /// one-shot version.
+    const soxr_error_t error = soxr_oneshot(
+     in_rate,
+     out_rate,
+     1, // Number of channels.
+     in,
+     in_length,
+     NULL,
+     out,
+     out_length,
+     &out_done,
+     NULL,
+     NULL,
+     NULL);  
+  }
+};
+#endif
index b56dad8d87615a96120756066eb2da21ebecc999..6cf5684ff189f644ae651e8746acec3b56ec6a93 100644 (file)
@@ -120,7 +120,9 @@ namespace FreeDV {
    std::size_t         data_length,
    std::size_t *       sample_length)
   {
-    std::size_t        bytes_read = 0;
+    // FIX: Interpolate.
+
+    std::size_t        bytes_written = 0;
     std::size_t        samples_read = 0;
 
     while ( data_length >= bytes_per && *sample_length >= samples_per ) {
@@ -129,7 +131,7 @@ namespace FreeDV {
       codec2_encode(c, o, (std::int16_t *)i);
 
       o += bytes_per;
-      bytes_read += bytes_per;
+      bytes_written += bytes_per;
       data_length -= bytes_per;
 
       i += samples_per;
@@ -137,7 +139,7 @@ namespace FreeDV {
       *sample_length -= samples_per;
     }
     *sample_length = samples_read;
-    return bytes_read;
+    return bytes_written;
   }
 
   std::size_t
@@ -147,8 +149,10 @@ namespace FreeDV {
    std::size_t *       data_length,
    std::size_t         sample_length)
   {
+    // FIX: Interpolate.
+
     std::size_t        bytes_read = 0;
-    std::size_t        samples_read = 0;
+    std::size_t        samples_written = 0;
 
     while ( *data_length >= bytes_per && sample_length >= samples_per ) {
       codec2_decode(c, o, i);
@@ -158,11 +162,11 @@ namespace FreeDV {
       *data_length -= bytes_per;
 
       o += samples_per;
-      samples_read += samples_per;
+      samples_written += samples_per;
       sample_length -= samples_per;
     }
     *data_length = bytes_read;
-    return samples_read;
+    return samples_written;
   }
 
   std::size_t