From ad1c436a7ed94db4d35294b77c52542679a32e92 Mon Sep 17 00:00:00 2001 From: John Greb Date: Sun, 11 Jan 2015 12:27:11 +0000 Subject: [PATCH] Spreading. --- plugins/channel/lora/lorademod.cpp | 14 +++++++------- plugins/channel/lora/lorademod.h | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/channel/lora/lorademod.cpp b/plugins/channel/lora/lorademod.cpp index e7fd3650c..089c7067c 100644 --- a/plugins/channel/lora/lorademod.cpp +++ b/plugins/channel/lora/lorademod.cpp @@ -30,10 +30,10 @@ LoRaDemod::LoRaDemod(SampleSink* sampleSink) : m_sampleRate = 96000; m_frequency = 0; m_nco.setFreq(m_frequency, m_sampleRate); - m_interpolator.create(16, m_sampleRate, m_Bandwidth/2.0); + m_interpolator.create(16, m_sampleRate, m_Bandwidth/1.9); m_sampleDistanceRemain = (Real)m_sampleRate / m_Bandwidth; - m_freq = 0; + m_chirp = 0; m_angle = 0; } @@ -57,9 +57,9 @@ void LoRaDemod::feed(SampleVector::const_iterator begin, SampleVector::const_ite c *= m_nco.nextIQ(); if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &ci)) { - m_freq = (m_freq + 1) & 255; - m_angle = (m_angle + m_freq) & 255; - Complex cangle(cos(M_PI*m_angle/128),-sin(M_PI*m_angle/128)); + m_chirp = (m_chirp + 1) & (SPREADFACTOR - 1); + m_angle = (m_angle + m_chirp) & (SPREADFACTOR - 1); + Complex cangle(cos(M_PI*2*m_angle/SPREADFACTOR),-sin(M_PI*2*m_angle/SPREADFACTOR)); ci *= cangle; m_sampleBuffer.push_back(Sample(ci.real() * 32000, ci.imag() * 32000)); m_sampleDistanceRemain += (Real)m_sampleRate / m_Bandwidth; @@ -83,14 +83,14 @@ bool LoRaDemod::handleMessage(Message* cmd) DSPSignalNotification* signal = (DSPSignalNotification*)cmd; m_sampleRate = signal->getSampleRate(); m_nco.setFreq(-signal->getFrequencyOffset(), m_sampleRate); - m_interpolator.create(16, m_sampleRate, m_Bandwidth/2.0); + m_interpolator.create(16, m_sampleRate, m_Bandwidth/1.9); m_sampleDistanceRemain = m_sampleRate / m_Bandwidth; cmd->completed(); return true; } else if(MsgConfigureLoRaDemod::match(cmd)) { MsgConfigureLoRaDemod* cfg = (MsgConfigureLoRaDemod*)cmd; m_Bandwidth = cfg->getBandwidth(); - m_interpolator.create(16, m_sampleRate, m_Bandwidth/2.0); + m_interpolator.create(16, m_sampleRate, m_Bandwidth/1.9); cmd->completed(); return true; } else { diff --git a/plugins/channel/lora/lorademod.h b/plugins/channel/lora/lorademod.h index 8e1068bbc..ac33efa48 100644 --- a/plugins/channel/lora/lorademod.h +++ b/plugins/channel/lora/lorademod.h @@ -24,6 +24,8 @@ #include "dsp/interpolator.h" #include "util/message.h" +#define SPREADFACTOR (1<<8) + class LoRaDemod : public SampleSink { public: LoRaDemod(SampleSink* sampleSink); @@ -61,7 +63,7 @@ private: Real m_Bandwidth; int m_sampleRate; int m_frequency; - int m_freq; + int m_chirp; int m_angle; NCO m_nco;