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:
parent
c917ddf058
commit
3c9ab44d68
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user