pcm - u-law encode/decode

Dependents:   PhonePlatform

Committer:
okini3939
Date:
Thu Nov 11 16:13:47 2010 +0000
Revision:
0:89894f20f372
Child:
1:546b99dee7bb

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:89894f20f372 1 /*
okini3939 0:89894f20f372 2 * mbed library for ulaw
okini3939 0:89894f20f372 3 * Copyright (c) 2010 Hiroshi Suga
okini3939 0:89894f20f372 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:89894f20f372 5 */
okini3939 0:89894f20f372 6
okini3939 0:89894f20f372 7 #include "ulaw.h"
okini3939 0:89894f20f372 8
okini3939 0:89894f20f372 9 // unsigned 16(14)bit to signed 8bit
okini3939 0:89894f20f372 10 char pcm2ulaw (int dat) {
okini3939 0:89894f20f372 11 int num, seg;
okini3939 0:89894f20f372 12 char ret;
okini3939 0:89894f20f372 13
okini3939 0:89894f20f372 14 dat = dat - 32768;
okini3939 0:89894f20f372 15 if (dat >= 0) {
okini3939 0:89894f20f372 16 num = dat;
okini3939 0:89894f20f372 17 } else {
okini3939 0:89894f20f372 18 num = - dat;
okini3939 0:89894f20f372 19 }
okini3939 0:89894f20f372 20 num = (num >> 2) + 0x21;
okini3939 0:89894f20f372 21 if (num >= 0x2000) num = 0x1fff;
okini3939 0:89894f20f372 22
okini3939 0:89894f20f372 23 for (seg = 7; seg >= 0; seg --) {
okini3939 0:89894f20f372 24 if (num & 0x1000) break;
okini3939 0:89894f20f372 25 num = num << 1;
okini3939 0:89894f20f372 26 }
okini3939 0:89894f20f372 27 ret = ((num >> 8) & 0x0f) | (seg << 4);
okini3939 0:89894f20f372 28
okini3939 0:89894f20f372 29 if (dat < 0) ret = - ret;
okini3939 0:89894f20f372 30 return ret;
okini3939 0:89894f20f372 31 }
okini3939 0:89894f20f372 32
okini3939 0:89894f20f372 33
okini3939 0:89894f20f372 34 // signed 8bit to unsigned 16(14)bit
okini3939 0:89894f20f372 35 int ulaw2pcm (char dat) {
okini3939 0:89894f20f372 36 int ret, seg;
okini3939 0:89894f20f372 37
okini3939 0:89894f20f372 38 seg = (dat >> 4) & 0x07;
okini3939 0:89894f20f372 39 ret = (0x21 | ((dat & 0x0f) << 1)) << seg;
okini3939 0:89894f20f372 40 ret = (ret - 0x21) << 2;
okini3939 0:89894f20f372 41
okini3939 0:89894f20f372 42 if (dat & 0x80) ret = - ret;
okini3939 0:89894f20f372 43 ret = ret + 32768;
okini3939 0:89894f20f372 44 return ret;
okini3939 0:89894f20f372 45 }