- removed profiling -pg
- receiver uses Downsampler, PolyPhase, Farrow - removed Lagrange git-svn-id: http://moon:8086/svn/software/trunk/projects/mpsk_rx_gui@98 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
@@ -19,7 +19,7 @@ ifeq ($(CONFIG),Debug)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
CPPFLAGS := $(DEPFLAGS) -std=c++11 -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "radio_float_t=float" -D "fir_float_t=float" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules -I ../../../../libsrc -I ../../../../libsrc/cpp -I ../../Source -I /usr/local/include/eigen3
|
CPPFLAGS := $(DEPFLAGS) -std=c++11 -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "radio_float_t=float" -D "fir_float_t=float" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules -I ../../../../libsrc -I ../../../../libsrc/cpp -I ../../Source -I /usr/local/include/eigen3
|
||||||
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 -std=c++11 -pg
|
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 -std=c++11 -msse2
|
||||||
CXXFLAGS += $(CFLAGS)
|
CXXFLAGS += $(CFLAGS)
|
||||||
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L../../../../libsrc/build/linux -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -lradio -lfir -lcrc
|
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L../../../../libsrc/build/linux -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -lradio -lfir -lcrc
|
||||||
LDDEPS :=
|
LDDEPS :=
|
||||||
@@ -39,12 +39,12 @@ ifeq ($(CONFIG),Release)
|
|||||||
TARGET_ARCH := -march=native
|
TARGET_ARCH := -march=native
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CPPFLAGS := $(DEPFLAGS) -std=c++11 -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "radio_float_t=float" -D "fir_float_t=float" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules -I ../../../../libsrc -I ../../../../libsrc/cpp -I ../../Source -I /usr/local/include/eigen3
|
CPPFLAGS := $(DEPFLAGS) -std=c++11 -D "LINUX=1" -D "NDEBUG" -D "radio_float_t=float" -D "fir_float_t=float" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules -I ../../../../libsrc -I ../../../../libsrc/cpp -I ../../Source -I /usr/local/include/eigen3
|
||||||
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O3 -std=c++11 -pg
|
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -std=c++11 -msse2
|
||||||
CXXFLAGS += $(CFLAGS)
|
CXXFLAGS += $(CFLAGS)
|
||||||
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L../../../../libsrc/build/linux -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -lradio -lfir -lcrc
|
LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -L../../../../libsrc/build/linux -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -lradio -lfir -lcrc
|
||||||
LDDEPS :=
|
LDDEPS :=
|
||||||
RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "radio_float_t=float" -D "fir_float_t=float" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules -I ../../../../libsrc -I ../../../../libsrc/cpp -I ../../Source -I /usr/local/include/eigen3
|
RESFLAGS := -D "LINUX=1" -D "NDEBUG" -D "radio_float_t=float" -D "fir_float_t=float" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules -I ../../../../libsrc -I ../../../../libsrc/cpp -I ../../Source -I /usr/local/include/eigen3
|
||||||
TARGET := M-PSK\ Receiver
|
TARGET := M-PSK\ Receiver
|
||||||
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
|
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
|
||||||
CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)
|
CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)
|
||||||
|
|||||||
@@ -35,14 +35,14 @@
|
|||||||
</MAINGROUP>
|
</MAINGROUP>
|
||||||
<EXPORTFORMATS>
|
<EXPORTFORMATS>
|
||||||
<LINUX_MAKE targetFolder="Builds/Linux" externalLibraries="radio fir crc "
|
<LINUX_MAKE targetFolder="Builds/Linux" externalLibraries="radio fir crc "
|
||||||
extraDefs="" extraCompilerFlags="-std=c++11 -pg">
|
extraDefs="" extraCompilerFlags="-std=c++11 -msse2 ">
|
||||||
<CONFIGURATIONS>
|
<CONFIGURATIONS>
|
||||||
<CONFIGURATION name="Debug" libraryPath="/usr/X11R6/lib/ ../../../../libsrc/build/linux ../../../../libsrc/build/linux ../../../../libsrc/build/linux"
|
<CONFIGURATION name="Debug" libraryPath="/usr/X11R6/lib/ ../../../../libsrc/build/linux ../../../../libsrc/build/linux ../../../../libsrc/build/linux"
|
||||||
isDebug="1" optimisation="1" targetName="M-PSK Receiver" headerPath="../../../../libsrc ../../../../libsrc/cpp ../../Source /usr/local/include/eigen3"
|
isDebug="1" optimisation="1" targetName="M-PSK Receiver" headerPath="../../../../libsrc ../../../../libsrc/cpp ../../Source /usr/local/include/eigen3"
|
||||||
defines="radio_float_t=float fir_float_t=float"/>
|
defines="radio_float_t=float fir_float_t=float"/>
|
||||||
<CONFIGURATION name="Release" libraryPath="/usr/X11R6/lib/ ../../../../libsrc/build/linux ../../../../libsrc/build/linux ../../../../libsrc/build/linux"
|
<CONFIGURATION name="Release" libraryPath="/usr/X11R6/lib/ ../../../../libsrc/build/linux ../../../../libsrc/build/linux ../../../../libsrc/build/linux"
|
||||||
isDebug="1" optimisation="3" targetName="M-PSK Receiver" headerPath="../../../../libsrc ../../../../libsrc/cpp ../../Source /usr/local/include/eigen3"
|
isDebug="0" optimisation="3" targetName="M-PSK Receiver" headerPath="../../../../libsrc ../../../../libsrc/cpp ../../Source /usr/local/include/eigen3"
|
||||||
defines="radio_float_t=float fir_float_t=float"/>
|
defines="radio_float_t=float fir_float_t=float NDEBUG "/>
|
||||||
</CONFIGURATIONS>
|
</CONFIGURATIONS>
|
||||||
<MODULEPATHS>
|
<MODULEPATHS>
|
||||||
<MODULEPATH id="juce_audio_basics" path="/home/jens/JUCE/modules"/>
|
<MODULEPATH id="juce_audio_basics" path="/home/jens/JUCE/modules"/>
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ MainComponent::MainComponent ()
|
|||||||
|
|
||||||
//[Constructor] You can add your own custom stuff here..
|
//[Constructor] You can add your own custom stuff here..
|
||||||
m_samplerate = 48000;
|
m_samplerate = 48000;
|
||||||
// m_pTransmitter = new Transmitter();
|
|
||||||
m_pTransmitterControl = m_pTransmitter;
|
m_pTransmitterControl = m_pTransmitter;
|
||||||
|
|
||||||
m_TextEditor->setMultiLine (true);
|
m_TextEditor->setMultiLine (true);
|
||||||
|
|||||||
+33
-743
@@ -10,12 +10,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
const uint32_t LPF_OVERSAMPLING = 32; // Arm-Filter: oversampling
|
const uint32_t LPF_OVERSAMPLING = 8; // Arm-Filter: oversampling
|
||||||
const radio_float_t LPF_OMEGA = (radio_float_t)0.48; // Arm-Filter: RC Roll-off
|
const radio_float_t LPF_OMEGA = (radio_float_t)0.48; // Arm-Filter: RC Roll-off
|
||||||
const uint32_t RCF_OVERSAMPLING = 16; // RCF_TYPE_POLYPHASE_DISCRETE: oversampling
|
const uint32_t RCF_OVERSAMPLING = 16; // RCF_TYPE_POLYPHASE_DISCRETE: oversampling
|
||||||
const radio_float_t RCF_ROLLOFF = (radio_float_t)0.35; // RCF_TYPE_POLYPHASE_DISCRETE: RC Roll-off
|
const radio_float_t RCF_ROLLOFF = (radio_float_t)0.35; // RCF_TYPE_POLYPHASE_DISCRETE: RC Roll-off
|
||||||
const uint32_t RCF_NUM_PHASES = 256; // RCF_TYPE_POLYPHASE_DISCRETE: number of discrete phases
|
const uint32_t RCF_NUM_PHASES = 256; // RCF_TYPE_POLYPHASE_DISCRETE: number of discrete phases
|
||||||
const uint32_t LAGRANGE_IP_ORDER = 16; // RCF_TYPE_LAGRANGE: degree of polynomial
|
|
||||||
|
|
||||||
const radio_float_t CPR_GAIN_LEAD_AQU = (radio_float_t)5.0E-5; // 3E-5
|
const radio_float_t CPR_GAIN_LEAD_AQU = (radio_float_t)5.0E-5; // 3E-5
|
||||||
const radio_float_t CPR_GAIN_LAG_AQU = (radio_float_t)0.4E-6; // 1E-6
|
const radio_float_t CPR_GAIN_LAG_AQU = (radio_float_t)0.4E-6; // 1E-6
|
||||||
@@ -49,18 +48,8 @@ Receiver::Receiver(LogHandler *pLogHandler)
|
|||||||
, m_ReceiverEnable(false)
|
, m_ReceiverEnable(false)
|
||||||
, m_pDataListener(0)
|
, m_pDataListener(0)
|
||||||
, m_frameReceiver(this)
|
, m_frameReceiver(this)
|
||||||
, m_pFirArm(0)
|
|
||||||
, m_pFirDownArm(0)
|
|
||||||
, m_pFirRcf(0)
|
|
||||||
, m_pSymMapper(0)
|
, m_pSymMapper(0)
|
||||||
, m_pPolyphaseInterpolator(0)
|
|
||||||
, m_pLagrangeInterpolator(0)
|
|
||||||
{
|
{
|
||||||
m_stateArm_I = nullptr;
|
|
||||||
m_stateArm_Q = nullptr;
|
|
||||||
m_coefArm = nullptr;
|
|
||||||
m_coefRCF = nullptr;
|
|
||||||
|
|
||||||
m_params.numBitsPerSymbol = 2;
|
m_params.numBitsPerSymbol = 2;
|
||||||
m_params.samplerate = 192000;
|
m_params.samplerate = 192000;
|
||||||
m_params.symbolrate = m_params.samplerate/4;
|
m_params.symbolrate = m_params.samplerate/4;
|
||||||
@@ -94,6 +83,9 @@ void Receiver::setBufSize(uint32 size)
|
|||||||
|
|
||||||
if (m_bufsize != size)
|
if (m_bufsize != size)
|
||||||
{
|
{
|
||||||
|
m_passbandBuffer.resize(size);
|
||||||
|
m_basebandBuffer.resize(size);
|
||||||
|
|
||||||
if (m_pPassbandBuffer)
|
if (m_pPassbandBuffer)
|
||||||
delete m_pPassbandBuffer;
|
delete m_pPassbandBuffer;
|
||||||
|
|
||||||
@@ -263,569 +255,6 @@ void Receiver::init()
|
|||||||
|
|
||||||
// --------------------------------------
|
// --------------------------------------
|
||||||
// Eval
|
// Eval
|
||||||
#if 0
|
|
||||||
sl_mean_t slMean;
|
|
||||||
sl_minmax_t sl_min;
|
|
||||||
sl_minmax_t sl_max;
|
|
||||||
fifo_t fifo;
|
|
||||||
uint32_t y;
|
|
||||||
radio_float_t mean;
|
|
||||||
radio_float_t min;
|
|
||||||
radio_float_t max;
|
|
||||||
radio_float_t soll_min;
|
|
||||||
radio_float_t soll_max;
|
|
||||||
radio_float_t x;
|
|
||||||
|
|
||||||
SlidingMeanInit(&slMean, 4);
|
|
||||||
SlidingMinMaxInit(&sl_min, 1000, (radio_float_t)1E12, -1);
|
|
||||||
SlidingMinMaxInit(&sl_max, 1000, (radio_float_t)1E12, +1);
|
|
||||||
|
|
||||||
for (int k=0; k < 4; k++)
|
|
||||||
{
|
|
||||||
mean = SlidingMeanProcess(&slMean, 2);
|
|
||||||
}
|
|
||||||
for (int k=0; k < 4; k++)
|
|
||||||
{
|
|
||||||
mean = SlidingMeanProcess(&slMean, 4);
|
|
||||||
}
|
|
||||||
for (int k=0; k < 4; k++)
|
|
||||||
{
|
|
||||||
mean = SlidingMeanProcess(&slMean, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
FifoInit(&fifo, 10);
|
|
||||||
for (int k=0; k < 10; k++)
|
|
||||||
{
|
|
||||||
FifoPushBack(&fifo, (uint32_t)k);
|
|
||||||
}
|
|
||||||
for (int k=0; k < 5; k++)
|
|
||||||
{
|
|
||||||
y = FifoFront(&fifo);
|
|
||||||
FifoPopFront(&fifo);
|
|
||||||
}
|
|
||||||
for (int k=0; k < 8; k++)
|
|
||||||
{
|
|
||||||
FifoPushBack(&fifo, (uint32_t)k+10);
|
|
||||||
}
|
|
||||||
FifoPushFront(&fifo, (uint32_t)123);
|
|
||||||
for (int k=0; k < 10; k++)
|
|
||||||
{
|
|
||||||
y = FifoFront(&fifo);
|
|
||||||
FifoPopFront(&fifo);
|
|
||||||
}
|
|
||||||
FifoPushBack(&fifo, (uint32_t)456);
|
|
||||||
y = FifoFront(&fifo);
|
|
||||||
|
|
||||||
// Sliding min
|
|
||||||
soll_min = 1000;
|
|
||||||
for (int k=0; k < 1000; k++)
|
|
||||||
{
|
|
||||||
x = 2*(0.5-(float)rand()/RAND_MAX);
|
|
||||||
if (x < soll_min)
|
|
||||||
soll_min = x;
|
|
||||||
|
|
||||||
SlidingMinMaxProcess(&sl_min, x);
|
|
||||||
}
|
|
||||||
min = SlidingMinMaxGet(&sl_min);
|
|
||||||
|
|
||||||
// Sliding max
|
|
||||||
soll_max = -1000;
|
|
||||||
for (int k=0; k < 1000; k++)
|
|
||||||
{
|
|
||||||
x = 2*(0.5-(float)rand()/RAND_MAX);
|
|
||||||
if (x > soll_max)
|
|
||||||
soll_max = x;
|
|
||||||
|
|
||||||
SlidingMinMaxProcess(&sl_max, x);
|
|
||||||
}
|
|
||||||
max = SlidingMinMaxGet(&sl_max);
|
|
||||||
|
|
||||||
SlidingMeanFree(&slMean);
|
|
||||||
FifoFree(&fifo);
|
|
||||||
SlidingMinMaxFree(&sl_min);
|
|
||||||
SlidingMinMaxFree(&sl_max);
|
|
||||||
|
|
||||||
MinMaxLemire minMax(100);
|
|
||||||
std::vector<float>data(100);
|
|
||||||
std::vector<float>minValues;
|
|
||||||
std::vector<float>maxValues;
|
|
||||||
|
|
||||||
for (int k=0; k < data.size(); k++)
|
|
||||||
{
|
|
||||||
data[k] = (float)k+1;
|
|
||||||
}
|
|
||||||
minMax.process(data);
|
|
||||||
minValues = minMax.getminvalues();
|
|
||||||
maxValues = minMax.getmaxvalues();
|
|
||||||
for (int k=0; k < data.size(); k++)
|
|
||||||
{
|
|
||||||
data[k] = (float)k+1+50;
|
|
||||||
}
|
|
||||||
minMax.process(data);
|
|
||||||
minValues = minMax.getminvalues();
|
|
||||||
maxValues = minMax.getmaxvalues();
|
|
||||||
// --------------------------------------
|
|
||||||
// Eval
|
|
||||||
UnitFrameReceiver rx(10);
|
|
||||||
UnitFrameTransmitter tx(10, &rx);
|
|
||||||
tx.process();
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// ComplexVector
|
|
||||||
//---------------------------
|
|
||||||
CVec cv1(4);
|
|
||||||
CVec cv2(4);
|
|
||||||
CVec cv3(4);
|
|
||||||
|
|
||||||
cv1.at(0) = CVec(1,2);
|
|
||||||
cv1.at(1) = CVec(3,4);
|
|
||||||
cv1.at(2) = CVec(5,6);
|
|
||||||
cv1.at(3) = CVec(7,8);
|
|
||||||
cv2.at(0) = CVec(11,12);
|
|
||||||
cv2.at(1) = CVec(13,14);
|
|
||||||
cv2.at(2) = CVec(15,16);
|
|
||||||
cv2.at(3) = CVec(17,18);
|
|
||||||
|
|
||||||
const CVec &c = -cv1;
|
|
||||||
cv3 = c;
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1 <op> cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1 + cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 - cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 * cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 / cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1 <op> cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1 + cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 - cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 * cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 / cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1 <op> -cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1 + -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 - -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 * -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 / -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1 <op> -cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1 + -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 - -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 * -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 / -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1* <op> cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1.conj() + cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() - cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() * cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() / cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1 <op> cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1 + cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 - cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 * cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 / cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1* <op> cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1.conj() + cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() - cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() * cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() / cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1* <op> cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1.conj() + cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() - cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() * cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() / cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1* <op> -cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1.conj() + -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() - -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() * -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() / -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1* <op> -cv2
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1.conj() + -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() - -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() * -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() / -cv2;
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1 <op> cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1 + cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 - cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 * cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 / cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1 <op> -cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1 + -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 - -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 * -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1 / -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1 <op> -cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1 + -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 - -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 * -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1 / -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1* <op> cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1.conj() + cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() - cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() * cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() / cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = cv1* <op> -cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = cv1.conj() + -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() - -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() * -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = cv1.conj() / -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// cv3 = -cv1* <op> -cv2*
|
|
||||||
//---------------------------
|
|
||||||
cv3 = -cv1.conj() + -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() - -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() * -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
cv3 = -cv1.conj() / -cv2.conj();
|
|
||||||
cv1.print("cv1");
|
|
||||||
cv2.print("cv2");
|
|
||||||
cv3.print("cv3");
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// Test
|
|
||||||
//---------------------------
|
|
||||||
CVec w(32);
|
|
||||||
CVec w_conj(32);
|
|
||||||
CVec e(32);
|
|
||||||
CVec x(32);
|
|
||||||
|
|
||||||
w = CVec(1, 1);
|
|
||||||
w_conj = CVec(0.f, 0.f);
|
|
||||||
e = CVec (0.5f, 0.4f);
|
|
||||||
x = CVec(2.f, 2.f);
|
|
||||||
x *= CVec(10.f, 0);
|
|
||||||
x += CVec(0.5f, 0);
|
|
||||||
x -= CVec(5.f, 0);
|
|
||||||
x += w + w_conj;
|
|
||||||
|
|
||||||
w.print("w");
|
|
||||||
x.print("x");
|
|
||||||
e.print("e");
|
|
||||||
UpdateWeigths(x, e, w, w_conj, 0.08);
|
|
||||||
|
|
||||||
//---------------------------
|
|
||||||
// RealVector
|
|
||||||
//---------------------------
|
|
||||||
RVec rv1(4, 0);
|
|
||||||
RVec rv2(4, 0);
|
|
||||||
RVec rv3(4, 0);
|
|
||||||
|
|
||||||
rv1 = 10.f;
|
|
||||||
rv2 = 20.f;
|
|
||||||
|
|
||||||
const RVec &r = -rv1;
|
|
||||||
rv3 = r;
|
|
||||||
rv3 = -rv1;
|
|
||||||
rv3 = -rv1 * rv2 * rv2;
|
|
||||||
rv3 = (rv1 * rv2) / (rv1 + rv2) * (rv1 - rv2);
|
|
||||||
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (rv1 * -rv2) / (rv1 + rv2);
|
|
||||||
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 *= -rv2;
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 += -rv2;
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 -= -rv2;
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 *= -(rv1 + rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 += -(rv1 + rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 -= -(rv1 + rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (rv1 + -rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (-rv1 + rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (-rv1 + -rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (-rv1 - rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (rv1 - -rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (-rv1 - -rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
|
|
||||||
rv3 = (-(rv1 * -rv2) * (1.f + 3.f))/(-rv3) + -6.f;
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
rv3 += -(rv1 * -rv2);
|
|
||||||
rv1.print("v1");
|
|
||||||
rv2.print("v2");
|
|
||||||
rv3.print("v3");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TraceOpen(&m_trace, "D:\\home\\jens\\Dokumente\\trace.txt");
|
TraceOpen(&m_trace, "D:\\home\\jens\\Dokumente\\trace.txt");
|
||||||
|
|
||||||
@@ -839,61 +268,6 @@ void Receiver::free()
|
|||||||
|
|
||||||
m_ReceiverEnable = false;
|
m_ReceiverEnable = false;
|
||||||
|
|
||||||
if (m_stateArm_I != nullptr)
|
|
||||||
delete m_stateArm_I;
|
|
||||||
|
|
||||||
m_stateArm_I = nullptr;
|
|
||||||
|
|
||||||
if (m_stateArm_Q != nullptr)
|
|
||||||
delete m_stateArm_Q;
|
|
||||||
|
|
||||||
m_stateArm_Q = nullptr;
|
|
||||||
|
|
||||||
if (m_coefArm != nullptr)
|
|
||||||
delete m_coefArm;
|
|
||||||
|
|
||||||
m_coefArm = nullptr;
|
|
||||||
|
|
||||||
if (m_coefRCF != nullptr)
|
|
||||||
delete m_coefRCF;
|
|
||||||
|
|
||||||
m_coefRCF = nullptr;
|
|
||||||
|
|
||||||
if (m_pFirArm)
|
|
||||||
{
|
|
||||||
FirCpxFree(m_pFirArm);
|
|
||||||
delete m_pFirArm;
|
|
||||||
}
|
|
||||||
m_pFirArm = nullptr;
|
|
||||||
|
|
||||||
if (m_pFirDownArm)
|
|
||||||
{
|
|
||||||
FirCpxMultirateFree(m_pFirDownArm);
|
|
||||||
delete m_pFirDownArm;
|
|
||||||
}
|
|
||||||
m_pFirDownArm = nullptr;
|
|
||||||
|
|
||||||
if (m_pFirRcf)
|
|
||||||
{
|
|
||||||
FirCpxFree(m_pFirRcf);
|
|
||||||
delete m_pFirRcf;
|
|
||||||
}
|
|
||||||
m_pFirRcf = nullptr;
|
|
||||||
|
|
||||||
if (m_pPolyphaseInterpolator)
|
|
||||||
{
|
|
||||||
PolyPhaseCpxIpFree(m_pPolyphaseInterpolator);
|
|
||||||
delete m_pPolyphaseInterpolator;
|
|
||||||
}
|
|
||||||
m_pPolyphaseInterpolator = nullptr;
|
|
||||||
|
|
||||||
if (m_pLagrangeInterpolator)
|
|
||||||
{
|
|
||||||
LGCpxIpFree(m_pLagrangeInterpolator);
|
|
||||||
delete m_pLagrangeInterpolator;
|
|
||||||
}
|
|
||||||
m_pLagrangeInterpolator = nullptr;
|
|
||||||
|
|
||||||
NCO_Free(&m_nco_ddc);
|
NCO_Free(&m_nco_ddc);
|
||||||
NCO_Free(&m_nco_cpr);
|
NCO_Free(&m_nco_cpr);
|
||||||
|
|
||||||
@@ -1019,9 +393,18 @@ void Receiver::processPassband(float *pRF, uint32_t len)
|
|||||||
// @samplerate
|
// @samplerate
|
||||||
NCO_MixRealComplexV(&m_nco_ddc, m_pPassbandBuffer, pRF, 2/*m_params.agcGain[0]*/, len);
|
NCO_MixRealComplexV(&m_nco_ddc, m_pPassbandBuffer, pRF, 2/*m_params.agcGain[0]*/, len);
|
||||||
|
|
||||||
|
for (uint32_t i=0; i < len; i++)
|
||||||
|
{
|
||||||
|
m_passbandBuffer[i] = ComplexScalar(m_pPassbandBuffer[i].real, m_pPassbandBuffer[i].imag);
|
||||||
|
}
|
||||||
|
|
||||||
// Arm Filtering and downsampling
|
// Arm Filtering and downsampling
|
||||||
// len_down = FirCpxProcessReal(m_pFirArm, m_coefArm, m_pPassbandBuffer, m_pBasebandBuffer, len);
|
len_down = m_firArmDown.process(m_basebandBuffer, m_passbandBuffer, len);
|
||||||
len_down = FirCpxDownProcess(m_pFirDownArm, m_pPassbandBuffer, m_pBasebandBuffer, len);
|
for (uint32_t i=0; i < len_down; i++)
|
||||||
|
{
|
||||||
|
m_pBasebandBuffer[i].real = m_basebandBuffer[i].real();
|
||||||
|
m_pBasebandBuffer[i].imag = m_basebandBuffer[i].imag();
|
||||||
|
}
|
||||||
processBaseband(m_pBasebandBuffer, len_down);
|
processBaseband(m_pBasebandBuffer, len_down);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1082,7 +465,8 @@ void Receiver::processBaseband(cpx_t *pIF, uint32_t len)
|
|||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
||||||
{
|
{
|
||||||
// Matched filtering and interpolation
|
// Matched filtering and interpolation
|
||||||
PolyPhaseCpxIpFeed(m_pPolyphaseInterpolator, 1, pIF[n]);
|
// PolyPhaseCpxIpFeed(m_pPolyphaseInterpolator, 1, pIF[n]);
|
||||||
|
m_polyPhase.feed(toComplexScalar(pIF[n]), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_FARROW)
|
if (RCF_TYPE == RCF_TYPE_POLYPHASE_FARROW)
|
||||||
@@ -1102,7 +486,9 @@ void Receiver::processBaseband(cpx_t *pIF, uint32_t len)
|
|||||||
|
|
||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
||||||
{
|
{
|
||||||
IQ_mf = PolyPhaseCpxIpInterpolate(m_pPolyphaseInterpolator, !TimingCorrectorIsStuff(&m_timing_corrector), TimingCorrectorGetMu(&m_timing_corrector));
|
// IQ_mf = PolyPhaseCpxIpInterpolate(m_pPolyphaseInterpolator, !TimingCorrectorIsStuff(&m_timing_corrector), TimingCorrectorGetMu(&m_timing_corrector));
|
||||||
|
ComplexScalar __IQ_mf = m_polyPhase.process(TimingCorrectorGetMu(&m_timing_corrector), !TimingCorrectorIsStuff(&m_timing_corrector));
|
||||||
|
IQ_mf = toCpx(__IQ_mf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_FARROW)
|
if (RCF_TYPE == RCF_TYPE_POLYPHASE_FARROW)
|
||||||
@@ -1303,32 +689,6 @@ void Receiver::processBaseband(cpx_t *pIF, uint32_t len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cpx_t Receiver::processMatchedFilter(cpx_t x, int32_t m, radio_float_t mu)
|
|
||||||
{
|
|
||||||
cpx_t y = x;
|
|
||||||
cpx_t z;
|
|
||||||
|
|
||||||
// Matched filtering and interpolation
|
|
||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
|
||||||
{
|
|
||||||
// Polyphase matched filter
|
|
||||||
// y = PolyPhaseCpxIpProcess(m_pPolyphaseInterpolator, x, m, mu);
|
|
||||||
}
|
|
||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_FARROW)
|
|
||||||
{
|
|
||||||
// Polyphase matched farraow filter
|
|
||||||
// y = FarrowPPIPCpxProcess2(m_pFarrowInterpolator, x, 0, 0, mu);
|
|
||||||
}
|
|
||||||
if (RCF_TYPE == RCF_TYPE_LAGRANGE)
|
|
||||||
{
|
|
||||||
// Matched filter followed by Lagrange interpolator
|
|
||||||
FirCpxProcessReal(m_pFirRcf, m_coefRCF, &x, &z, 1);
|
|
||||||
y = LGCpxIpProcess(m_pLagrangeInterpolator, z, m, mu);
|
|
||||||
}
|
|
||||||
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Receiver::initDDC()
|
void Receiver::initDDC()
|
||||||
{
|
{
|
||||||
NCO_Init(&m_nco_ddc, m_params.ddc_freq/m_params.samplerate, 0);
|
NCO_Init(&m_nco_ddc, m_params.ddc_freq/m_params.samplerate, 0);
|
||||||
@@ -1370,54 +730,12 @@ void Receiver::initSymbolMapper()
|
|||||||
|
|
||||||
void Receiver::initFilterRcf()
|
void Receiver::initFilterRcf()
|
||||||
{
|
{
|
||||||
m_nrcf = (uint32_t)(RCF_OVERSAMPLING*m_params.samplerate/m_params.symbolrate)+1;
|
uint32_t nrcf = (uint32_t)(RCF_OVERSAMPLING*m_params.samplerate/m_params.symbolrate)+1;
|
||||||
|
|
||||||
if (m_coefRCF)
|
|
||||||
delete m_coefRCF;
|
|
||||||
|
|
||||||
m_coefRCF = new radio_float_t[m_nrcf];
|
|
||||||
|
|
||||||
// Polyphase matched filter
|
|
||||||
if (RCF_TYPE == RCF_TYPE_LAGRANGE)
|
|
||||||
{
|
|
||||||
m_log.log("Calculating %d-tap SRRC matched Filter",m_nrcf, m_nrcf);
|
|
||||||
|
|
||||||
CalcFirSRRC(m_coefRCF, NUM_BASEBAND_SAMPLES_PER_SYM, (radio_float_t)NUM_BASEBAND_SAMPLES_PER_SYM, RCF_ROLLOFF, m_nrcf);
|
|
||||||
// Calc Raised Cosine Matched Filter
|
|
||||||
if (m_pFirRcf)
|
|
||||||
{
|
|
||||||
FirCpxFree(m_pFirRcf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_pFirRcf = new fir_cpx_t();
|
|
||||||
}
|
|
||||||
FirCpxInit(m_pFirRcf, m_nrcf, 1, 1);
|
|
||||||
|
|
||||||
if (m_pLagrangeInterpolator)
|
|
||||||
{
|
|
||||||
LGCpxIpFree(m_pLagrangeInterpolator);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_pLagrangeInterpolator = new lgip_cpx_t();
|
|
||||||
}
|
|
||||||
LGCpxIpInit(m_pLagrangeInterpolator, LAGRANGE_IP_ORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE)
|
||||||
{
|
{
|
||||||
m_log.log("Calculating %d-tap %d-phase SRRC matched Filter (total %d coefficients)",m_nrcf, RCF_NUM_PHASES, m_nrcf*RCF_NUM_PHASES);
|
m_log.log("Calculating %d-tap %d-phase SRRC matched Filter (total %d coefficients)",nrcf, RCF_NUM_PHASES, nrcf*RCF_NUM_PHASES);
|
||||||
|
m_polyPhase.init(NUM_BASEBAND_SAMPLES_PER_SYM, (radio_float_t)NUM_BASEBAND_SAMPLES_PER_SYM, RCF_ROLLOFF, nrcf, RCF_NUM_PHASES);
|
||||||
if (m_pPolyphaseInterpolator)
|
|
||||||
{
|
|
||||||
PolyPhaseCpxIpFree(m_pPolyphaseInterpolator);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_pPolyphaseInterpolator = new ppip_cpx_t();
|
|
||||||
}
|
|
||||||
PolyPhaseCpxIpInit(m_pPolyphaseInterpolator, NUM_BASEBAND_SAMPLES_PER_SYM, (radio_float_t)NUM_BASEBAND_SAMPLES_PER_SYM, RCF_ROLLOFF, m_nrcf, RCF_NUM_PHASES);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRRC poly-phase matched filter with Lagrange interpolator (Farrow)
|
// SRRC poly-phase matched filter with Lagrange interpolator (Farrow)
|
||||||
@@ -1432,52 +750,24 @@ void Receiver::initFilterRcf()
|
|||||||
|
|
||||||
void Receiver::initFilterArm()
|
void Receiver::initFilterArm()
|
||||||
{
|
{
|
||||||
uint32_t m_down;
|
uint32_t down;
|
||||||
|
|
||||||
m_narm = (uint32_t)(LPF_OVERSAMPLING*m_params.samplerate/m_params.symbolrate)+1;
|
uint32_t narm;
|
||||||
|
RealScalar *coefArm;
|
||||||
|
|
||||||
if (m_stateArm_I)
|
narm = (uint32_t)(LPF_OVERSAMPLING*m_params.samplerate/m_params.symbolrate)+1;
|
||||||
delete m_stateArm_I;
|
coefArm = new RealScalar[narm];
|
||||||
|
|
||||||
if (m_stateArm_Q)
|
|
||||||
delete m_stateArm_Q;
|
|
||||||
|
|
||||||
if (m_coefArm)
|
|
||||||
delete m_coefArm;
|
|
||||||
|
|
||||||
m_stateArm_I = new radio_float_t[m_narm];
|
|
||||||
m_stateArm_Q = new radio_float_t[m_narm];
|
|
||||||
m_coefArm = new radio_float_t[m_narm];
|
|
||||||
|
|
||||||
memset(m_stateArm_I, 0, sizeof (m_narm*sizeof(radio_float_t)));
|
|
||||||
memset(m_stateArm_Q, 0, sizeof (m_narm*sizeof(radio_float_t)));
|
|
||||||
|
|
||||||
if (m_pFirArm)
|
|
||||||
{
|
|
||||||
FirCpxFree(m_pFirArm);
|
|
||||||
delete m_pFirArm;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pFirArm = new fir_cpx_t();
|
|
||||||
FirCpxInit(m_pFirArm, m_narm, 1, (uint32_t)(m_params.samplerate/(2*m_params.symbolrate)));
|
|
||||||
|
|
||||||
if (m_pFirDownArm)
|
|
||||||
{
|
|
||||||
FirCpxMultirateFree(m_pFirDownArm);
|
|
||||||
delete m_pFirDownArm;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pFirDownArm = new fir_cpx_multirate_t();
|
|
||||||
|
|
||||||
// FIR Arm filters
|
// FIR Arm filters
|
||||||
m_log.log("Calculating %d-tap Arm LP-Filter fc = %g Hz",m_narm, NUM_PASSBAND_SAMPLES_PER_SYM*LPF_OMEGA*m_params.symbolrate);
|
m_log.log("Calculating %d-tap Arm LP-Filter fc = %g Hz",narm, NUM_PASSBAND_SAMPLES_PER_SYM*LPF_OMEGA*m_params.symbolrate);
|
||||||
FIRCalcLowpass((radio_float_t)(NUM_PASSBAND_SAMPLES_PER_SYM*LPF_OMEGA*m_params.symbolrate/m_params.samplerate), m_coefArm, m_narm);
|
FIRCalcLowpass((radio_float_t)(NUM_PASSBAND_SAMPLES_PER_SYM*LPF_OMEGA*m_params.symbolrate/m_params.samplerate), coefArm, narm);
|
||||||
// m_log.log("Calculating %d-tap Arm BP-Filter fc = %g Hz, bw=%g Hz",m_narm, m_params.symbolrate, 4*m_params.symbolrate/3);
|
// m_log.log("Calculating %d-tap Arm BP-Filter fc = %g Hz, bw=%g Hz",m_narm, m_params.symbolrate, 4*m_params.symbolrate/3);
|
||||||
// FIRCalcBandpass((radio_float_t)(m_params.symbolrate/m_params.samplerate), 4*(m_params.symbolrate/m_params.samplerate)/3, m_coefArm, m_narm);
|
// FIRCalcBandpass((radio_float_t)(m_params.symbolrate/m_params.samplerate), 4*(m_params.symbolrate/m_params.samplerate)/3, m_coefArm, m_narm);
|
||||||
|
|
||||||
m_down = (uint32_t)(m_params.samplerate/(2*m_params.symbolrate) + 0.5);
|
down = (uint32_t)(m_params.samplerate/(2*m_params.symbolrate) + 0.5);
|
||||||
FirCpxMultirateDownInit(m_pFirDownArm, m_coefArm, m_narm, m_down);
|
m_firArmDown.init(down, coefArm, narm);
|
||||||
|
|
||||||
|
delete [] coefArm;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interface
|
// Interface
|
||||||
|
|||||||
+6
-16
@@ -27,11 +27,10 @@ using namespace Radio;
|
|||||||
#define MODE_PROCESS_BASEBAND 1
|
#define MODE_PROCESS_BASEBAND 1
|
||||||
#define RCF_TYPE_POLYPHASE_DISCRETE 0
|
#define RCF_TYPE_POLYPHASE_DISCRETE 0
|
||||||
#define RCF_TYPE_POLYPHASE_FARROW 1
|
#define RCF_TYPE_POLYPHASE_FARROW 1
|
||||||
#define RCF_TYPE_LAGRANGE 2
|
|
||||||
|
|
||||||
#define EQ_ENABLE 1
|
#define EQ_ENABLE 1
|
||||||
#define MODULATION_TYPE MAP_MODE_QAM
|
#define MODULATION_TYPE MAP_MODE_QAM
|
||||||
#define RCF_TYPE RCF_TYPE_POLYPHASE_FARROW
|
#define RCF_TYPE RCF_TYPE_POLYPHASE_DISCRETE
|
||||||
#define MAX_NUMBITS_PERSYM 16
|
#define MAX_NUMBITS_PERSYM 16
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
enum eq_mode
|
enum eq_mode
|
||||||
@@ -286,6 +285,9 @@ private:
|
|||||||
CriticalSection m_lock;
|
CriticalSection m_lock;
|
||||||
cpx_t *m_pPassbandBuffer;
|
cpx_t *m_pPassbandBuffer;
|
||||||
cpx_t *m_pBasebandBuffer;
|
cpx_t *m_pBasebandBuffer;
|
||||||
|
CVec m_passbandBuffer;
|
||||||
|
CVec m_basebandBuffer;
|
||||||
|
|
||||||
sym_err_t *m_pSymbolBuffer;
|
sym_err_t *m_pSymbolBuffer;
|
||||||
uint32_t m_numSymsInBuffer;
|
uint32_t m_numSymsInBuffer;
|
||||||
uint32_t m_bufsize;
|
uint32_t m_bufsize;
|
||||||
@@ -296,21 +298,10 @@ private:
|
|||||||
cpx_t m_trackers[4];
|
cpx_t m_trackers[4];
|
||||||
|
|
||||||
// Filter
|
// Filter
|
||||||
uint32_t m_narm;
|
Interpolation::DownSampler m_firArmDown;
|
||||||
uint32_t m_nrcf;
|
|
||||||
radio_float_t *m_stateArm_I;
|
|
||||||
radio_float_t *m_stateArm_Q;
|
|
||||||
radio_float_t *m_coefArm;
|
|
||||||
radio_float_t *m_coefRCF;
|
|
||||||
|
|
||||||
fir_cpx_t *m_pFirArm;
|
|
||||||
fir_cpx_multirate_t *m_pFirDownArm;
|
|
||||||
|
|
||||||
fir_cpx_t *m_pFirRcf;
|
|
||||||
|
|
||||||
// Interpolators
|
// Interpolators
|
||||||
ppip_cpx_t *m_pPolyphaseInterpolator;
|
Interpolation::PolyPhase m_polyPhase;
|
||||||
lgip_cpx_t *m_pLagrangeInterpolator;
|
|
||||||
Interpolation::Farrow m_farrow;
|
Interpolation::Farrow m_farrow;
|
||||||
|
|
||||||
// NCOs
|
// NCOs
|
||||||
@@ -340,7 +331,6 @@ private:
|
|||||||
// Blind EQ
|
// Blind EQ
|
||||||
Equalizer::Cma m_cma2;
|
Equalizer::Cma m_cma2;
|
||||||
|
|
||||||
|
|
||||||
// Symbol demapper
|
// Symbol demapper
|
||||||
sym_map_t *m_pSymMapper;
|
sym_map_t *m_pSymMapper;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user