diff --git a/plugins/channelmimo/interferometer/interferometer.cpp b/plugins/channelmimo/interferometer/interferometer.cpp index 6b82e8040..90d26e605 100644 --- a/plugins/channelmimo/interferometer/interferometer.cpp +++ b/plugins/channelmimo/interferometer/interferometer.cpp @@ -97,14 +97,14 @@ void Interferometer::stop() void Interferometer::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) { - if (sinkIndex == 0) { - m_count0 = end - begin; - } else if (sinkIndex == 1) { - m_count1 = end - begin; - if (m_count1 != m_count0) { - qDebug("Interferometer::feed: c0: %d 1: %d", m_count0, m_count1); - } - } + // if (sinkIndex == 0) { + // m_count0 = end - begin; + // } else if (sinkIndex == 1) { + // m_count1 = end - begin; + // if (m_count1 != m_count0) { + // qDebug("Interferometer::feed: c0: %d 1: %d", m_count0, m_count1); + // } + // } m_sink->feed(begin, end, sinkIndex); } diff --git a/plugins/channelmimo/interferometer/interferometercorr.cpp b/plugins/channelmimo/interferometer/interferometercorr.cpp index 76dcd26e0..73364041a 100644 --- a/plugins/channelmimo/interferometer/interferometercorr.cpp +++ b/plugins/channelmimo/interferometer/interferometercorr.cpp @@ -26,8 +26,24 @@ Sample sAdd(const Sample& a, const Sample& b) { //!< Sample addition Sample sMulConj(const Sample& a, const Sample& b) { //!< Sample multiply with conjugate Sample s; - s.setReal((a.real()*b.real() + a.imag()*b.imag()) / (1<<(SDR_RX_SAMP_SZ - 16 + 1))); - s.setImag((a.imag()*b.real() - a.real()*b.imag()) / (1<<(SDR_RX_SAMP_SZ - 16 + 1))); + // Integer processing + int64_t ax = a.real(); + int64_t ay = a.imag(); + int64_t bx = b.real(); + int64_t by = b.imag(); + int64_t x = ax*bx + ay*by; + int64_t y = ay*bx - ax*by; + s.setReal(x>>SDR_RX_SAMP_SZ); + s.setImag(y>>SDR_RX_SAMP_SZ); + // Floating point processing (in practice there is no significant performance difference) + // float ax = a.real() / SDR_RX_SCALEF; + // float ay = a.imag() / SDR_RX_SCALEF; + // float bx = b.real() / SDR_RX_SCALEF; + // float by = b.imag() / SDR_RX_SCALEF; + // float x = ax*bx + ay*by; + // float y = ay*bx - ax*by; + // s.setReal(x*SDR_RX_SCALEF); + // s.setImag(y*SDR_RX_SCALEF); return s; } diff --git a/plugins/channelmimo/interferometer/interferometergui.ui b/plugins/channelmimo/interferometer/interferometergui.ui index 70bb4c4b6..2a3d4c9e5 100644 --- a/plugins/channelmimo/interferometer/interferometergui.ui +++ b/plugins/channelmimo/interferometer/interferometergui.ui @@ -176,7 +176,7 @@ - Mul + Mul* diff --git a/plugins/channelmimo/interferometer/interferometersink.cpp b/plugins/channelmimo/interferometer/interferometersink.cpp index c804394a2..da32318dd 100644 --- a/plugins/channelmimo/interferometer/interferometersink.cpp +++ b/plugins/channelmimo/interferometer/interferometersink.cpp @@ -36,14 +36,7 @@ InterferometerSink::InterferometerSink(int fftSize) : { m_sinkFifos[i].setSize(96000 * 4); m_sinks[i].setStreamIndex(i); - //m_channelizers[i] = new DownChannelizer(&m_sinks[i]); - // QObject::connect( - // &m_sinkBuffers[i], - // &SampleSinkVector::dataReady, - // this, - // [=](){ this->handleSinkBuffer(i); }, - // Qt::QueuedConnection - // ); + m_channelizers[i] = new DownChannelizer(&m_sinks[i]); QObject::connect( &m_sinkFifos[i], &SampleSinkFifo::dataReady, @@ -60,7 +53,7 @@ InterferometerSink::~InterferometerSink() { for (int i = 0; i < 2; i++) { - //delete m_channelizers[i]; + delete m_channelizers[i]; } } @@ -71,22 +64,8 @@ void InterferometerSink::feed(const SampleVector::const_iterator& begin, const S } m_sinkFifos[streamIndex].write(begin, end); - //m_sinkBuffers[streamIndex].write(begin, end); } -// void InterferometerSink::handleSinkBuffer(unsigned int sinkIndex) -// { -// SampleVector::iterator vbegin; -// SampleVector::iterator vend; -// m_sinkBuffers[sinkIndex].read(vbegin, vend); -// m_channelizers[sinkIndex]->feed(vbegin, vend, false); -// //qDebug("InterferometerSink::handleSinkBuffer: stream: %u samples: %ld", sinkIndex, vend - vbegin); - -// if (sinkIndex == 1) { -// run(); -// } -// } - void InterferometerSink::handleSinkFifo(unsigned int sinkIndex) { int samplesDone = 0; @@ -127,17 +106,16 @@ void InterferometerSink::handleSinkFifo(unsigned int sinkIndex) void InterferometerSink::processFifo(const SampleVector::iterator& vbegin, const SampleVector::iterator& vend, unsigned int sinkIndex) { - if (sinkIndex == 0) { - m_count0 = vend - vbegin; - } else if (sinkIndex == 1) { - m_count1 = vend - vbegin; - if (m_count1 != m_count0) { - qDebug("InterferometerSink::processFifo: c0: %d 1: %d", m_count0, m_count1); - } - } + // if (sinkIndex == 0) { + // m_count0 = vend - vbegin; + // } else if (sinkIndex == 1) { + // m_count1 = vend - vbegin; + // if (m_count1 != m_count0) { + // qDebug("InterferometerSink::processFifo: c0: %d 1: %d", m_count0, m_count1); + // } + // } - //m_channelizers[sinkIndex]->feed(vbegin, vend, false); - m_sinks[sinkIndex].feed(vbegin, vend, false); + m_channelizers[sinkIndex]->feed(vbegin, vend, false); if (sinkIndex == 1) { run(); @@ -146,9 +124,9 @@ void InterferometerSink::processFifo(const SampleVector::iterator& vbegin, const void InterferometerSink::run() { - if (m_sinks[0].getSize() != m_sinks[1].getSize()) { - qDebug("InterferometerSink::run: size0: %d, size1: %d", m_sinks[0].getSize(), m_sinks[1].getSize()); - } + // if (m_sinks[0].getSize() != m_sinks[1].getSize()) { + // qDebug("InterferometerSink::run: size0: %d, size1: %d", m_sinks[0].getSize(), m_sinks[1].getSize()); + // } if (m_correlator.performCorr(m_sinks[0].getData(), m_sinks[0].getSize(), m_sinks[1].getData(), m_sinks[1].getSize())) { @@ -166,16 +144,16 @@ void InterferometerSink::run() } } - // for (int i = 0; i < 2; i++) - // { - // std::copy( - // m_sinks[i].getData().begin() + m_correlator.m_processed, - // m_sinks[i].getData().begin() + m_correlator.m_processed + m_correlator.m_remaining[i], - // m_sinks[i].getData().begin() - // ); + for (int i = 0; i < 2; i++) + { + std::copy( + m_sinks[i].getData().begin() + m_correlator.m_processed, + m_sinks[i].getData().begin() + m_correlator.m_processed + m_correlator.m_remaining[i], + m_sinks[i].getData().begin() + ); - // m_sinks[i].setDataStart(m_correlator.m_remaining[i]); - // } + m_sinks[i].setDataStart(m_correlator.m_remaining[i]); + } } void InterferometerSink::handleInputMessages() @@ -206,9 +184,9 @@ bool InterferometerSink::handleMessage(const Message& cmd) for (int i = 0; i < 2; i++) { - // m_channelizers[i]->set(m_channelizers[i]->getInputMessageQueue(), - // log2Decim, - // filterChainHash); + m_channelizers[i]->set(m_channelizers[i]->getInputMessageQueue(), + log2Decim, + filterChainHash); } return true; @@ -227,8 +205,8 @@ bool InterferometerSink::handleMessage(const Message& cmd) if (streamIndex < 2) { - // DSPSignalNotification *notif = new DSPSignalNotification(inputSampleRate, centerFrequency); - // m_channelizers[streamIndex]->getInputMessageQueue()->push(notif); + DSPSignalNotification *notif = new DSPSignalNotification(inputSampleRate, centerFrequency); + m_channelizers[streamIndex]->getInputMessageQueue()->push(notif); } return true; diff --git a/plugins/channelmimo/interferometer/interferometersink.h b/plugins/channelmimo/interferometer/interferometersink.h index 6c3a05b97..ad643ad77 100644 --- a/plugins/channelmimo/interferometer/interferometersink.h +++ b/plugins/channelmimo/interferometer/interferometersink.h @@ -113,7 +113,6 @@ private: bool handleMessage(const Message& cmd); InterferometerCorrelator m_correlator; - //SampleSinkVector m_sinkBuffers[2]; SampleSinkFifo m_sinkFifos[2]; InterferometerStreamSink m_sinks[2]; DownChannelizer *m_channelizers[2]; @@ -124,7 +123,6 @@ private: int m_count0, m_count1; private slots: - //void handleSinkBuffer(unsigned int sinkIndex); //!< Handle data when samples have to be processed void handleInputMessages(); void handleSinkFifo(unsigned int sinkIndex); //!< Handle data when samples have to be processed };