pcm - u-law encode/decode

Dependents:   PhonePlatform

Committer:
okini3939
Date:
Thu Jan 06 16:07:42 2011 +0000
Revision:
3:64e448653443
Parent:
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 3:64e448653443 13 dat = dat - 0x7fff;
okini3939 3:64e448653443 14 if (dat & 0x8000) {
okini3939 0:89894f20f372 15 num = - dat;
okini3939 3:64e448653443 16 } else {
okini3939 3:64e448653443 17 num = dat;
okini3939 0:89894f20f372 18 }
okini3939 3:64e448653443 19 num = num >> 2;
okini3939 3:64e448653443 20
okini3939 3:64e448653443 21 num = num + 0x21;
okini3939 0:89894f20f372 22 if (num >= 0x2000) num = 0x1fff;
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 3:64e448653443 29 if (dat & 0x8000) ret = ret | 0x80;
okini3939 3:64e448653443 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 1:546b99dee7bb 36 int num, ret, seg;
okini3939 0:89894f20f372 37
okini3939 3:64e448653443 38 num = ~dat;
okini3939 3:64e448653443 39
okini3939 1:546b99dee7bb 40 seg = (num >> 4) & 0x07;
okini3939 1:546b99dee7bb 41 ret = (0x21 | ((num & 0x0f) << 1)) << seg;
okini3939 3:64e448653443 42 ret = ret - 0x21;
okini3939 0:89894f20f372 43
okini3939 3:64e448653443 44 ret = ret << 2;
okini3939 0:89894f20f372 45 if (dat & 0x80) ret = - ret;
okini3939 3:64e448653443 46 ret = ret + 0x8000;
okini3939 0:89894f20f372 47 return ret;
okini3939 0:89894f20f372 48 }