From 7d9d53c4f0d4ded41db0ce9752f1be1a302396e9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 5 Mar 2019 03:36:04 +0100 Subject: [PATCH] libfreedv: do not taek comp_prim.h from Codec2 library --- libfreedv/CMakeLists.txt | 1 + libfreedv/cohpsk.cpp | 2 +- libfreedv/comp_prim.h | 149 +++++++++++++++++++++++++++++++++++++++ libfreedv/fdmdv.cpp | 2 +- libfreedv/freedv_api.cpp | 2 +- libfreedv/fsk.cpp | 2 +- libfreedv/linreg.cpp | 2 +- 7 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 libfreedv/comp_prim.h diff --git a/libfreedv/CMakeLists.txt b/libfreedv/CMakeLists.txt index f32460e4e..42029a406 100644 --- a/libfreedv/CMakeLists.txt +++ b/libfreedv/CMakeLists.txt @@ -26,6 +26,7 @@ set(freedv_HEADERS codec2_ofdm.h cohpsk_defs.h cohpsk_internal.h + comp_prim.h defines.h fdmdv_internal.h fdv_arm_math.h diff --git a/libfreedv/cohpsk.cpp b/libfreedv/cohpsk.cpp index 1db247335..5b304dd6b 100644 --- a/libfreedv/cohpsk.cpp +++ b/libfreedv/cohpsk.cpp @@ -42,7 +42,7 @@ #include "cohpsk_internal.h" #include "fdmdv_internal.h" #include "pilots_coh.h" -#include "codec2/comp_prim.h" +#include "comp_prim.h" #include "kiss_fft.h" #include "linreg.h" #include "rn_coh.h" diff --git a/libfreedv/comp_prim.h b/libfreedv/comp_prim.h new file mode 100644 index 000000000..b8477768a --- /dev/null +++ b/libfreedv/comp_prim.h @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: comp_prim.h + AUTHOR......: David Rowe + DATE CREATED: Marh 2015 + + Complex number maths primitives. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __COMP_PRIM__ +#define __COMP_PRIM__ + +#include +#include "codec2/comp.h" + +namespace FreeDV +{ + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +inline static COMP cneg(COMP a) +{ + COMP res; + + res.real = -a.real; + res.imag = -a.imag; + + return res; +} + +inline static COMP cconj(COMP a) +{ + COMP res; + + res.real = a.real; + res.imag = -a.imag; + + return res; +} + +inline static COMP cmult(COMP a, COMP b) +{ + COMP res; + + res.real = a.real*b.real - a.imag*b.imag; + res.imag = a.real*b.imag + a.imag*b.real; + + return res; +} + +inline static COMP fcmult(float a, COMP b) +{ + COMP res; + + res.real = a*b.real; + res.imag = a*b.imag; + + return res; +} + +inline static COMP cadd(COMP a, COMP b) +{ + COMP res; + + res.real = a.real + b.real; + res.imag = a.imag + b.imag; + + return res; +} + +inline static float cabsolute(COMP a) +{ + return sqrt(pow(a.real, 2.0) + pow(a.imag, 2.0)); +} + +/* + * Euler's formula in a new convenient function + */ +inline static COMP comp_exp_j(float phi){ + COMP res; + res.real = cosf(phi); + res.imag = sinf(phi); + return res; +} + +/* + * Quick and easy complex 0 + */ +inline static COMP comp0(){ + COMP res; + res.real = 0; + res.imag = 0; + return res; +} + +/* + * Quick and easy complex subtract + */ +inline static COMP csub(COMP a, COMP b){ + COMP res; + res.real = a.real-b.real; + res.imag = a.imag-b.imag; + return res; +} + +/* + * Compare the magnitude of a and b. if |a|>|b|, return true, otw false. + * This needs no square roots + */ +inline static int comp_mag_gt(COMP a,COMP b){ + return ((a.real*a.real)+(a.imag*a.imag)) > ((b.real*b.real)+(b.imag*b.imag)); +} + +/* + * Normalize a complex number's magnitude to 1 + */ +inline static COMP comp_normalize(COMP a){ + COMP b; + float av = cabsolute(a); + b.real = a.real/av; + b.imag = a.imag/av; + return b; +} + +} // FreeDV + +#endif diff --git a/libfreedv/fdmdv.cpp b/libfreedv/fdmdv.cpp index 1efa2ef49..c8094b3d7 100644 --- a/libfreedv/fdmdv.cpp +++ b/libfreedv/fdmdv.cpp @@ -41,7 +41,7 @@ #include "fdmdv_internal.h" #include "codec2_fdmdv.h" -#include "codec2/comp_prim.h" +#include "comp_prim.h" #include "rn.h" #include "rxdec_coeff.h" #include "test_bits.h" diff --git a/libfreedv/freedv_api.cpp b/libfreedv/freedv_api.cpp index b856008bd..2f1d7865c 100644 --- a/libfreedv/freedv_api.cpp +++ b/libfreedv/freedv_api.cpp @@ -54,7 +54,7 @@ #include "libfreedv.h" #include "freedv_api_internal.h" #include "freedv_vhf_framing.h" -#include "codec2/comp_prim.h" +#include "comp_prim.h" #include "freedv_filter.h" #include "codec2_ofdm.h" diff --git a/libfreedv/fsk.cpp b/libfreedv/fsk.cpp index 043d55961..7372c885d 100644 --- a/libfreedv/fsk.cpp +++ b/libfreedv/fsk.cpp @@ -70,7 +70,7 @@ #include #include "fsk.h" -#include "codec2/comp_prim.h" +#include "comp_prim.h" #include "kiss_fftr.h" #include "modem_probe.h" diff --git a/libfreedv/linreg.cpp b/libfreedv/linreg.cpp index 479b38c45..c4fe96f66 100644 --- a/libfreedv/linreg.cpp +++ b/libfreedv/linreg.cpp @@ -39,7 +39,7 @@ #include #include "linreg.h" -#include "codec2/comp_prim.h" +#include "comp_prim.h" namespace FreeDV {