From ba71089affdb9e14fad141bbf6cd27ad6e939692 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 9 May 2016 01:26:39 +0200 Subject: [PATCH] DSD demod DV serial support revised audio processing --- sdrbase/dsp/dspengine.cpp | 1 + sdrbase/dsp/dvserialworker.cpp | 57 ++++++++++++++++++++++++++++++++-- sdrbase/dsp/dvserialworker.h | 15 ++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp index abdde474a..70994cb58 100644 --- a/sdrbase/dsp/dspengine.cpp +++ b/sdrbase/dsp/dspengine.cpp @@ -23,6 +23,7 @@ DSPEngine::DSPEngine() : m_audioSampleRate(48000) // Use default output device at 48 kHz { m_deviceEngine = new DSPDeviceEngine(); + m_dvSerialSupport = false; } DSPEngine::~DSPEngine() diff --git a/sdrbase/dsp/dvserialworker.cpp b/sdrbase/dsp/dvserialworker.cpp index db70e53b9..ec99a8d04 100644 --- a/sdrbase/dsp/dvserialworker.cpp +++ b/sdrbase/dsp/dvserialworker.cpp @@ -27,8 +27,11 @@ DVSerialWorker::DVSerialWorker() : m_running(false), m_currentGainIn(0), m_currentGainOut(0), - m_upsamplerLastValue(0) + m_upsamplerLastValue(0), + m_phase(0) { + m_audioBuffer.resize(1<<14); + m_audioBufferFill = 0; } DVSerialWorker::~DVSerialWorker() @@ -77,8 +80,9 @@ void DVSerialWorker::handleInputMessages() if (m_dvController.decode(m_dvAudioSamples, decodeMsg->getMbeFrame(), decodeMsg->getMbeRate(), dBVolume)) { - upsample6(m_dvAudioSamples, m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE); - decodeMsg->getAudioFifo()->write((const quint8 *) m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE * 6, 10); + upsample6(m_dvAudioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE, decodeMsg->getAudioFifo()); +// upsample6(m_dvAudioSamples, m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE); +// decodeMsg->getAudioFifo()->write((const quint8 *) m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE * 6, 10); } } @@ -86,6 +90,38 @@ void DVSerialWorker::handleInputMessages() } } +void DVSerialWorker::upsample6(short *in, int nbSamplesIn, AudioFifo *audioFifo) +{ + for (int i = 0; i < nbSamplesIn; i++) + { + int cur = (int) in[i]; + int prev = (int) m_upsamplerLastValue; + qint16 upsample; + + for (int j = 1; j < 7; j++) + { + upsample = (qint16) ((cur*i + prev*(6-i)) / 6); + m_audioBuffer[m_audioBufferFill].l = upsample; + m_audioBuffer[m_audioBufferFill].r = upsample; + ++m_audioBufferFill; + + if (m_audioBufferFill >= m_audioBuffer.size()) + { + uint res = audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 10); + + if (res != m_audioBufferFill) + { + qDebug("DVSerialWorker::upsample6: %u/%u audio samples written", res, m_audioBufferFill); + } + + m_audioBufferFill = 0; + } + } + + m_upsamplerLastValue = in[i]; + } +} + void DVSerialWorker::upsample6(short *in, short *out, int nbSamplesIn) { for (int i = 0; i < nbSamplesIn; i++) @@ -94,6 +130,21 @@ void DVSerialWorker::upsample6(short *in, short *out, int nbSamplesIn) int prev = (int) m_upsamplerLastValue; short up; +// for (int j = 0; j < 6; j++) +// { +// up = 32768.0f * cos(m_phase); +// *out = up; +// out ++; +// *out = up; +// out ++; +// m_phase += M_PI / 6.0; +// } +// +// if ((i % 2) == 1) +// { +// m_phase = 0.0f; +// } + up = (cur*1 + prev*5) / 6; *out = up; out++; diff --git a/sdrbase/dsp/dvserialworker.h b/sdrbase/dsp/dvserialworker.h index c6be12a3e..e3f0419f8 100644 --- a/sdrbase/dsp/dvserialworker.h +++ b/sdrbase/dsp/dvserialworker.h @@ -21,6 +21,8 @@ #include #include +#include + #include "dvcontroller.h" #include "util/message.h" #include "util/syncmessenger.h" @@ -97,15 +99,26 @@ public slots: void handleInputMessages(); private: + struct AudioSample { + qint16 l; + qint16 r; + }; + + typedef std::vector AudioVector; + void upsample6(short *in, short *out, int nbSamplesIn); + void upsample6(short *in, int nbSamplesIn, AudioFifo *audioFifo); SerialDV::DVController m_dvController; bool m_running; int m_currentGainIn; int m_currentGainOut; short m_dvAudioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE]; - short m_audioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE * 6 * 2]; // upsample to 48k and duplicate channel + //short m_audioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE * 6 * 2]; // upsample to 48k and duplicate channel + AudioVector m_audioBuffer; + uint m_audioBufferFill; short m_upsamplerLastValue; + float m_phase; }; #endif /* SDRBASE_DSP_DVSERIALWORKER_H_ */