- 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:
2014-12-21 11:09:47 +00:00
parent 91552cffe9
commit 3546b6bd3a
5 changed files with 49 additions and 770 deletions
+5 -5
View File
@@ -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)
+3 -3
View File
@@ -35,14 +35,14 @@
</MAINGROUP>
<EXPORTFORMATS>
<LINUX_MAKE targetFolder="Builds/Linux" externalLibraries="radio&#10;fir&#10;crc&#10;"
extraDefs="" extraCompilerFlags="-std=c++11&#10;-pg">
extraDefs="" extraCompilerFlags="-std=c++11&#10;-msse2&#10;">
<CONFIGURATIONS>
<CONFIGURATION name="Debug" libraryPath="/usr/X11R6/lib/&#10;../../../../libsrc/build/linux&#10;../../../../libsrc/build/linux&#10;../../../../libsrc/build/linux"
isDebug="1" optimisation="1" targetName="M-PSK Receiver" headerPath="../../../../libsrc&#10;../../../../libsrc/cpp&#10;../../Source&#10;/usr/local/include/eigen3"
defines="radio_float_t=float&#10;fir_float_t=float"/>
<CONFIGURATION name="Release" libraryPath="/usr/X11R6/lib/&#10;../../../../libsrc/build/linux&#10;../../../../libsrc/build/linux&#10;../../../../libsrc/build/linux"
isDebug="1" optimisation="3" targetName="M-PSK Receiver" headerPath="../../../../libsrc&#10;../../../../libsrc/cpp&#10;../../Source&#10;/usr/local/include/eigen3"
defines="radio_float_t=float&#10;fir_float_t=float"/>
isDebug="0" optimisation="3" targetName="M-PSK Receiver" headerPath="../../../../libsrc&#10;../../../../libsrc/cpp&#10;../../Source&#10;/usr/local/include/eigen3"
defines="radio_float_t=float&#10;fir_float_t=float&#10;NDEBUG&#10;"/>
</CONFIGURATIONS>
<MODULEPATHS>
<MODULEPATH id="juce_audio_basics" path="/home/jens/JUCE/modules"/>
-1
View File
@@ -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);
+34 -744
View File
@@ -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::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");
@@ -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
+7 -17
View File
@@ -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;