-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmu.c
139 lines (116 loc) · 3.74 KB
/
mu.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* mu.c
*
* Created on: Jun 6, 2015
* Author: Anaam
*/
/**
** Signal conversion
** routines for use with Sun4/60 audio chip
**/
#include <stdio.h>
#include "tistdtypes.h"
void linear2ulaw(/* int */);
void ulaw2linear(/* unsigned char */);
/*
** This routine converts from linear to ulaw
**
** Craig Reese: IDA/Supercomputing Research Center
** Joe Campbell: Department of Defense
** 29 September 1989
**
** References:
** 1) CCITT Recommendation G.711 (very difficult to follow)
** 2) "A New Digital Technique for Implementation of Any
** Continuous PCM Companding Law," Villeret, Michel,
** et al. 1973 IEEE Int. Conf. on Communications, Vol 1,
** 1973, pg. 11.12-11.17
** 3) MIL-STD-188-113,"Interoperability and Performance Standards
** for Analog-to_Digital Conversion Techniques,"
** 17 February 1987
**
** Input: Signed 16 bit linear sample
** Output: 8 bit ulaw sample
*/
/*Anaam Ansari:
*
* 06/10/2015 Changed the to process a block as oppsed to a sample.
*
*/
#define ZEROTRAP /* turn on the trap as per the MIL-STD */
#define BIAS 0x84 /* define the add-in bias for 16 bit samples */
#define CLIP 0x1fff
void
linear2ulaw(sample,block,ulawbyte)
Int16* sample;
Uint8 * ulawbyte;
int block;
{
static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
int sign, exponent, mantissa;
//unsigned char *ulawbyte;
int i;
for(i=0;i<block;i++)
{
/* Get the sample into sign-magnitude. */
sign = (sample[i] >> 8) & 0x80; /* set aside the sign */
if (sign != 0) sample[i] = -sample[i]; /* get magnitude */
if (sample[i] > CLIP) sample[i] = CLIP; /* clip the magnitude */
/* Convert from 16 bit linear to ulaw. */
sample[i] = sample[i] + BIAS;
exponent = exp_lut[(sample[i] >> 7) & 0xFF];
mantissa = (sample[i] >> (exponent + 3)) & 0x0F;
ulawbyte[i] = ~(sign | (exponent << 4) | mantissa);
}
#ifdef ZEROTRAP
if (ulawbyte[i] == 0) ulawbyte[i] = 0x02; /* optional CCITT trap */
#endif
}
/*
** This routine converts from ulaw to 16 bit linear.
**
** Craig Reese: IDA/Supercomputing Research Center
** 29 September 1989
**
** References:
** 1) CCITT Recommendation G.711 (very difficult to follow)
** 2) MIL-STD-188-113,"Interoperability and Performance Standards
** for Analog-to_Digital Conversion Techniques,"
** 17 February 1987
**
** Input: 8 bit ulaw sample
** Output: signed 16 bit linear sample
*/
void
ulaw2linear(ulawbyte,block,sample)
unsigned char *ulawbyte;
Int16 block;
Int16 *sample;
{
static int exp_lut[8] = {0,132,396,924,1980,4092,8316,16764};
int sign, exponent, mantissa,i;
for(i=0;i<block;i++)
{
ulawbyte[i] = ~ulawbyte[i];
sign = (ulawbyte[i] & 0x80);
exponent = (ulawbyte[i] >> 4) & 0x07;
mantissa = ulawbyte[i] & 0x0F;
sample[i] = exp_lut[exponent] + (mantissa << (exponent + 3));
if (sign != 0) sample[i] = -sample[i];
}
}