From d925781d9a837ec3935a8b988094039ae9a0ceb0 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 8 Oct 2019 08:38:12 +0200 Subject: [PATCH] Interferometer: implemented FFT star time correlation --- .../interferometer/interferometercorr.cpp | 46 ++++++++++++++++--- .../interferometer/interferometercorr.h | 3 +- .../interferometer/interferometergui.ui | 5 ++ .../interferometer/interferometersettings.h | 3 +- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/plugins/channelmimo/interferometer/interferometercorr.cpp b/plugins/channelmimo/interferometer/interferometercorr.cpp index b96f15a33..b68b00453 100644 --- a/plugins/channelmimo/interferometer/interferometercorr.cpp +++ b/plugins/channelmimo/interferometer/interferometercorr.cpp @@ -92,6 +92,13 @@ Sample invfft2s2(const std::complex& a) { //!< Complex float to Sample fo return s; } +Sample invfft2star(const std::complex& a) { //!< Complex float to Sample for 1 side time correlation + Sample s; + s.setReal(a.real()/2.82842712475f); // 2*sqrt(2) + s.setImag(a.imag()/2.82842712475f); + return s; +} + InterferometerCorrelator::InterferometerCorrelator(int fftSize) : m_corrType(InterferometerSettings::CorrelationAdd), m_fftSize(fftSize) @@ -165,6 +172,9 @@ bool InterferometerCorrelator::performCorr( case InterferometerSettings::CorrelationFFT2: results = performFFT2Corr(data0, size0, data1, size1); break; + case InterferometerSettings::CorrelationFFTStar: + results = performFFTCorr(data0, size0, data1, size1, true); + break; default: break; } @@ -191,6 +201,9 @@ bool InterferometerCorrelator::performCorr( case InterferometerSettings::CorrelationFFT2: results = performFFT2Corr(data0, size0, m_data1p, size1); break; + case InterferometerSettings::CorrelationFFTStar: + results = performFFTCorr(data0, size0, m_data1p, size1, true); + break; default: break; } @@ -237,6 +250,9 @@ bool InterferometerCorrelator::performCorr( case InterferometerSettings::CorrelationFFT2: results = performFFT2Corr(data0, size0, m_data1p, size1); break; + case InterferometerSettings::CorrelationFFTStar: + results = performFFTCorr(data0, size0, m_data1p, size1, true); + break; default: break; } @@ -274,7 +290,8 @@ bool InterferometerCorrelator::performFFTCorr( const SampleVector& data0, int size0, const SampleVector& data1, - int size1 + int size1, + bool star ) { unsigned int size = std::min(size0, size1); @@ -348,12 +365,27 @@ bool InterferometerCorrelator::performFFTCorr( // do the inverse FFT to get time correlation m_invFFT->transform(); - std::transform( - m_invFFT->out(), - m_invFFT->out() + m_fftSize, - m_tcorr.begin() + nfft*m_fftSize, - invfft2s - ); + + if (star) + { + *m_tcorr.begin() = invfft2star(m_invFFT->out()[0]); // t = 0 + SampleVector::iterator it = m_tcorr.begin() + 1; + + for (int i = 1; i < m_fftSize; i++) + { + *it = invfft2star(m_invFFT->out()[i] + m_invFFT->out()[2*m_fftSize-i]); + ++it; + } + } + else + { + std::transform( + m_invFFT->out(), + m_invFFT->out() + m_fftSize, + m_tcorr.begin() + nfft*m_fftSize, + invfft2s + ); + } size -= m_fftSize; begin0 += m_fftSize; diff --git a/plugins/channelmimo/interferometer/interferometercorr.h b/plugins/channelmimo/interferometer/interferometercorr.h index 94abe932f..ddeff47c0 100644 --- a/plugins/channelmimo/interferometer/interferometercorr.h +++ b/plugins/channelmimo/interferometer/interferometercorr.h @@ -66,7 +66,8 @@ private: const SampleVector& data0, int size0, const SampleVector& data1, - int size1 + int size1, + bool star = false ); bool performFFT2Corr( //!< Returns true if results were produced const SampleVector& data0, diff --git a/plugins/channelmimo/interferometer/interferometergui.ui b/plugins/channelmimo/interferometer/interferometergui.ui index 3560e5549..b5dd157ba 100644 --- a/plugins/channelmimo/interferometer/interferometergui.ui +++ b/plugins/channelmimo/interferometer/interferometergui.ui @@ -199,6 +199,11 @@ FFT2 + + + FFT* + + diff --git a/plugins/channelmimo/interferometer/interferometersettings.h b/plugins/channelmimo/interferometer/interferometersettings.h index 820c64577..4d24202c1 100644 --- a/plugins/channelmimo/interferometer/interferometersettings.h +++ b/plugins/channelmimo/interferometer/interferometersettings.h @@ -32,7 +32,8 @@ struct InterferometerSettings CorrelationAdd, CorrelationMultiply, CorrelationFFT, - CorrelationFFT2 + CorrelationFFT2, + CorrelationFFTStar }; CorrelationType m_correlationType;