1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-11-15 12:43:18 -05:00

Interferometer: implemented FFT star time correlation

This commit is contained in:
f4exb 2019-10-08 08:38:12 +02:00
parent 95fccf290c
commit d925781d9a
4 changed files with 48 additions and 9 deletions

View File

@ -92,6 +92,13 @@ Sample invfft2s2(const std::complex<float>& a) { //!< Complex float to Sample fo
return s;
}
Sample invfft2star(const std::complex<float>& 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;

View File

@ -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,

View File

@ -199,6 +199,11 @@
<string>FFT2</string>
</property>
</item>
<item>
<property name="text">
<string>FFT*</string>
</property>
</item>
</widget>
</item>
<item>

View File

@ -32,7 +32,8 @@ struct InterferometerSettings
CorrelationAdd,
CorrelationMultiply,
CorrelationFFT,
CorrelationFFT2
CorrelationFFT2,
CorrelationFFTStar
};
CorrelationType m_correlationType;