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