From ef467c41aaa4b611b648c20b018bd880234e79e6 Mon Sep 17 00:00:00 2001 From: Ed Gonzalez Date: Tue, 2 Jun 2015 14:51:33 -0500 Subject: [PATCH] Begin porting FIR Filter for GMSK Modem --- DSP_API/ThumbDV/gmsk_modem.c | 82 +++++++++++++++++++++++++++++++++++- DSP_API/ThumbDV/gmsk_modem.h | 19 +++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/DSP_API/ThumbDV/gmsk_modem.c b/DSP_API/ThumbDV/gmsk_modem.c index 9060955..e3ce527 100644 --- a/DSP_API/ThumbDV/gmsk_modem.c +++ b/DSP_API/ThumbDV/gmsk_modem.c @@ -24,11 +24,16 @@ * * ************************************************************************** */ -/* Demod Section */ +#include +#include +#include + #include "DStarDefines.h" #include "gmsk_modem.h" #include "common.h" +/* Demod Section */ + const float DEMOD_COEFFS_TABLE[] = { /* 2400 Hz */ -0.000153959924563F, 0.000000000000000F, 0.000167227768379F, 0.000341615513437F, @@ -152,3 +157,78 @@ uint32 gmsk_encode(GMSK_MOD mod, BOOL bit, float * buffer, unsigned int length) } /* Init */ + +FIR_FILTER gmsk_createFilter(const float * taps, uint32 length) +{ + FIR_FILTER filter = (FIR_FILTER) safe_malloc(sizeof(fir_filter)); + + filter->length = length; + filter->buf_len = 20 * length; + filter->taps = (float *) safe_malloc(length * sizeof(float)); + memcpy(filter->taps, taps, length * sizeof(float)); + + filter->buffer = (float *) safe_malloc(filter->buf_len * sizeof(float)); + filter->pointer = length; + + return filter; +} + +void gmsk_destroyFilter(FIR_FILTER filter) +{ + if ( filter == NULL ) { + output(ANSI_RED "NULL FIlter object\n"ANSI_WHITE ) ; + return; + } + + safe_free(filter->taps); + safe_free(filter->buffer); + safe_free(filter); + +} + +GMSK_DEMOD gmsk_createDemodulator(void) +{ + GMSK_DEMOD demod = (GMSK_DEMOD) safe_malloc(sizeof(gmsk_demod)); + demod->m_pll = 0; + demod->m_prev = FALSE; + demod->m_invert = FALSE; + + demod->filter = gmsk_createFilter(DEMOD_COEFFS_TABLE, DEMOD_COEFFS_LENGTH); + + return demod; +} + +GMSK_MOD gmsk_createModulator(void) +{ + GMSK_MOD mod = (GMSK_MOD) safe_malloc(sizeof(gmsk_mod)); + mod->m_invert = FALSE; + + mod->filter = gmsk_createFilter(MOD_COEFFS_TABLE, MOD_COEFFS_LENGTH); + + return mod; +} + +void gmsk_destroyDemodulator(GMSK_DEMOD demod ) +{ + if ( demod == NULL ) { + output(ANSI_RED "NULL GMSK_DEMOD\n" ANSI_WHITE); + return; + } + + gmsk_destroyFilter(demod->filter); + safe_free(demod); +} + +void gmsk_destroyModulator(GMSK_MOD mod ) +{ + + if ( mod == NULL ) { + output(ANSI_RED "NULL GMSK_MOD\n" ANSI_WHITE); + return; + } + + gmsk_destroyFilter(mod->filter); + safe_free(mod); + +} + diff --git a/DSP_API/ThumbDV/gmsk_modem.h b/DSP_API/ThumbDV/gmsk_modem.h index 665d569..96d4484 100644 --- a/DSP_API/ThumbDV/gmsk_modem.h +++ b/DSP_API/ThumbDV/gmsk_modem.h @@ -33,22 +33,41 @@ enum DEMOD_STATE { DEMOD_UNKNOWN }; +typedef struct _fir_filter +{ + float * taps; + uint32 length; + float * buffer; + uint32 buf_len; + uint32 pointer; +}fir_filter, * FIR_FILTER ; + /* Used to hold state information for a GMSK Demodulator object */ typedef struct _gmsk_demod { uint32 m_pll; BOOL m_prev; BOOL m_invert; + + FIR_FILTER filter; } gmsk_demod, * GMSK_DEMOD; typedef struct _gmsk_mod { BOOL m_invert; + + FIR_FILTER filter; } gmsk_mod, * GMSK_MOD; + uint32 gmsk_encode(GMSK_MOD mod, BOOL bit, float * buffer, unsigned int length); enum DEMOD_STATE gmsk_decode(GMSK_DEMOD demod, float val); void gmskDemod_reset(GMSK_DEMOD demod ); +GMSK_MOD gmsk_createModulator(void); +GMSK_DEMOD gmsk_createDemodulator(void); +void gmsk_destroyModulator(GMSK_MOD mod ); +void gmsk_destroyDemodulator(GMSK_DEMOD demod ); + #endif /* THUMBDV_GMSK_MODEM_H_ */