• 大小: 6.25KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-04-17
  • 语言: C/C++
  • 标签: 实现  算法  

资源简介

C代码

资源截图

代码片段和文件信息

/* libst.c - portable sound tools library
*/

#include “libst.h“

#ifndef FAST_ULAW_CONVERSION

#undef ZEROTRAP      /* turn off the trap as per the MIL-STD */
#define uBIAS 0x84   /* define the add-in bias for 16 bit samples */
#define uCLIP 32635
#define ACLIP 31744

unsigned char
st_linear_to_ulaw( sample )
int sample;
    {
    static int exp_lut[256] = {0011222233333333
                               4444444444444444
                               5555555555555555
                               5555555555555555
                               6666666666666666
                               6666666666666666
                               6666666666666666
                               6666666666666666
                               7777777777777777
                               7777777777777777
                               7777777777777777
                               7777777777777777
                               7777777777777777
                               7777777777777777
                               7777777777777777
                               7777777777777777};
    int sign exponent mantissa;
    unsigned char ulawbyte;

    /* Get the sample into sign-magnitude. */
    sign = (sample >> 8) & 0x80; /* set aside the sign */
    if ( sign != 0 ) sample = -sample; /* get magnitude */
    if ( sample > uCLIP ) sample = uCLIP; /* clip the magnitude */

    /* Convert from 16 bit linear to ulaw. */
    sample = sample + uBIAS;
    exponent = exp_lut[( sample >> 7 ) & 0xFF];
    mantissa = ( sample >> ( exponent + 3 ) ) & 0x0F;
    ulawbyte = ~ ( sign | ( exponent << 4 ) | mantissa );
#ifdef ZEROTRAP
    if ( ulawbyte == 0 ) ulawbyte = 0x02; /* optional CCITT trap */
#endif

    return ulawbyte;
    }

/*
** This routine converts from ulaw to 16 bit linear.
**
** Craig Reese: IDA/Supercomputing Research Center
** 29 September 1989
**
** References:
** 1) CCITT Recommendation G.711  (very difficult to follow)
** 2) MIL-STD-188-113“Interoperability and Performance Standards
**     for Analog-to_Digital Conversion Techniques“
**     17 February 1987
**
** Input: 8 bit ulaw sample
** Output: signed 16 bit linear sample
*/

int
st_ulaw_to_linear( ulawbyte )
unsigned char ulawbyte;
    {
    static int exp_lut[8] = { 0 132 396 924 1980 4092 8316 16764 };
    int sign exponent mantissa sample;

    ulawbyte = ~ ulawbyte;
    sign = ( ulawbyte & 0x80 );
    exponent = ( ulawbyte >> 4 ) & 0x07;
    mantissa = ulawbyte & 0x0F;
    sample = exp_lut[exponent] + ( mantissa << ( exponent + 3 ) );
    if ( sign != 0 ) sample = -sample;

    return sample;
    }

#else

unsigned char ulaw_comp_t

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     187472  2000-09-25 19:29  A律u律_实现\libst.c

     文件       1331  2000-09-25 19:29  A律u律_实现\libst.h

     目录          0  2020-11-10 20:45  A律u律_实现

----------- ---------  ---------- -----  ----

               188803                    3


评论

共有 条评论