pcm - u-law encode/decode
ulaw.cpp@2:2587e6e46668, 2011-01-05 (annotated)
- Committer:
- okini3939
- Date:
- Wed Jan 05 14:14:01 2011 +0000
- Revision:
- 2:2587e6e46668
- Parent:
- 1:546b99dee7bb
- Child:
- 3:64e448653443
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 | 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 | 2:2587e6e46668 | 37 | if (dat & 0x80) { |
okini3939 | 2:2587e6e46668 | 38 | num = - dat; |
okini3939 | 2:2587e6e46668 | 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 | } |