From 77675f7a5c7eed07885de982e2adeb684eb11582 Mon Sep 17 00:00:00 2001 From: bruceperens Date: Fri, 30 May 2014 03:51:34 +0000 Subject: [PATCH] Still debugging the codec. git-svn-id: https://svn.code.sf.net/p/freetel/code@1614 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-server/source/codec2.cpp | 16 +++++---- freedv-server/source/drivers.h | 2 +- freedv-server/source/interpolate.cpp | 36 +++++++++++++++++++ freedv-server/source/modem_codec2_reverse.cpp | 16 +++++---- 4 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 freedv-server/source/interpolate.cpp diff --git a/freedv-server/source/codec2.cpp b/freedv-server/source/codec2.cpp index 380c1ef4..5457b082 100644 --- a/freedv-server/source/codec2.cpp +++ b/freedv-server/source/codec2.cpp @@ -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 diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index 567af728..12ee40a4 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -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 index 00000000..ff10a157 --- /dev/null +++ b/freedv-server/source/interpolate.cpp @@ -0,0 +1,36 @@ +#if 0 +#include +#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 diff --git a/freedv-server/source/modem_codec2_reverse.cpp b/freedv-server/source/modem_codec2_reverse.cpp index b56dad8d..6cf5684f 100644 --- a/freedv-server/source/modem_codec2_reverse.cpp +++ b/freedv-server/source/modem_codec2_reverse.cpp @@ -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 -- 2.25.1