#include "Transmitter.h" Transmitter::Transmitter(void) : Thread("Transmitter") , m_symbolizer(this) , m_formatter(&m_symbolizer) , m_symbolMapper() , m_bufferSize(0) , m_bufferRF(0) , m_bufferSymRcf(0) , m_bufferSym(0) , m_samplerate(192000) , m_symbolrate(48000) , m_numBitPerSymbol(2) , m_carrierFreq(48000) , m_txBuf(0, 2) , m_symCount(0) , m_CoeffRCF(0) { SymMapInit(&m_symbolMapper, m_numBitPerSymbol, MAP_MODE_QAM); FirCpxMultirateUpInit(&m_firUpRcf, NULL, 0, 1); NCO_Init(&m_duc, m_carrierFreq/m_samplerate, 0); paramChanged(); bufferResize(2048); } Transmitter::~Transmitter(void) { stopThread(1000); if (m_bufferRF) delete m_bufferRF; if (m_bufferSymRcf) delete m_bufferSymRcf; if (m_bufferSym) delete m_bufferSym; if (m_CoeffRCF) delete m_CoeffRCF; m_bufferRF = nullptr; m_bufferSymRcf = nullptr; m_bufferSym = nullptr; m_CoeffRCF = nullptr; FirCpxMultirateFree(&m_firUpRcf); SymMapFree(&m_symbolMapper); } void Transmitter::paramChanged() { uint32_t M_up; uint32_t n_mf; const ScopedLock sl (m_lock); m_symbolizer.setNumBitsPerSymbol(m_numBitPerSymbol); SymMapReinit(&m_symbolMapper, m_numBitPerSymbol, MAP_MODE_QAM); M_up = (uint32_t)(m_samplerate/m_symbolrate + 0.5); n_mf = (uint32_t)(TRANSMITTER_RCF_OVERSAMPLING*M_up) + 1; if (m_CoeffRCF) delete m_CoeffRCF; m_CoeffRCF = new radio_float_t[n_mf]; m_kRcf = CalcFirSRRC(m_CoeffRCF, (radio_float_t)m_samplerate, (radio_float_t)2.0/m_symbolrate, TRANSMITTER_RCF_ROLLOFF, n_mf); FirCpxMultirateUpReinit(&m_firUpRcf, m_CoeffRCF, n_mf, M_up); NCO_Reinit(&m_duc, m_carrierFreq/m_samplerate, 0); } void Transmitter::bufferResize(uint32_t size) { stopThread(10000); m_txBuf.resize(size, 8); if (size != m_bufferSize) { if (m_bufferRF) { delete m_bufferRF; m_bufferRF = nullptr; } if (m_bufferSymRcf) { delete m_bufferSymRcf; m_bufferSymRcf = nullptr; } if (m_bufferSym) { delete m_bufferSym; m_bufferSym = nullptr; } } m_bufferSize = size; if (!size) return; m_bufferRF = new float[m_bufferSize]; m_bufferSymRcf = new cpx_t[m_bufferSize]; m_bufferSym = new cpx_t[m_bufferSize]; m_symCount = 0; startThread(0); }