pcm - u-law encode/decode
ulaw.cpp@0:89894f20f372, 2010-11-11 (annotated)
- Committer:
- okini3939
- Date:
- Thu Nov 11 16:13:47 2010 +0000
- Revision:
- 0:89894f20f372
- Child:
- 1:546b99dee7bb
Who changed what in which revision?
User | Revision | Line number | New 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 | } |