1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-29 05:22:25 -04:00
This commit is contained in:
John Greb 2015-01-22 22:30:55 +00:00
parent 3c9ab44d68
commit d4a9f8e8e3
3 changed files with 37 additions and 21 deletions

View File

@ -17,18 +17,8 @@ void LoRaDemod::interleave(short* inout)
} }
} }
// Same sequence for any size short LoRaDemod::toGray(short num)
void LoRaDemod::make_gray()
{ {
short k = 0; return (num >> 1) ^ num;
for (short i = 0; i < 1<<8; i++) {
gray[i] = k;
// ungray[k] = i;
short r = (i+1) & ~i;
k ^= r;
}
// for (short i = 0; i < 1<<5; i++)
// printf("%x:%x:%x.\n", i, gray[i], ungray[gray[i]]);
} }

View File

@ -41,13 +41,13 @@ LoRaDemod::LoRaDemod(SampleSink* sampleSink) :
m_result = 0; m_result = 0;
m_count = 0; m_count = 0;
m_header = 0; m_header = 0;
m_time = 0;
loraFilter = new sfft(LORA_SFFT_LEN); loraFilter = new sfft(LORA_SFFT_LEN);
negaFilter = new sfft(LORA_SFFT_LEN); negaFilter = new sfft(LORA_SFFT_LEN);
mov = new float[4*LORA_SFFT_LEN]; mov = new float[4*LORA_SFFT_LEN];
gray = new short[1<<8]; history = new short[256];
make_gray();
} }
LoRaDemod::~LoRaDemod() LoRaDemod::~LoRaDemod()
@ -58,8 +58,8 @@ LoRaDemod::~LoRaDemod()
delete negaFilter; delete negaFilter;
if (mov) if (mov)
delete [] mov; delete [] mov;
if (gray) if (history)
delete [] gray; delete [] history;
} }
void LoRaDemod::configure(MessageQueue* messageQueue, Real Bandwidth) void LoRaDemod::configure(MessageQueue* messageQueue, Real Bandwidth)
@ -68,10 +68,31 @@ void LoRaDemod::configure(MessageQueue* messageQueue, Real Bandwidth)
cmd->submit(messageQueue, this); cmd->submit(messageQueue, this);
} }
short LoRaDemod::synch(short bin)
{
if (bin < 0) {
m_time = 0;
return 0;
}
history[m_time] = bin;
if (m_time > 12)
if (history[m_time] == history[m_time - 6])
if (history[m_time] == history[m_time - 12]) {
m_time = 0;
m_tune = bin;
return 0;
}
m_time++;
m_time &= 255;
if (m_time < 4)
return 0;
return (LORA_SFFT_LEN + bin - m_tune) & (LORA_SFFT_LEN - 1);
}
int LoRaDemod::detect(Complex c, Complex a) int LoRaDemod::detect(Complex c, Complex a)
{ {
int i, result, negresult, movpoint; short i, result, negresult, movpoint;
float peak, negpeak, tfloat; float peak, negpeak, tfloat;
float mag[LORA_SFFT_LEN]; float mag[LORA_SFFT_LEN];
float rev[LORA_SFFT_LEN]; float rev[LORA_SFFT_LEN];
@ -101,8 +122,10 @@ int LoRaDemod::detect(Complex c, Complex a)
} }
mov[movpoint * LORA_SFFT_LEN + i] = mag[i]; mov[movpoint * LORA_SFFT_LEN + i] = mag[i];
} }
if (peak > negpeak) { if (peak > negpeak * 4) {
m_result = result; m_result = synch(result);
} else {
synch(-1);
} }
return m_result; return m_result;
} }

View File

@ -45,7 +45,8 @@ public:
private: private:
int detect(Complex sample, Complex angle); int detect(Complex sample, Complex angle);
void interleave(short* inout); void interleave(short* inout);
void make_gray(); short synch (short bin);
short toGray(short bin);
class MsgConfigureLoRaDemod : public Message { class MsgConfigureLoRaDemod : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -76,11 +77,13 @@ private:
int m_result; int m_result;
int m_count; int m_count;
int m_header; int m_header;
int m_time;
short m_tune;
sfft* loraFilter; sfft* loraFilter;
sfft* negaFilter; sfft* negaFilter;
float* mov; float* mov;
short* gray; short* history;
NCO m_nco; NCO m_nco;
Interpolator m_interpolator; Interpolator m_interpolator;