pcm - u-law encode/decode

Dependents:   PhonePlatform

ulaw.cpp

Committer:
okini3939
Date:
2010-11-11
Revision:
0:89894f20f372
Child:
1:546b99dee7bb

File content as of revision 0:89894f20f372:

/*
 * mbed library for ulaw
 * Copyright (c) 2010 Hiroshi Suga
 * Released under the MIT License: http://mbed.org/license/mit
 */

#include "ulaw.h"

// unsigned 16(14)bit to signed 8bit
char pcm2ulaw (int dat) {
    int num, seg;
    char ret;

    dat = dat - 32768;
    if (dat >= 0) {
        num = dat;
    } else {
        num = - dat;
    }
    num = (num >> 2) + 0x21;
    if (num >= 0x2000) num = 0x1fff;

    for (seg = 7; seg >= 0; seg --) {
        if (num & 0x1000) break;
        num = num << 1;
    }
    ret = ((num >> 8) & 0x0f) | (seg << 4);

    if (dat < 0) ret = - ret;
    return ret;
}


// signed 8bit to unsigned 16(14)bit
int ulaw2pcm (char dat) {
    int ret, seg;

    seg = (dat >> 4) & 0x07;
    ret = (0x21 | ((dat & 0x0f) << 1)) << seg;
    ret = (ret - 0x21) << 2;

    if (dat & 0x80) ret = - ret;
    ret = ret + 32768;
    return ret;
}