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

📄 bits.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
字号:
#define        stream_port   0x201
#define        speech_port   0x200

/****************************************************************************
* bit stream manipulation routines                                          *
* The transmitted parameters are:									  	    *
*     LPC:     1st codebook           7+1 bit								*
*              2nd codebook           5+5 bit								*
*     1st subframe:															*
*          pitch period                 8 bit								*	
*          parity check on 1st period   1 bit								*	
*          codebook index1 (positions) 13 bit							    *		 
*          codebook index2 (signs)      4 bit								*
*          pitch and codebook gains   4+3 bit								*	
*     2nd subframe:															*
*          pitch period (relative)      5 bit								*
*          codebook index1 (positions) 13 bit								*	
*          codebook index2 (signs)      4 bit								*
*          pitch and codebook gains   4+3 bit								*
* $$01/10/2000 checked stream module data variables and function            *
* $$01/11/2000 modify pointer and varaibles to adapt table change           *
* $$01/16/2001 modified and printed,Author: Jason.wang (zhigang wang)       *
* $$01/16/2001 Email: wzg119@yeah.net,  BP: 86+02195950-161452              *
* $$01/16/2001 This modlue is not optimized! should be test on Emulator     *
*****************************************************************************/
.MODULE/SEG=App_PM        FrameBits;

/****************************************************************************/
#include       "ld8a.inc"
#include	   "vad.inc"
#include	   "dtx.inc"
#include	   "octet.inc"
#include	   "tab_dtx.inc"
#include	   "tab_ld8a.inc"

/****************************************************************************/
.EXTERNAL      Encode_FrameID,Encode_nbwords;
.EXTERNAL      Decode_FrameID,put_position;
.EXTERNAL      DecodeParm,InputSerial,OutSerial;
.EXTERNAL      Check_Parity_Pitch;

/*****************************************************************************
* prm2bits_ld8a -converts encoder parameter vector into vector of serial bits*
* $$01/10/2000 only used in encoder                                          *
* $$01/11/2000 modify pointer and varaibles to adapt table change            *
* Calling Parameters												         *
*         I1  : encoded parameters  (PRM_SIZE parameters)                    *
* Return Values														         *
*         I0  : serial bits (SERIAL_SIZE ) bits[0] = bfi bits[1] = 80        *
* Altered Registers: SR,AR,AF,AX0,I0,I1,I3,I4                                *
* Computation Time : 18 cycles		      							         *
******************************************************************************/
.ENTRY         prm2bits_ld8a;

prm2bits_ld8a: AR=DM(Encode_FrameID);
               SR=LSHIFT AR BY 2(LO);
			   AR=DM(I1,M1);
			   AR=PASS AR;
			   IF NE JUMP case_1;
               AR=SR0 OR RATE_0;
			   DM(Encode_FrameID)=AR;
			   RTS;
