🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Richard Spence Thu, 31 Dec 1992 13:32
Format of .AU Sound files
#1909
Author: Richard Spence
Date: Thu, 31 Dec 1992 13:32
37 lines
2178 bytes
christos@kuhub.cc.ukans.edu () writes:

> Hello there,

> I am using the Public Domain program Sound Tools on the Sun station
> to record speech. The speech samples are saved in a mu-law 8bits/sample
> encoding rule with a standard ".au" header precceding the data. What I
> would like to know is what the format of the speech samples is? In other
> words, I am reading the bytes that correspond to 8-bit speech samples but I
> don't know whether they are in signed binary format(2's complement) or
> unsigned binary format or anyother format. I have tried both binary signed
> (2' complement) and unsigned but it doesn't work. Does anybody know how the
> samples are stored?

> I would appreciate any relevant response.

The most likely encoding will be a standard telecomms encoding at 64kbps or
8kHz audio. One second of information will be 8000 bytes, not 8kbytes.

The 'original' samples are 12 bits wide and a compression algorithm is
applied to get down to 8 bits. The USA (and dependants) use the mu-law
encoding scheme. We Europeans use an A-law scheme.

So much for background. If I remember correctly, the most significant bit is
a sign bit, indicating positive (0) or negative (1) value. The remaining 7
bits are the encoded amplitude of the sample. Manipulation will require you
to decode the sample correctly, and I don't have the details of mu-law
encoding to hand. But, I know where it is described. Try and get hold of the
CCITT's G.7xx series recommendations which is one large volume. Try a
technical library of a university. Alternatively, you could ask very nicely
and I will try to mail the relevant pages when I'm over in the US in January.

Richard Spence
rspence@cix.compulink.co.uk
CompuServe: 100112,304

>>>MATRIX version  1.21e
Re: Format of .AU Sound files
#1919
Author: Craig F. Reese
Date: Thu, 31 Dec 1992 18:56
149 lines
5905 bytes
In article <memo.834974@cix.compulink.co.uk> rspence@cix.compulink.co.uk writes:
>christos@kuhub.cc.ukans.edu () writes:
>
>> Hello there,
>
>> I am using the Public Domain program Sound Tools on the Sun station
>> to record speech. The speech samples are saved in a mu-law 8bits/sample
>> encoding rule with a standard ".au" header precceding the data. What I
>> would like to know is what the format of the speech samples is? In other
    .
    .
    .
>
>So much for background. If I remember correctly, the most significant bit is
>a sign bit, indicating positive (0) or negative (1) value. The remaining 7
>bits are the encoded amplitude of the sample. Manipulation will require you
>to decode the sample correctly, and I don't have the details of mu-law
>encoding to hand. But, I know where it is described. Try and get hold of the
>CCITT's G.7xx series recommendations which is one large volume. Try a
>technical library of a university. Alternatively, you could ask very nicely
>and I will try to mail the relevant pages when I'm over in the US in January.
>

Here's some code I wrote many moons ago.  It should help.

Craig

=============================================================

TWIMC,

Below are two routines I wrote for converting between ulaw and linear. 
I use them with the SparcStation and they seem to work fine.
I am pretty sure (99.9%) that they implement the standard as specified
in the references. 

Note that the standard deals with converting between 12 bit linear
and 8 bit ulaw.  These routines assume 16 bit linear.  Thus, some
bit shifting may be necessary.

craig

------------------------------------------------------------------
/**
 ** Signal conversion routines for use with the Sun4/60 audio chip
 **/

/*
 * This routine converts from linear to ulaw
 * 29 September 1989
 *
 * Craig Reese: IDA/Supercomputing Research Center
 * Joe Campbell: Department of Defense
 *
 * References:
 * 1) CCITT Recommendation G.711  (very difficult to follow)
 * 2) "A New Digital Technique for Implementation of Any 
 *     Continuous PCM Companding Law," Villeret, Michel,
 *     et al. 1973 IEEE Int. Conf. on Communications, Vol 1,
 *     1973, pg. 11.12-11.17
 * 3) MIL-STD-188-113,"Interoperability and Performance Standards
 *     for Analog-to_Digital Conversion Techniques,"
 *     17 February 1987
 *
 * Input: Signed 16 bit linear sample
 * Output: 8 bit ulaw sample
 */

#define ZEROTRAP    /* turn on the trap as per the MIL-STD */
#define BIAS 0x84   /* define the add-in bias for 16 bit samples */
#define CLIP 32635

unsigned char
linear2ulaw(sample)
int sample;
{
    static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
                               4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
                               5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                               5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                               6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                               7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
    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 > CLIP) sample = CLIP;   /* clip the magnitude */
    /** convert from 16 bit linear to ulaw **/
    sample = sample + BIAS;
    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 the result **/
    return(ulawbyte);
    }

/*
 * This routine converts from ulaw to 16 bit linear
 * 29 September 1989
 *
 * Craig Reese: IDA/Supercomputing Research Center
 *
 * 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
ulaw2linear(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);
    }

-----------------
Craig F. Reese                           Email: cfreese@super.org
Institute for Defense Analyses/
Supercomputing Research Center
17100 Science Dr.
Bowie, MD  20715-4300
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads