⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 operate.h

📁 GSM6.10 算法优化及详细注释 本代码较原GSM6.10代码更容易理解 仅供学习
💻 H
字号:
#include	<assert.h>
#include	<string.h>

#define int long
#define SASR

typedef short                  word;           /* 16 bit signed int    */
typedef int                     longword;       /* 32 bit signed int    */

typedef unsigned short          uword;          /* unsigned word        */
typedef unsigned int            ulongword;      /* unsigned longword    */

#define MIN_WORD        (-32768)
#define MAX_WORD        ( 32767)

#define MIN_LONGWORD    ((-2147483647)-1)
#define MAX_LONGWORD    ( 2147483647)

#ifdef  SASR            /* >> is a signed arithmetic shift right */
#undef  SASR
#define SASR(x, by)     ((x) >> (by))
#endif  /* SASR */


struct gsm610_state {
        word            dp0[ 280 ];		/*LTP分析时储存前面3个子序列的估计值*/

        word            pre_so;         /* Offset_com. 上一个缩减的数据SO(k-1)*/
        longword        l_pre_sof;      /* Offset_com. 存储Sof(k-1)*2^15*/
        int             pre_sof;        /* Preemphasis 存储Sof(k-1)*/

        word            u[8];           /* short_term_aly_filter.c 短期过滤分析保存上组u[0..7]*/
        word            LARpp[8];       /* 存放上一帧LPC相关系数LARpp[0..7]       */

        word            nrp;	    	/* long_term.c, synthesis 保存上一个滞后值 初始化为40      */
        word            v[9];           /* short_term.c, synthesis 短期过滤合成保存上组v[0..8]     */
        word            pre_s_out;       /* decoder.c,   Postprocessing  上一个解码完成输出采样值*/

};

/*对应各运算表格参数*/
extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];
extern word gsm_INVA[8];
extern word gsm_DLB[4], gsm_QLB[4];
extern word gsm_H[11];
extern word gsm_NRFAC[8];
extern word gsm_FAC[8];

/*
 *      Prototypes from operate.c
 */
extern word     gsm_mult        (word a, word b);
extern longword gsm_L_mult      (word a, word b);
extern word     gsm_mult_r      (word a, word b);

extern word     gsm_div         (word num, word denum);

extern word     gsm_add         ( word a, word b );
extern longword gsm_L_add       ( longword a, longword b );

extern word     gsm_sub         (word a, word b);
extern longword gsm_L_sub       (longword a, longword b);

extern word     gsm_abs         (word a);

extern word     gsm_norm        ( longword a );

extern longword gsm_L_asl       (longword a, int n);
extern word     gsm_asl         (word a, int n);

extern longword gsm_L_asr       (longword a, int n);
extern word     gsm_asr         (word a, int n);


#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */    \
        ((word) (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )))

# define GSM_MULT(a,b)   /* word a, word b, !(a == b == MIN_WORD) */    \
        (SASR( ((longword)(a) * (longword)(b)), 15 ))

# define GSM_L_MULT(a, b) /* word a, word b */  \
        (((longword)(a) * (longword)(b)) << 1)

# define GSM_L_ADD(a, b)        \
        ( (a) <  0 ? ( (b) >= 0 ? (a) + (b)     \
                 : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \
                   >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 )   \
        : ((b) <= 0 ? (a) + (b)   \
                  : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \
                    ? MAX_LONGWORD : utmp))

#define GSM_ADD(a, b)  \
        ((unsigned int)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \
                MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)


#define GSM_SUB(a, b)  \
        ((unsigned int)((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \
        ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp))

#define GSM_ABS(a)     ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -