diff --git a/include/util/udpsink.h b/include/util/udpsink.h new file mode 100644 index 000000000..c2d0ce098 --- /dev/null +++ b/include/util/udpsink.h @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2015 F4EXB // +// written by Edouard Griffiths // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_UTIL_UDPSINK_H_ +#define INCLUDE_UTIL_UDPSINK_H_ + +#include +#include +#include + +template +class UDPSink +{ +public: + UDPSink(QObject *parent, unsigned int udpSize, unsigned int port) : + m_udpSize(udpSize), + m_address(QHostAddress::LocalHost), + m_port(port), + m_sampleBufferIndex(0) + { + m_sampleBuffer = new T[m_udpSize]; + m_socket = new QUdpSocket(parent); + } + + UDPSink (QObject *parent, unsigned int udpSize, QHostAddress& address, unsigned int port) : + m_udpSize(udpSize), + m_address(address), + m_port(port), + m_sampleBufferIndex(0) + { + m_sampleBuffer = new T[m_udpSize]; + m_socket = new QUdpSocket(parent); + } + + ~UDPSink() + { + delete[] m_sampleBuffer; + delete m_socket; + } + + void write(T sample) + { + m_sampleBuffer[m_sampleBufferIndex] = sample; + + if (m_sampleBufferIndex < m_udpSize) + { + m_sampleBufferIndex++; + } + else + { + m_socket->writeDatagram((const char*)&m_sampleBuffer[0], (qint64 ) (m_udpSize * sizeof(T)), m_address, m_port); + m_sampleBufferIndex = 0; + } + } + +private: + unsigned int m_udpSize; + QHostAddress m_address; + unsigned int m_port; + QUdpSocket *m_socket; + T *m_sampleBuffer;; + int m_sampleBufferIndex; +}; + + + +#endif /* INCLUDE_UTIL_UDPSINK_H_ */ diff --git a/plugins/channel/bfm/rdsdemod.cpp b/plugins/channel/bfm/rdsdemod.cpp index d29458327..3cebb6f51 100644 --- a/plugins/channel/bfm/rdsdemod.cpp +++ b/plugins/channel/bfm/rdsdemod.cpp @@ -26,7 +26,8 @@ const Real RDSDemod::m_pllBeta = 50; const int RDSDemod::m_udpSize = 1472; const Real RDSDemod::m_fsc = 1187.5; -RDSDemod::RDSDemod() +RDSDemod::RDSDemod() : + m_udpDebug(this, 1472, 9995) { m_srate = 250000; @@ -35,29 +36,19 @@ RDSDemod::RDSDemod() m_parms.clock_phi = 0; m_parms.prev_clock_phi = 0; m_parms.lo_clock = 0; - m_parms.prevclock = 0; + m_parms.prev_lo_clock = 0; m_parms.prev_bb = 0; - m_parms.d_phi_sc = 0; m_parms.d_cphi = 0; m_parms.acc = 0; - m_parms.subcarr_sample = 0; - m_parms.c = 0; - m_parms.fmfreq = 0; - m_parms.bytesread; m_parms.numsamples = 0; - m_parms.loop_out = 0; - m_parms.prev_loop = 0; m_parms.prev_acc = 0; m_parms.counter = 0; m_parms.reading_frame = 0; - - m_socket = new QUdpSocket(this); - m_sampleBufferIndex = 0; } RDSDemod::~RDSDemod() { - delete m_socket; + //delete m_socket; } void RDSDemod::setSampleRate(int srate) /// FIXME: fix rate for now @@ -66,17 +57,7 @@ void RDSDemod::setSampleRate(int srate) /// FIXME: fix rate for now void RDSDemod::process(Real demod, Real pilot) { - m_sampleBuffer[m_sampleBufferIndex] = m_parms.lo_clock * m_parms.subcarr_bb[0]; // UDP debug - - if (m_sampleBufferIndex < m_udpSize) - { - m_sampleBufferIndex++; - } - else - { - m_socket->writeDatagram((const char*)&m_sampleBuffer[0], (qint64 ) (m_udpSize * sizeof(Real)), QHostAddress::LocalHost, 9995); - m_sampleBufferIndex = 0; - } + m_udpDebug.write(m_parms.lo_clock * m_parms.subcarr_bb[0]); // Subcarrier downmix & phase recovery @@ -84,6 +65,14 @@ void RDSDemod::process(Real demod, Real pilot) // 1187.5 Hz clock + /* + if (m_parms.subcarr_phi > 1e9) // ~ every 37 hours => not really useful + { + qDebug("RDSDemod::process: reset 1187.5 Hz clock"); + m_parms.subcarr_phi = 0; + m_parms.clock_offset = 0; + }*/ + m_parms.subcarr_phi += (2 * M_PI * m_fsc) / (Real) m_srate; m_parms.clock_phi = m_parms.subcarr_phi + m_parms.clock_offset; @@ -110,13 +99,13 @@ void RDSDemod::process(Real demod, Real pilot) /* biphase symbol integrate & dump */ m_parms.acc += m_parms.subcarr_bb[0] * m_parms.lo_clock; - if (sign(m_parms.lo_clock) != sign(m_parms.prevclock)) + if (sign(m_parms.lo_clock) != sign(m_parms.prev_lo_clock)) { biphase(m_parms.acc, m_parms.clock_phi - m_parms.prev_clock_phi); m_parms.acc = 0; } - m_parms.prevclock = m_parms.lo_clock; + m_parms.prev_lo_clock = m_parms.lo_clock; } m_parms.numsamples++; diff --git a/plugins/channel/bfm/rdsdemod.h b/plugins/channel/bfm/rdsdemod.h index 8de3ed3ff..2d97893d8 100644 --- a/plugins/channel/bfm/rdsdemod.h +++ b/plugins/channel/bfm/rdsdemod.h @@ -20,8 +20,7 @@ #define PLUGINS_CHANNEL_BFM_RDSDEMOD_H_ #include -#include -#include +#include "util/udpsink.h" #include "dsp/dsptypes.h" @@ -45,24 +44,17 @@ private: struct { double subcarr_phi; - double subcarr_bb[2]; + Real subcarr_bb[2]; double clock_offset; double clock_phi; double prev_clock_phi; - double lo_clock; - double prevclock; - double prev_bb; - double d_phi_sc; + Real lo_clock; + Real prev_lo_clock; + Real prev_bb; double d_cphi; - double acc; - double subcarr_sample; - int c; - int fmfreq; - int bytesread; + Real acc; int numsamples; - double loop_out; - double prev_loop; - double prev_acc; + Real prev_acc; int counter; int reading_frame; int tot_errs[2]; @@ -76,9 +68,7 @@ private: int m_srate; - QUdpSocket *m_socket; - Real m_sampleBuffer[1<<12]; - int m_sampleBufferIndex; + UDPSink m_udpDebug; static const int m_udpSize; static const Real m_pllBeta;