aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/sigProcLib.cpp
diff options
context:
space:
mode:
authorThomas Tsou <tom@tsou.cc>2013-11-09 02:29:55 -0500
committerThomas Tsou <tom@tsou.cc>2013-11-15 23:34:59 -0500
commit0a3dc4c21028f36f02528c9a486de229f786b272 (patch)
tree86770439e6accc183d3f04c9e3f46f7e5b4d866c /Transceiver52M/sigProcLib.cpp
parentacc22fa3ffe30f28d62c41f62152b1f48fa595b4 (diff)
Transceiver52M: Add NEON complex-complex multiply
Complex-complex block multiples are used for phase rotation of bursts. Optimization targeted from perf profiling. Signed-off-by: Thomas Tsou <tom@tsou.cc>
Diffstat (limited to 'Transceiver52M/sigProcLib.cpp')
-rw-r--r--Transceiver52M/sigProcLib.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp
index 5a1ab77..ab421b6 100644
--- a/Transceiver52M/sigProcLib.cpp
+++ b/Transceiver52M/sigProcLib.cpp
@@ -32,6 +32,7 @@
extern "C" {
#include "convolve.h"
#include "scale.h"
+#include "mult.h"
}
using namespace GSM;
@@ -287,6 +288,26 @@ void initGMSKRotationTables(int sps)
static void GMSKRotate(signalVector &x, int sps)
{
+#if HAVE_NEON
+ size_t len;
+ signalVector *a, *b, *out;
+
+ a = &x;
+ out = &x;
+ len = out->size();
+
+ if (len == 157)
+ len--;
+
+ if (sps == 1)
+ b = GMSKRotation1;
+ else
+ b = GMSKRotationN;
+
+ mul_complex((float *) out->begin(),
+ (float *) a->begin(),
+ (float *) b->begin(), len);
+#else
signalVector::iterator rotPtr, xPtr = x.begin();
if (sps == 1)
@@ -306,6 +327,7 @@ static void GMSKRotate(signalVector &x, int sps)
xPtr++;
}
}
+#endif
}
static void GMSKReverseRotate(signalVector &x, int sps)