pcm - u-law encode/decode

Dependents:   PhonePlatform

Committer:
okini3939
Date:
Fri Nov 12 14:43:08 2010 +0000
Revision:
1:546b99dee7bb
Parent:
0:89894f20f372
Child:
2:2587e6e46668

        

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 1:546b99dee7bb 11 int num, ret, seg;
okini3939 0:89894f20f372 12
okini3939 0:89894f20f372 13 dat = dat - 32768;
okini3939 0:89894f20f372 14 if (dat >= 0) {
okini3939 0:89894f20f372 15 num = dat;
okini3939 0:89894f20f372 16 } else {
okini3939 0:89894f20f372 17 num = - dat;
okini3939 0:89894f20f372 18 }
okini3939 0:89894f20f372 19 num = (num >> 2) + 0x21;
okini3939 0:89894f20f372 20 if (num >= 0x2000) num = 0x1fff;
okini3939 0:89894f20f372 21
okini3939 0:89894f20f372 22 for (seg = 7; seg >= 0; seg --) {
okini3939 0:89894f20f372 23 if (num & 0x1000) break;
okini3939 0:89894f20f372 24 num = num << 1;
okini3939 0:89894f20f372 25 }
okini3939 0:89894f20f372 26 ret = ((num >> 8) & 0x0f) | (seg << 4);
okini3939 0:89894f20f372 27
okini3939 0:89894f20f372 28 if (dat < 0) ret = - ret;
okini3939 0:89894f20f372 29 return ret;
okini3939 0:89894f20f372 30 }
okini3939 0:89894f20f372 31
okini3939 0:89894f20f372 32
okini3939 0:89894f20f372 33 // signed 8bit to unsigned 16(14)bit
okini3939 0:89894f20f372 34 int ulaw2pcm (char dat) {
okini3939 1:546b99dee7bb 35 int num, ret, seg;
okini3939 0:89894f20f372 36
okini3939 1:546b99dee7bb 37 if (! dat & 0x80) {
okini3939 1:546b99dee7bb 38 num = dat;
okini3939 1:546b99dee7bb 39 } else {
okini3939 1:546b99dee7bb 40 num = - dat;
okini3939 1:546b99dee7bb 41 }
okini3939 1:546b99dee7bb 42 seg = (num >> 4) & 0x07;
okini3939 1:546b99dee7bb 43 ret = (0x21 | ((num & 0x0f) << 1)) << seg;
okini3939 0:89894f20f372 44 ret = (ret - 0x21) << 2;
okini3939 0:89894f20f372 45
okini3939 0:89894f20f372 46 if (dat & 0x80) ret = - ret;
okini3939 0:89894f20f372 47 ret = ret + 32768;
okini3939 0:89894f20f372 48 return ret;
okini3939 0:89894f20f372 49 }