1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-05-04 21:24:07 -04:00

LoRa demod: spread argmax method using adjacent FFTs proved not more efficient

This commit is contained in:
f4exb 2020-02-20 18:29:05 +01:00
parent be2ca2d0fd
commit 9277813f23
2 changed files with 62 additions and 0 deletions

View File

@ -458,6 +458,59 @@ unsigned int LoRaDemodSink::argmax(
return imax;
}
unsigned int LoRaDemodSink::argmaxSpreaded(
const Complex *fftBins,
unsigned int fftMult,
unsigned int fftLength,
double& magsqMax,
double& magsqNoise,
Complex *specBuffer,
unsigned int specDecim)
{
magsqMax = 0.0;
magsqNoise = 0.0;
unsigned int imax = 0;
double magSum = 0.0;
double magSymbol = 0.0;
unsigned int spread = fftMult * (1<<m_settings.m_deBits);
unsigned int istart = fftMult*fftLength - spread/2 + 1;
for (unsigned int i2 = istart; i2 < istart + fftMult*fftLength; i2++)
{
unsigned int i = i2 % (fftMult*fftLength);
double magsq = std::norm(fftBins[i]);
magSymbol += magsq;
if (i % spread == spread/2) // boundary (inclusive)
{
if (magSymbol > magsqMax)
{
magsqMax = magSymbol;
imax = i;
}
magsqNoise += magSymbol;
magSymbol = 0.0;
}
if (specBuffer)
{
magSum += magsq;
if (i % specDecim == specDecim - 1)
{
specBuffer[i/specDecim] = Complex(std::polar(magSum, 0.0));
magSum = 0.0;
}
}
}
magsqNoise -= magsqMax;
magsqNoise /= fftLength;
return imax / spread;
}
void LoRaDemodSink::decimateSpectrum(Complex *in, Complex *out, unsigned int size, unsigned int decimation)
{
for (unsigned int i = 0; i < size; i++)

View File

@ -120,6 +120,15 @@ private:
Complex *specBuffer,
unsigned int specDecim
);
unsigned int argmaxSpreaded( //!< count energy in adjacent bins for same symbol (needs DE bits > 0)
const Complex *fftBins,
unsigned int fftMult,
unsigned int fftLength,
double& magsqMax,
double& magsqNoise,
Complex *specBuffer,
unsigned int specDecim
);
void decimateSpectrum(Complex *in, Complex *out, unsigned int size, unsigned int decimation);
int toSigned(int u, int intSize);
unsigned int evalSymbol(unsigned int rawSymbol);