Files
mpsk_rx_gui/Source/Transmitter.cpp
T
2014-07-19 08:20:53 +00:00

117 lines
2.3 KiB
C++

#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);
}