From 3546b6bd3a83ceabf26561e0d81c59e719886447 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 21 Dec 2014 11:09:47 +0000 Subject: [PATCH] - 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 --- Builds/Linux/Makefile | 10 +- M-PSK Receiver.jucer | 6 +- Source/MainComponent.cpp | 1 - Source/Receiver.cpp | 778 ++------------------------------------- Source/Receiver.h | 24 +- 5 files changed, 49 insertions(+), 770 deletions(-) diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index 2b528a4..6d81263 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -19,7 +19,7 @@ ifeq ($(CONFIG),Debug) 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 - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 -std=c++11 -pg + CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 -std=c++11 -msse2 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 LDDEPS := @@ -39,12 +39,12 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := -march=native 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 - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O3 -std=c++11 -pg + 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) -O3 -std=c++11 -msse2 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 := - 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 BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) diff --git a/M-PSK Receiver.jucer b/M-PSK Receiver.jucer index 37898ec..3bbeefb 100644 --- a/M-PSK Receiver.jucer +++ b/M-PSK Receiver.jucer @@ -35,14 +35,14 @@ + extraDefs="" extraCompilerFlags="-std=c++11 -msse2 "> + 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 NDEBUG "/> diff --git a/Source/MainComponent.cpp b/Source/MainComponent.cpp index 8e53c75..74486cf 100644 --- a/Source/MainComponent.cpp +++ b/Source/MainComponent.cpp @@ -55,7 +55,6 @@ MainComponent::MainComponent () //[Constructor] You can add your own custom stuff here.. m_samplerate = 48000; -// m_pTransmitter = new Transmitter(); m_pTransmitterControl = m_pTransmitter; m_TextEditor->setMultiLine (true); diff --git a/Source/Receiver.cpp b/Source/Receiver.cpp index a1ae816..6455af1 100644 --- a/Source/Receiver.cpp +++ b/Source/Receiver.cpp @@ -10,12 +10,11 @@ #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 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 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_LAG_AQU = (radio_float_t)0.4E-6; // 1E-6 @@ -49,18 +48,8 @@ Receiver::Receiver(LogHandler *pLogHandler) , m_ReceiverEnable(false) , m_pDataListener(0) , m_frameReceiver(this) - , m_pFirArm(0) - , m_pFirDownArm(0) - , m_pFirRcf(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.samplerate = 192000; m_params.symbolrate = m_params.samplerate/4; @@ -94,6 +83,9 @@ void Receiver::setBufSize(uint32 size) if (m_bufsize != size) { + m_passbandBuffer.resize(size); + m_basebandBuffer.resize(size); + if (m_pPassbandBuffer) delete m_pPassbandBuffer; @@ -263,569 +255,6 @@ void Receiver::init() // -------------------------------------- // 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::vectordata(100); - std::vectorminValues; - std::vectormaxValues; - - 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 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 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 -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 -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* 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 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* 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* 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* -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* -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 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 -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 -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* 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* -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* -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"); @@ -839,61 +268,6 @@ void Receiver::free() 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_cpr); @@ -1018,10 +392,19 @@ void Receiver::processPassband(float *pRF, uint32_t len) // Digital Down Converter // @samplerate 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 -// len_down = FirCpxProcessReal(m_pFirArm, m_coefArm, m_pPassbandBuffer, m_pBasebandBuffer, len); - len_down = FirCpxDownProcess(m_pFirDownArm, m_pPassbandBuffer, m_pBasebandBuffer, len); + len_down = m_firArmDown.process(m_basebandBuffer, m_passbandBuffer, 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); } @@ -1082,7 +465,8 @@ void Receiver::processBaseband(cpx_t *pIF, uint32_t len) if (RCF_TYPE == RCF_TYPE_POLYPHASE_DISCRETE) { // 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) @@ -1102,7 +486,9 @@ void Receiver::processBaseband(cpx_t *pIF, uint32_t len) 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) @@ -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() { NCO_Init(&m_nco_ddc, m_params.ddc_freq/m_params.samplerate, 0); @@ -1370,54 +730,12 @@ void Receiver::initSymbolMapper() 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) { - m_log.log("Calculating %d-tap %d-phase SRRC matched Filter (total %d coefficients)",m_nrcf, RCF_NUM_PHASES, m_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); + 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); } // SRRC poly-phase matched filter with Lagrange interpolator (Farrow) @@ -1432,52 +750,24 @@ void Receiver::initFilterRcf() void Receiver::initFilterArm() { - uint32_t m_down; + uint32_t down; - m_narm = (uint32_t)(LPF_OVERSAMPLING*m_params.samplerate/m_params.symbolrate)+1; - - if (m_stateArm_I) - delete m_stateArm_I; - - 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(); + uint32_t narm; + RealScalar *coefArm; + narm = (uint32_t)(LPF_OVERSAMPLING*m_params.samplerate/m_params.symbolrate)+1; + coefArm = new RealScalar[narm]; + // 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); - FIRCalcLowpass((radio_float_t)(NUM_PASSBAND_SAMPLES_PER_SYM*LPF_OMEGA*m_params.symbolrate/m_params.samplerate), m_coefArm, m_narm); + 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), 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); // 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); - FirCpxMultirateDownInit(m_pFirDownArm, m_coefArm, m_narm, m_down); + down = (uint32_t)(m_params.samplerate/(2*m_params.symbolrate) + 0.5); + m_firArmDown.init(down, coefArm, narm); + delete [] coefArm; } // Interface diff --git a/Source/Receiver.h b/Source/Receiver.h index 7f2df3f..f2768e2 100644 --- a/Source/Receiver.h +++ b/Source/Receiver.h @@ -27,11 +27,10 @@ using namespace Radio; #define MODE_PROCESS_BASEBAND 1 #define RCF_TYPE_POLYPHASE_DISCRETE 0 #define RCF_TYPE_POLYPHASE_FARROW 1 -#define RCF_TYPE_LAGRANGE 2 #define EQ_ENABLE 1 #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 // --------------------------------------------------- enum eq_mode @@ -286,6 +285,9 @@ private: CriticalSection m_lock; cpx_t *m_pPassbandBuffer; cpx_t *m_pBasebandBuffer; + CVec m_passbandBuffer; + CVec m_basebandBuffer; + sym_err_t *m_pSymbolBuffer; uint32_t m_numSymsInBuffer; uint32_t m_bufsize; @@ -294,23 +296,12 @@ private: pfd_t m_pfdCpr; cpx_t m_trackers_[4]; cpx_t m_trackers[4]; - + // Filter - uint32_t m_narm; - 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; + Interpolation::DownSampler m_firArmDown; // Interpolators - ppip_cpx_t *m_pPolyphaseInterpolator; - lgip_cpx_t *m_pLagrangeInterpolator; + Interpolation::PolyPhase m_polyPhase; Interpolation::Farrow m_farrow; // NCOs @@ -340,7 +331,6 @@ private: // Blind EQ Equalizer::Cma m_cma2; - // Symbol demapper sym_map_t *m_pSymMapper;