1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-31 06:12:26 -04:00

Short moving average.

This commit is contained in:
John Greb 2015-01-21 00:53:00 +00:00
parent c917ddf058
commit 3c9ab44d68
3 changed files with 28 additions and 15 deletions

View File

@ -4,7 +4,7 @@
*/ */
// Needs adjusting for different sizes // Needs adjusting for different sizes
void interleave(short* inout) void LoRaDemod::interleave(short* inout)
{ {
int i, index = 6; int i, index = 6;
short in[index * 2]; short in[index * 2];
@ -18,10 +18,8 @@ void interleave(short* inout)
} }
// Same sequence for any size // Same sequence for any size
void make_gray(void) void LoRaDemod::make_gray()
{ {
short gray[1<<8];
// short ungray[1<<8];
short k = 0; short k = 0;
for (short i = 0; i < 1<<8; i++) { for (short i = 0; i < 1<<8; i++) {
gray[i] = k; gray[i] = k;

View File

@ -21,7 +21,7 @@
#include "lorademod.h" #include "lorademod.h"
#include "dsp/dspcommands.h" #include "dsp/dspcommands.h"
//#include "lorabits.h" #include "lorabits.h"
MESSAGE_CLASS_DEFINITION(LoRaDemod::MsgConfigureLoRaDemod, Message) MESSAGE_CLASS_DEFINITION(LoRaDemod::MsgConfigureLoRaDemod, Message)
@ -45,7 +45,9 @@ LoRaDemod::LoRaDemod(SampleSink* sampleSink) :
loraFilter = new sfft(LORA_SFFT_LEN); loraFilter = new sfft(LORA_SFFT_LEN);
negaFilter = new sfft(LORA_SFFT_LEN); negaFilter = new sfft(LORA_SFFT_LEN);
//make_gray(); mov = new float[4*LORA_SFFT_LEN];
gray = new short[1<<8];
make_gray();
} }
LoRaDemod::~LoRaDemod() LoRaDemod::~LoRaDemod()
@ -54,6 +56,10 @@ LoRaDemod::~LoRaDemod()
delete loraFilter; delete loraFilter;
if (negaFilter) if (negaFilter)
delete negaFilter; delete negaFilter;
if (mov)
delete [] mov;
if (gray)
delete [] gray;
} }
void LoRaDemod::configure(MessageQueue* messageQueue, Real Bandwidth) void LoRaDemod::configure(MessageQueue* messageQueue, Real Bandwidth)
@ -65,17 +71,19 @@ void LoRaDemod::configure(MessageQueue* messageQueue, Real Bandwidth)
int LoRaDemod::detect(Complex c, Complex a) int LoRaDemod::detect(Complex c, Complex a)
{ {
int i, result, negresult; int i, result, negresult, movpoint;
float peak, negpeak; float peak, negpeak, tfloat;
float mag[LORA_SFFT_LEN]; float mag[LORA_SFFT_LEN];
float rev[LORA_SFFT_LEN]; float rev[LORA_SFFT_LEN];
loraFilter->run(c * a); loraFilter->run(c * a);
negaFilter->run(c * conj(a)); negaFilter->run(c * conj(a));
if (++m_count & 31)
return m_result;
// process spectrum every 32 samples // process spectrum twice in FFTLEN
if (++m_count & ((1 << DATA_BITS) - 1))
return m_result;
movpoint = 3 & (m_count >> DATA_BITS);
loraFilter->fetch(mag); loraFilter->fetch(mag);
negaFilter->fetch(rev); negaFilter->fetch(rev);
peak = negpeak = 0.0f; peak = negpeak = 0.0f;
@ -85,10 +93,13 @@ int LoRaDemod::detect(Complex c, Complex a)
negpeak = rev[i]; negpeak = rev[i];
negresult = i; negresult = i;
} }
if (mag[i] > peak) { tfloat = mov[i] + mov[LORA_SFFT_LEN + i] +mov[2 * LORA_SFFT_LEN + i]
peak = mag[i]; + mov[3 * LORA_SFFT_LEN + i] + mag[i];
if (tfloat > peak) {
peak = tfloat;
result = i; result = i;
} }
mov[movpoint * LORA_SFFT_LEN + i] = mag[i];
} }
if (peak > negpeak) { if (peak > negpeak) {
m_result = result; m_result = result;

View File

@ -38,12 +38,14 @@ public:
void configure(MessageQueue* messageQueue, Real Bandwidth); void configure(MessageQueue* messageQueue, Real Bandwidth);
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool pO); void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool pO);
int detect(Complex sample, Complex angle);
void start(); void start();
void stop(); void stop();
bool handleMessage(Message* cmd); bool handleMessage(Message* cmd);
private: private:
int detect(Complex sample, Complex angle);
void interleave(short* inout);
void make_gray();
class MsgConfigureLoRaDemod : public Message { class MsgConfigureLoRaDemod : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -77,6 +79,8 @@ private:
sfft* loraFilter; sfft* loraFilter;
sfft* negaFilter; sfft* negaFilter;
float* mov;
short* gray;
NCO m_nco; NCO m_nco;
Interpolator m_interpolator; Interpolator m_interpolator;