You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.4 KiB
156 lines
4.4 KiB
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Digital Voice Modem - MBE Vocoder
|
|
* GPLv2 Open Source. Use is subject to license terms.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright (C) 2019-2021 Doug McLain
|
|
* Copyright (C) 2021 Bryan Biedenkapp, N2PLL
|
|
*
|
|
*/
|
|
/**
|
|
* @file MBEDecoder.h
|
|
* @ingroup vocoder
|
|
* @file MBEDecoder.cpp
|
|
* @ingroup vocoder
|
|
*/
|
|
#if !defined(__MBE_DECODER_H__)
|
|
#define __MBE_DECODER_H__
|
|
|
|
extern "C" {
|
|
#include "mbe.h"
|
|
}
|
|
|
|
#include "Defines.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <queue>
|
|
|
|
namespace vocoder
|
|
{
|
|
// ---------------------------------------------------------------------------
|
|
// Structure Declaration
|
|
// ---------------------------------------------------------------------------
|
|
|
|
struct mbelibParms
|
|
{
|
|
mbe_parms* m_cur_mp;
|
|
mbe_parms* m_prev_mp;
|
|
mbe_parms* m_prev_mp_enhanced;
|
|
|
|
/// <summary></summary>
|
|
mbelibParms()
|
|
{
|
|
m_cur_mp = (mbe_parms*)malloc(sizeof(mbe_parms));
|
|
m_prev_mp = (mbe_parms*)malloc(sizeof(mbe_parms));
|
|
m_prev_mp_enhanced = (mbe_parms*)malloc(sizeof(mbe_parms));
|
|
}
|
|
|
|
/// <summary></summary>
|
|
~mbelibParms()
|
|
{
|
|
free(m_prev_mp_enhanced);
|
|
free(m_prev_mp);
|
|
free(m_cur_mp);
|
|
}
|
|
};
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Constants
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @brief Vocoder Decoding Mode
|
|
*/
|
|
enum MBE_DECODER_MODE : int {
|
|
DECODE_DMR_AMBE = 0, //! DMR AMBE
|
|
DECODE_88BIT_IMBE = 1 //! 88-bit IMBE (P25)
|
|
};
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Class Declaration
|
|
// ---------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @brief Implements MBE audio decoding.
|
|
*/
|
|
class HOST_SW_API MBEDecoder
|
|
{
|
|
public:
|
|
/**
|
|
* @brief Initializes a new instance of the MBEDecoder class.
|
|
* @param mode Decoder mode.
|
|
*/
|
|
MBEDecoder(MBE_DECODER_MODE mode);
|
|
/**
|
|
* @brief Finalizes a instance of the MBEDecoder class.
|
|
*/
|
|
~MBEDecoder();
|
|
|
|
/**
|
|
* @brief Decodes the given MBE codewords to deinterleaved MBE bits using the decoder mode.
|
|
* @param[in] codeword MBE codeword.
|
|
* @param[out] mbeBits
|
|
* @returns int32_t
|
|
*/
|
|
int32_t decodeBits(uint8_t* codeword, char* mbeBits);
|
|
|
|
/**
|
|
* @brief Decodes the given MBE codewords to PCM samples using the decoder mode.
|
|
* @param[in] codeword MBE codeword.
|
|
* @param[out] samples PCM Samples (in float format).
|
|
* @returns int32_t
|
|
*/
|
|
int32_t decodeF(uint8_t* codeword, float samples[]);
|
|
/**
|
|
* @brief Decodes the given MBE codewords to PCM samples using the decoder mode.
|
|
* @param[in] codeword MBE codeword.
|
|
* @param[out] samples PCM Samples (in short format).
|
|
* @returns int32_t
|
|
*/
|
|
int32_t decode(uint8_t* codeword, int16_t samples[]);
|
|
|
|
private:
|
|
mbelibParms* m_mbelibParms;
|
|
|
|
MBE_DECODER_MODE m_mbeMode;
|
|
|
|
static const int dW[72];
|
|
static const int dX[72];
|
|
static const int rW[36];
|
|
static const int rX[36];
|
|
static const int rY[36];
|
|
static const int rZ[36];
|
|
|
|
float gainMaxBuf[200];
|
|
float* gainMaxBufPtr;
|
|
int gainMaxIdx;
|
|
|
|
public:
|
|
/**
|
|
* @brief Gain adjustment.
|
|
*/
|
|
__PROPERTY(float, gainAdjust, GainAdjust);
|
|
/**
|
|
* @brief Flag indicating automatic gain adjustment is enabled.
|
|
*/
|
|
__PROPERTY(bool, autoGain, AutoGain);
|
|
};
|
|
|
|
// Extern methods for C#/C++ interop
|
|
extern "C" {
|
|
#ifdef _WIN32
|
|
extern __declspec(dllexport) MBEDecoder* MBEDecoder_Create(MBE_DECODER_MODE mode);
|
|
extern __declspec(dllexport) int32_t MBEDecoder_Decode(MBEDecoder* pDecoder, uint8_t* codeword, int16_t* samples);
|
|
extern __declspec(dllexport) void MBEDecoder_Delete(MBEDecoder* pDecoder);
|
|
#else
|
|
extern MBEDecoder* MBEDecoder_Create(MBE_DECODER_MODE mode);
|
|
extern int32_t MBEDecoder_Decode(MBEDecoder* pDecoder, uint8_t* codeword, int16_t* samples);
|
|
extern void MBEDecoder_Delete(MBEDecoder* pDecoder);
|
|
#endif
|
|
}
|
|
|
|
} // namespace vocoder
|
|
|
|
#endif // __MBE_DECODER_H__
|