case_1:        AR=AR-1;
               IF NE JUMP case_2;
    		   AR=SR0 OR RATE_8000;
			   DM(Encode_FrameID)=AR;
			   AX0=DM(Encode_nbwords);
			   AR=AX0+5;
			   DM(Encode_nbwords)=AR;
               AR=DM(I1,M1);
			   SR=LSHIFT AR BY 8(HI);          {8 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -2(HI);   {8 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT AR BY 14(HI);         {2 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 6(HI);    {8 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 5(HI);    {1 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -8(HI);   {5 bits}
			   DM(I0,M1)=SR1;
               SR=LSHIFT AR BY 8(HI);          {8 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 4(HI);    {4 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -3(HI);   {4 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT AR BY 13(HI);         {3 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 8(HI);    {5 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -5(HI);   {8 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT AR BY 11(HI);         {5 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 7(HI);    {4 bits}
			   AX0=DM(I1,M1); 
			   AY0=H#007F; 
			   AF=AX0 AND AY0;                 {7 bits}
			   AR=SR1 OR AF;
			   DM(I0,M1)=AR;
			   RTS;
case_2:        AR=AR-1;
               IF NE RTS;
			   AR=SR0 OR RATE_SID;
               DM(Encode_FrameID)=AR;
			   AX0=DM(Encode_nbwords);
			   AR=AX0+1;
			   DM(Encode_nbwords)=AR;
               AR=DM(I1,M1);
			   SR=LSHIFT AR BY 15(HI);        {1 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 10(HI);  {5 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY 6(HI);   {4 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR By 1(HI);   {5 bits}
			   DM(I0,M1)=SR1;
	           RTS;
/*****************************************************************************
* bits2prm_ld8a - converts serial received bits to  encoder parameter vector *
* Calling Parameters												         *
* $$01/10/2000 only used in decoder                                          *
* $$01/11/2000 modify pointer and varaibles to adapt table change            *
*         I1  : serial bits (80)                                             *
* Return Values														         *
*         I0  : decoded parameters (11 parameters)                           *
* Altered Registers: SR,SE,AR,AF,AX0,AY0,I0,I1,I4                            *
* Computation Time : 18 cycles										         *
******************************************************************************/
.ENTRY         bits2prm_ld8a;

bits2prm_ld8a: AR=DM(Decode_FrameID); 
               SR=LSHIFT AR BY 2(LO);
			   DM(Decode_FrameID)=SR0;
			   SR=LSHIFT AR BY -14(LO);
               DM(I0,M1)=0;
               AF=SR0-RATE_8000;
			   IF NE JUMP case_01;
			   DM(I0,M1)=1;
			   AR=DM(I1,M1);
			   SR=LSHIFT AR BY -8(HI);        { 8 bits}
			   DM(I0,M1)=SR1;			   
			   SR=LSHIFT SR0 BY -6(HI);       { 8 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -14(HI); { 2 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -8(HI);       { 8 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -15(HI);      { 1 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -3(HI);       { 5 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -8(HI);  { 8 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -12(HI);      { 4 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -9(HI);       { 4 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -13(HI); { 3 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -11(HI);      { 5 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -3(HI);       { 8 bits}
			   AR=DM(I1,M1);
			   SR=SR OR LSHIFT AR BY -11(HI); { 5 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -12(HI);      { 4 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -9(HI);       { 7 bits}
			   DM(I0,M1)=SR1;
			   JUMP case_comm;
case_01:       AF=SR0-RATE_SID;
               IF NE JUMP case_02;
			   DM(I0,M1)=2;
			   AR=DM(I1,M1);
			   SR=LSHIFT AR  BY -15(HI);       { 1 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -11(HI);       { 5 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -12(HI);       { 4 bits}
			   DM(I0,M1)=SR1;
			   SR=LSHIFT SR0 BY -11(HI);       { 5 bits}
			   DM(I0,M1)=SR1;
			   JUMP case_comm;
case_02:       DM(I0,M1)=0;
case_comm:     AR=DM(DecodeParm+1);
			   AR=AR-1;
			   IF NE RTS;
			   SI=DM(DecodeParm+4);
			   AY0=DM(DecodeParm+5);
			   CALL Check_Parity_Pitch;
			   DM(DecodeParm+5)=AR;
			   RTS;
/*****************************************************************************
* read one frame (10ms) data from speech channel                             *
* $$01/10/2000 only used in decoder                                          *
* Calling Parameters												         *
* Return Values		 										                 *
* Altered Registers: SR,SE,SI,AR,AF,AX0,AX1,AY0,AY1,I0,I1,I2,I3              *
* Computation Time : 18 cycles										         *
******************************************************************************/
.ENTRY         read_seag;

read_seag:     CNTR=8;
               AR=PASS 0;
			   AY0=H#0003;
               SR0=IO(stream_port);


               DM(Decode_FrameID)=SR0;
			   DO sum_nbwords UNTIL CE;
			   AF=SR0 AND AY0;
			   IF EQ JUMP sum_nbwords;
			   AR=AR+1;
			   AF=AF-1;
			   IF EQ JUMP sum_nbwords;
			   AR=AR+4;
			   AF=AF-1;
			   IF NE AR=AR-5;
sum_nbwords:   SR=LSHIFT SR0 BY -2(LO);
               AR=PASS AR;
			   IF LE RTS;
			   CNTR=AR;
			   I1=^InputSerial;
			   DO read_sample UNTIL CE;			   
			   AR=IO(stream_port);

read_sample:   DM(I1,M1)=AR;
               RTS;
/*****************************************************************************
* read one frame (10ms) data from speech channel                             *
* $$01/10/2000 only used in encoder                                          *
* Calling Parameters												         *
*                I1:  New Speech samples read                                *
* Return Values		 										                 *
* Altered Registers: AR,I1,M1                                                *
* Computation Time : 18 cycles										         *
******************************************************************************/
.ENTRY         read_speech;

read_speech:   CNTR=L_FRAME;
			   DO read_loop UNTIL CE;
               AR=IO(speech_port);
read_loop:	   DM(I1,M1)=AR;
			   RTS;
/*****************************************************************************
* read one frame (10ms) data from speech channel                             *
* $$01/10/2000 only used in encoder                                          *
* Calling Parameters												         *
*                I1:  New Speech samples read                                *
* Return Values		 										                 *
* Altered Registers: AR,I1,M1                                                *
* Computation Time : 18 cycles										         *
******************************************************************************/
.ENTRY         out_speech;

out_speech:	   AY0=H#0007;
               AR=AR AND AY0;
			   IF NE RTS;
			   SI=DM(Encode_FrameID);
			   IO(stream_port)=SI;
			   AR=DM(Encode_nbwords);
			   AR=PASS AR;
			   IF LE JUMP skip_out;
			   CNTR=AR;
			   I1=^OutSerial;
			   DO output_sample UNTIL CE;
			   SI=DM(I1,M1);
output_sample: IO(stream_port)=SI;
skip_out:      AR=PASS 0;
               I1=^OutSerial;
               DM(put_position)=I1;
               DM(Encode_nbwords)=AR;
			   DM(Encode_FrameID)=AR;
			   CNTR=SERIAL_SIZE;
			   Do reset_serial UNTIL CE;
reset_serial:  DM(I1,M1)=0;
               RTS;
/*********************************************************************
*  Last processing of encoder										 *
* $$01/10/2000 last encoder frame function							 *
**********************************************************************/
.ENTRY         flush_speech;

flush_speech:  AY0=H#000F;
			   SR=LSHIFT AR By 1(LO);
               AF=SR0 AND AY0;
			   IF EQ RTS;
			   AX0=16;
			   AR=AX0-AF;
			   SE=AR;
			   SI=DM(Encode_FrameID);
			   IO(stream_port)=SI;
			   SR=LSHIFT SI (LO);
			   AR=DM(Encode_nbwords);
			   AR=PASS AR;
			   IF LE RTS;
			   CNTR=AR;
			   DO flush_sample UNTIL CE;
			   SI=DM(I1,M1);
flush_sample:  IO(stream_port)=SI;
               RTS;   
/*****************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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