diff --git a/plugins/channelmimo/doa2/doa2corr.cpp b/plugins/channelmimo/doa2/doa2corr.cpp index 1892d00c5..8b2411f1f 100644 --- a/plugins/channelmimo/doa2/doa2corr.cpp +++ b/plugins/channelmimo/doa2/doa2corr.cpp @@ -119,7 +119,7 @@ Sample invfft2star(const std::complex& a) { //!< Complex float to Sample } DOA2Correlator::DOA2Correlator(int fftSize) : - m_corrType(DOA2Settings::CorrelationAdd), + m_corrType(DOA2Settings::CorrelationFFT), m_fftSize(fftSize) { setPhase(0); @@ -177,34 +177,16 @@ bool DOA2Correlator::performCorr( case DOA2Settings::Correlation1: results = performOpCorr(data0, size0, data1, size1, sSecond); break; - case DOA2Settings::CorrelationAdd: - results = performOpCorr(data0, size0, data1, size1, sAdd); - break; - case DOA2Settings::CorrelationMultiply: - results = performOpCorr(data0, size0, data1, size1, sMulConj); - break; - case DOA2Settings::CorrelationIFFT: - results = performIFFTCorr(data0, size0, data1, size1); - break; - case DOA2Settings::CorrelationIFFTStar: - results = performIFFTCorr(data0, size0, data1, size1, true); - break; case DOA2Settings::CorrelationFFT: results = performFFTProd(data0, size0, data1, size1); break; - case DOA2Settings::CorrelationIFFT2: - results = performIFFT2Corr(data0, size0, data1, size1); - break; default: break; } } else if ((m_phase == -180) || (m_phase == 180)) { - if ((m_corrType == DOA2Settings::CorrelationIFFT) - || (m_corrType == DOA2Settings::CorrelationIFFT2) - || (m_corrType == DOA2Settings::CorrelationIFFTStar) - || (m_corrType == DOA2Settings::CorrelationFFT)) + if (m_corrType == DOA2Settings::CorrelationFFT) { if (size1 > m_data1p.size()) { m_data1p.resize(size1); @@ -228,24 +210,9 @@ bool DOA2Correlator::performCorr( case DOA2Settings::Correlation1: results = performOpCorr(data0, size0, data1, size1, sSecondInv); break; - case DOA2Settings::CorrelationAdd: - results = performOpCorr(data0, size0, data1, size1, sAddInv); - break; - case DOA2Settings::CorrelationMultiply: - results = performOpCorr(data0, size0, data1, size1, sMulConjInv); - break; - case DOA2Settings::CorrelationIFFT: - results = performIFFTCorr(data0, size0, m_data1p, size1); - break; - case DOA2Settings::CorrelationIFFTStar: - results = performIFFTCorr(data0, size0, m_data1p, size1, true); - break; case DOA2Settings::CorrelationFFT: results = performFFTProd(data0, size0, m_data1p, size1); break; - case DOA2Settings::CorrelationIFFT2: - results = performIFFT2Corr(data0, size0, m_data1p, size1); - break; default: break; } @@ -280,24 +247,9 @@ bool DOA2Correlator::performCorr( case DOA2Settings::Correlation1: results = performOpCorr(data0, size0, m_data1p, size1, sSecond); break; - case DOA2Settings::CorrelationAdd: - results = performOpCorr(data0, size0, m_data1p, size1, sAdd); - break; - case DOA2Settings::CorrelationMultiply: - results = performOpCorr(data0, size0, m_data1p, size1, sMulConj); - break; - case DOA2Settings::CorrelationIFFT: - results = performIFFTCorr(data0, size0, m_data1p, size1); - break; - case DOA2Settings::CorrelationIFFTStar: - results = performIFFTCorr(data0, size0, m_data1p, size1, true); - break; case DOA2Settings::CorrelationFFT: results = performFFTProd(data0, size0, m_data1p, size1); break; - case DOA2Settings::CorrelationIFFT2: - results = performIFFT2Corr(data0, size0, m_data1p, size1); - break; default: break; } @@ -331,239 +283,6 @@ bool DOA2Correlator::performOpCorr( return true; } -bool DOA2Correlator::performIFFTCorr( - const SampleVector& data0, - unsigned int size0, - const SampleVector& data1, - unsigned int size1, - bool star -) -{ - unsigned int size = std::min(size0, size1); - int nfft = 0; - SampleVector::const_iterator begin0 = data0.begin(); - SampleVector::const_iterator begin1 = data1.begin(); - adjustSCorrSize(size); - adjustTCorrSize(size); - - while (size >= m_fftSize) - { - // FFT[0] - std::transform( - begin0, - begin0 + m_fftSize, - m_fft[0]->in(), - s2c - ); - m_window.apply(m_fft[0]->in()); - std::fill(m_fft[0]->in() + m_fftSize, m_fft[0]->in() + 2*m_fftSize, std::complex{0, 0}); - m_fft[0]->transform(); - - // FFT[1] - std::transform( - begin1, - begin1 + m_fftSize, - m_fft[1]->in(), - s2c - ); - m_window.apply(m_fft[1]->in()); - std::fill(m_fft[1]->in() + m_fftSize, m_fft[1]->in() + 2*m_fftSize, std::complex{0, 0}); - m_fft[1]->transform(); - - // conjugate FFT[1] - std::transform( - m_fft[1]->out(), - m_fft[1]->out() + 2*m_fftSize, - m_dataj, - [](const std::complex& c) -> std::complex { - return std::conj(c); - } - ); - - // product of FFT[1]* with FFT[0] and store in inverse FFT input - std::transform( - m_fft[0]->out(), - m_fft[0]->out() + 2*m_fftSize, - m_dataj, - m_invFFT->in(), - [](std::complex& a, const std::complex& b) -> std::complex { - return (a*b); - } - ); - - // copy product to correlation spectrum - convert and scale to FFT size and Hanning window - std::transform( - m_invFFT->in(), - m_invFFT->in() + m_fftSize, - m_scorr.begin() + nfft*m_fftSize, - [this](const std::complex& a) -> Sample { - Sample s; - s.setReal(a.real()*(SDR_RX_SCALEF/m_fftSize)); - s.setImag(a.imag()*(SDR_RX_SCALEF/m_fftSize)); - return s; - } - ); - - // do the inverse FFT to get time correlation - m_invFFT->transform(); - - if (star) - { - // sum first half with the reversed second half as one is the conjugate of the other this should yield constant phase - *m_tcorr.begin() = invfft2star(m_invFFT->out()[0]); // t = 0 - std::reverse(m_invFFT->out() + m_fftSize, m_invFFT->out() + 2*m_fftSize); - std::transform( - m_invFFT->out() + 1, - m_invFFT->out() + m_fftSize, - m_invFFT->out() + m_fftSize, - m_tcorr.begin() + nfft*m_fftSize, - [](const std::complex& a, const std::complex& b) -> Sample { - Sample s; - std::complex sum = a + b; - s.setReal(sum.real()/12.0f); - s.setImag(sum.imag()/12.0f); - return s; - } - ); - } - else - { - std::transform( - m_invFFT->out(), - m_invFFT->out() + m_fftSize, - m_tcorr.begin() + nfft*m_fftSize, - [](const std::complex& a) -> Sample { - Sample s; - s.setReal(a.real()/6.0f); - s.setImag(a.imag()/6.0f); - return s; - } - ); - } - - size -= m_fftSize; - begin0 += m_fftSize; - begin1 += m_fftSize; - nfft++; - } - - // update the samples counters - m_processed = nfft*m_fftSize; - m_remaining[0] = size0 - nfft*m_fftSize; - m_remaining[1] = size1 - nfft*m_fftSize; - - return nfft > 0; -} - -bool DOA2Correlator::performIFFT2Corr( - const SampleVector& data0, - unsigned int size0, - const SampleVector& data1, - unsigned int size1 -) -{ - unsigned int size = std::min(size0, size1); - int nfft = 0; - SampleVector::const_iterator begin0 = data0.begin(); - SampleVector::const_iterator begin1 = data1.begin(); - adjustSCorrSize(size); - adjustTCorrSize(size); - - while (size >= m_fftSize) - { - // FFT[0] - std::transform( - begin0, - begin0 + m_fftSize, - m_fft2[0]->in(), - s2c - ); - m_window.apply(m_fft2[0]->in()); - m_fft2[0]->transform(); - - // FFT[1] - std::transform( - begin1, - begin1 + m_fftSize, - m_fft2[1]->in(), - s2c - ); - m_window.apply(m_fft2[1]->in()); - m_fft2[1]->transform(); - - // conjugate FFT[1] - std::transform( - m_fft2[1]->out(), - m_fft2[1]->out() + m_fftSize, - m_dataj, - [](const std::complex& c) -> std::complex { - return std::conj(c); - } - ); - - // product of FFT[1]* with FFT[0] and store in inverse FFT input - std::transform( - m_fft2[0]->out(), - m_fft2[0]->out() + m_fftSize, - m_dataj, - m_invFFT2->in(), - [](std::complex& a, const std::complex& b) -> std::complex { - return (a*b); - } - ); - - // copy product to correlation spectrum - convert and scale to FFT size - std::transform( - m_invFFT2->in(), - m_invFFT2->in() + m_fftSize, - m_scorr.begin() + nfft*m_fftSize, - [this](const std::complex& a) -> Sample { - Sample s; - s.setReal(a.real()*(SDR_RX_SCALEF/m_fftSize)); - s.setImag(a.imag()*(SDR_RX_SCALEF/m_fftSize)); - return s; - } - ); - - // do the inverse FFT to get time correlation - m_invFFT2->transform(); - std::transform( - m_invFFT2->out() + m_fftSize/2, - m_invFFT2->out() + m_fftSize, - m_tcorr.begin() + nfft*m_fftSize, - [](const std::complex& a) -> Sample { - Sample s; - s.setReal(a.real()/3.0f); - s.setImag(a.imag()/3.0f); - return s; - } - ); - std::transform( - m_invFFT2->out(), - m_invFFT2->out() + m_fftSize/2, - m_tcorr.begin() + nfft*m_fftSize + m_fftSize/2, - [](const std::complex& a) -> Sample { - Sample s; - s.setReal(a.real()/3.0f); - s.setImag(a.imag()/3.0f); - return s; - } - ); - - size -= m_fftSize; - begin0 += m_fftSize; - begin1 += m_fftSize; - nfft++; - } - - // update the samples counters - m_processed = nfft*m_fftSize; - m_remaining[0] = size0 - nfft*m_fftSize; - m_remaining[1] = size1 - nfft*m_fftSize; - - return nfft > 0; -} - bool DOA2Correlator::performFFTProd( const SampleVector& data0, unsigned int size0, diff --git a/plugins/channelmimo/doa2/doa2corr.h b/plugins/channelmimo/doa2/doa2corr.h index d08f0aacd..e89cab324 100644 --- a/plugins/channelmimo/doa2/doa2corr.h +++ b/plugins/channelmimo/doa2/doa2corr.h @@ -62,19 +62,6 @@ private: unsigned int size1, Sample sampleOp(const Sample& a, const Sample& b) ); - bool performIFFTCorr( //!< Returns true if results were produced - const SampleVector& data0, - unsigned int size0, - const SampleVector& data1, - unsigned int size1, - bool star = false - ); - bool performIFFT2Corr( //!< Returns true if results were produced - const SampleVector& data0, - unsigned int size0, - const SampleVector& data1, - unsigned int size1 - ); bool performFFTProd( //!< Returns true if results were produced const SampleVector& data0, unsigned int size0, diff --git a/plugins/channelmimo/doa2/doa2gui.ui b/plugins/channelmimo/doa2/doa2gui.ui index ac415b4bb..519c0e879 100644 --- a/plugins/channelmimo/doa2/doa2gui.ui +++ b/plugins/channelmimo/doa2/doa2gui.ui @@ -179,7 +179,7 @@ - Correlation type + Scope correlation type @@ -191,36 +191,11 @@ B - - - A+B - - - - - A.B* - - - - - IFFT - - - - - IFFT* - - FFT - - - IFFT2 - - @@ -377,7 +352,7 @@ - Time domain + Scope @@ -465,7 +440,14 @@ - + + + + Liberation Sans + 9 + + + diff --git a/plugins/channelmimo/doa2/doa2settings.cpp b/plugins/channelmimo/doa2/doa2settings.cpp index 22a786dd6..eb4e63b5a 100644 --- a/plugins/channelmimo/doa2/doa2settings.cpp +++ b/plugins/channelmimo/doa2/doa2settings.cpp @@ -33,7 +33,7 @@ DOA2Settings::DOA2Settings() : void DOA2Settings::resetToDefaults() { - m_correlationType = CorrelationAdd; + m_correlationType = CorrelationFFT; m_rgbColor = QColor(250, 120, 120).rgb(); m_title = "DOA 2 sources"; m_log2Decim = 0; @@ -98,7 +98,7 @@ bool DOA2Settings::deserialize(const QByteArray& data) d.readS32(2, &tmp, 0); m_correlationType = (CorrelationType) tmp; d.readU32(3, &m_rgbColor); - d.readString(4, &m_title, "Interpolator"); + d.readString(4, &m_title, "DOA 2 sources"); d.readU32(5, &utmp, 0); m_log2Decim = utmp > 6 ? 6 : utmp; d.readU32(6, &m_filterChainHash, 0); diff --git a/plugins/channelmimo/doa2/doa2settings.h b/plugins/channelmimo/doa2/doa2settings.h index c37db45b3..3aea5c945 100644 --- a/plugins/channelmimo/doa2/doa2settings.h +++ b/plugins/channelmimo/doa2/doa2settings.h @@ -29,12 +29,7 @@ struct DOA2Settings { Correlation0, Correlation1, - CorrelationAdd, - CorrelationMultiply, - CorrelationIFFT, - CorrelationIFFTStar, CorrelationFFT, - CorrelationIFFT2 }; CorrelationType m_correlationType;