|
|
|
@ -24,6 +24,222 @@ |
|
|
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* pre-calculated table for hammsinc function |
|
|
|
|
* Only half of the tables is needed because of symetry. |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 2.4.5.2-2/3 |
|
|
|
|
*/ |
|
|
|
|
static const float qcelp_hammsinc_table[4] = { -0.006822, 0.041249, -0.143459, 0.588863}; |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
uint8_t index; /*!< index into the QCELPContext structure */ |
|
|
|
|
uint8_t bitpos; /*!< position of the lowet bit in the value's byte */ |
|
|
|
|
uint8_t bitlen; /*!< number of bits to read */ |
|
|
|
|
} QCELPBitmap; |
|
|
|
|
|
|
|
|
|
#define QCELP_OF(variable, bit, len) {offsetof(QCELPContext, variable), bit, len} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* bitmap unpacking tables for RATE_FULL |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 Table 2.4.7.1-1 |
|
|
|
|
*/ |
|
|
|
|
static const QCELPBitmap qcelp_rate_full_bitmap[] = { |
|
|
|
|
// start on bit
|
|
|
|
|
QCELP_OF(lspv [ 2], 0, 3), // 265
|
|
|
|
|
QCELP_OF(lspv [ 1], 0, 7), // 262
|
|
|
|
|
QCELP_OF(lspv [ 0], 0, 6), // 255
|
|
|
|
|
QCELP_OF(lspv [ 4], 0, 6), // 249
|
|
|
|
|
QCELP_OF(lspv [ 3], 0, 6), // 243
|
|
|
|
|
QCELP_OF(lspv [ 2], 3, 4), // 237
|
|
|
|
|
QCELP_OF(cbsign[ 0], 0, 1), // 233
|
|
|
|
|
QCELP_OF(cbgain[ 0], 0, 4), // 232
|
|
|
|
|
QCELP_OF(pfrac [ 0], 0, 1), // 228
|
|
|
|
|
QCELP_OF(plag [ 0], 0, 7), // 227
|
|
|
|
|
QCELP_OF(pgain [ 0], 0, 3), // 220
|
|
|
|
|
QCELP_OF(cindex[ 1], 0, 4), // 217
|
|
|
|
|
QCELP_OF(cbsign[ 1], 0, 1), // 213
|
|
|
|
|
QCELP_OF(cbgain[ 1], 0, 4), // 212
|
|
|
|
|
QCELP_OF(cindex[ 0], 0, 7), // 208
|
|
|
|
|
QCELP_OF(cbgain[ 3], 0, 1), // 201
|
|
|
|
|
QCELP_OF(cindex[ 2], 0, 7), // 200
|
|
|
|
|
QCELP_OF(cbsign[ 2], 0, 1), // 193
|
|
|
|
|
QCELP_OF(cbgain[ 2], 0, 4), // 192
|
|
|
|
|
QCELP_OF(cindex[ 1], 4, 3), // 188
|
|
|
|
|
QCELP_OF(plag [ 1], 0, 3), // 185
|
|
|
|
|
QCELP_OF(pgain [ 1], 0, 3), // 182
|
|
|
|
|
QCELP_OF(cindex[ 3], 0, 7), // 179
|
|
|
|
|
QCELP_OF(cbsign[ 3], 0, 1), // 172
|
|
|
|
|
QCELP_OF(cbgain[ 3], 1, 2), // 171
|
|
|
|
|
QCELP_OF(cindex[ 4], 0, 6), // 169
|
|
|
|
|
QCELP_OF(cbsign[ 4], 0, 1), // 163
|
|
|
|
|
QCELP_OF(cbgain[ 4], 0, 4), // 162
|
|
|
|
|
QCELP_OF(pfrac [ 1], 0, 1), // 158
|
|
|
|
|
QCELP_OF(plag [ 1], 3, 4), // 157
|
|
|
|
|
QCELP_OF(cbgain[ 6], 0, 3), // 153
|
|
|
|
|
QCELP_OF(cindex[ 5], 0, 7), // 150
|
|
|
|
|
QCELP_OF(cbsign[ 5], 0, 1), // 143
|
|
|
|
|
QCELP_OF(cbgain[ 5], 0, 4), // 142
|
|
|
|
|
QCELP_OF(cindex[ 4], 6, 1), // 138
|
|
|
|
|
QCELP_OF(cindex[ 7], 0, 3), // 137
|
|
|
|
|
QCELP_OF(cbsign[ 7], 0, 1), // 134
|
|
|
|
|
QCELP_OF(cbgain[ 7], 0, 3), // 133
|
|
|
|
|
QCELP_OF(cindex[ 6], 0, 7), // 130
|
|
|
|
|
QCELP_OF(cbsign[ 6], 0, 1), // 123
|
|
|
|
|
QCELP_OF(cbgain[ 6], 3, 1), // 122
|
|
|
|
|
QCELP_OF(cbgain[ 8], 0, 1), // 121
|
|
|
|
|
QCELP_OF(pfrac [ 2], 0, 1), // 120
|
|
|
|
|
QCELP_OF(plag [ 2], 0, 7), // 119
|
|
|
|
|
QCELP_OF(pgain [ 2], 0, 3), // 112
|
|
|
|
|
QCELP_OF(cindex[ 7], 3, 4), // 109
|
|
|
|
|
QCELP_OF(cbsign[ 9], 0, 1), // 105
|
|
|
|
|
QCELP_OF(cbgain[ 9], 0, 4), // 104
|
|
|
|
|
QCELP_OF(cindex[ 8], 0, 7), // 100
|
|
|
|
|
QCELP_OF(cbsign[ 8], 0, 1), // 93
|
|
|
|
|
QCELP_OF(cbgain[ 8], 1, 3), // 92
|
|
|
|
|
QCELP_OF(cindex[10], 0, 4), // 89
|
|
|
|
|
QCELP_OF(cbsign[10], 0, 1), // 85
|
|
|
|
|
QCELP_OF(cbgain[10], 0, 4), // 84
|
|
|
|
|
QCELP_OF(cindex[ 9], 0, 7), // 80
|
|
|
|
|
QCELP_OF(pgain [ 3], 0, 2), // 73
|
|
|
|
|
QCELP_OF(cindex[11], 0, 7), // 71
|
|
|
|
|
QCELP_OF(cbsign[11], 0, 1), // 64
|
|
|
|
|
QCELP_OF(cbgain[11], 0, 3), // 63
|
|
|
|
|
QCELP_OF(cindex[10], 4, 3), // 60
|
|
|
|
|
QCELP_OF(cindex[12], 0, 2), // 57
|
|
|
|
|
QCELP_OF(cbsign[12], 0, 1), // 55
|
|
|
|
|
QCELP_OF(cbgain[12], 0, 4), // 54
|
|
|
|
|
QCELP_OF(pfrac [ 3], 0, 1), // 50
|
|
|
|
|
QCELP_OF(plag [ 3], 0, 7), // 49
|
|
|
|
|
QCELP_OF(pgain [ 3], 2, 1), // 42
|
|
|
|
|
QCELP_OF(cindex[13], 0, 6), // 41
|
|
|
|
|
QCELP_OF(cbsign[13], 0, 1), // 35
|
|
|
|
|
QCELP_OF(cbgain[13], 0, 4), // 34
|
|
|
|
|
QCELP_OF(cindex[12], 2, 5), // 30
|
|
|
|
|
QCELP_OF(cbgain[15], 0, 3), // 25
|
|
|
|
|
QCELP_OF(cindex[14], 0, 7), // 22
|
|
|
|
|
QCELP_OF(cbsign[14], 0, 1), // 15
|
|
|
|
|
QCELP_OF(cbgain[14], 0, 4), // 14
|
|
|
|
|
QCELP_OF(cindex[13], 6, 1), // 10
|
|
|
|
|
QCELP_OF(reserved, 0, 2), // 9
|
|
|
|
|
QCELP_OF(cindex[15], 0, 7), // 7
|
|
|
|
|
QCELP_OF(cbsign[15], 0, 1) // 0
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* bitmap unpacking tables for RATE_HALF |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 Table 2.4.7.2-1 |
|
|
|
|
*/ |
|
|
|
|
static const QCELPBitmap qcelp_rate_half_bitmap[] = { |
|
|
|
|
// start on bit
|
|
|
|
|
QCELP_OF(lspv [2], 0, 3), // 123
|
|
|
|
|
QCELP_OF(lspv [1], 0, 7), // 120
|
|
|
|
|
QCELP_OF(lspv [0], 0, 6), // 113
|
|
|
|
|
QCELP_OF(lspv [4], 0, 6), // 107
|
|
|
|
|
QCELP_OF(lspv [3], 0, 6), // 101
|
|
|
|
|
QCELP_OF(lspv [2], 3, 4), // 95
|
|
|
|
|
QCELP_OF(cbsign[0], 0, 1), // 91
|
|
|
|
|
QCELP_OF(cbgain[0], 0, 4), // 90
|
|
|
|
|
QCELP_OF(pfrac [0], 0, 1), // 86
|
|
|
|
|
QCELP_OF(plag [0], 0, 7), // 85
|
|
|
|
|
QCELP_OF(pgain [0], 0, 3), // 78
|
|
|
|
|
QCELP_OF(plag [1], 0, 6), // 75
|
|
|
|
|
QCELP_OF(pgain [1], 0, 3), // 69
|
|
|
|
|
QCELP_OF(cindex[0], 0, 7), // 66
|
|
|
|
|
QCELP_OF(pgain [2], 0, 2), // 59
|
|
|
|
|
QCELP_OF(cindex[1], 0, 7), // 57
|
|
|
|
|
QCELP_OF(cbsign[1], 0, 1), // 50
|
|
|
|
|
QCELP_OF(cbgain[1], 0, 4), // 49
|
|
|
|
|
QCELP_OF(pfrac [1], 0, 1), // 45
|
|
|
|
|
QCELP_OF(plag [1], 6, 1), // 44
|
|
|
|
|
QCELP_OF(cindex[2], 0, 2), // 43
|
|
|
|
|
QCELP_OF(cbsign[2], 0, 1), // 41
|
|
|
|
|
QCELP_OF(cbgain[2], 0, 4), // 40
|
|
|
|
|
QCELP_OF(pfrac [2], 0, 1), // 36
|
|
|
|
|
QCELP_OF(plag [2], 0, 7), // 35
|
|
|
|
|
QCELP_OF(pgain [2], 2, 1), // 28
|
|
|
|
|
QCELP_OF(pfrac [3], 0, 1), // 27
|
|
|
|
|
QCELP_OF(plag [3], 0, 7), // 26
|
|
|
|
|
QCELP_OF(pgain [3], 0, 3), // 19
|
|
|
|
|
QCELP_OF(cindex[2], 2, 5), // 16
|
|
|
|
|
QCELP_OF(cindex[3], 0, 7), // 11
|
|
|
|
|
QCELP_OF(cbsign[3], 0, 1), // 4
|
|
|
|
|
QCELP_OF(cbgain[3], 0, 4) // 3
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* bitmap unpacking tables for RATE_QUARTER |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 Table 2.4.7.3-1 |
|
|
|
|
*/ |
|
|
|
|
static const QCELPBitmap qcelp_rate_quarter_bitmap[] = { |
|
|
|
|
// start on bit
|
|
|
|
|
QCELP_OF(lspv [2], 0, 3), // 53
|
|
|
|
|
QCELP_OF(lspv [1], 0, 7), // 50
|
|
|
|
|
QCELP_OF(lspv [0], 0, 6), // 43
|
|
|
|
|
QCELP_OF(lspv [4], 0, 6), // 37
|
|
|
|
|
QCELP_OF(lspv [3], 0, 6), // 31
|
|
|
|
|
QCELP_OF(lspv [2], 3, 4), // 25
|
|
|
|
|
QCELP_OF(cbgain[3], 0, 4), // 21
|
|
|
|
|
QCELP_OF(cbgain[2], 0, 4), // 17
|
|
|
|
|
QCELP_OF(cbgain[1], 0, 4), // 13
|
|
|
|
|
QCELP_OF(cbgain[0], 0, 4), // 9
|
|
|
|
|
QCELP_OF(reserved, 0, 2), // 5
|
|
|
|
|
QCELP_OF(cbgain[4], 0, 4) // 3
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* bitmap unpacking tables for RATE_OCTAVE |
|
|
|
|
* |
|
|
|
|
* trick: CBSEED is written into QCELPContext.cbsign[15], |
|
|
|
|
* which is not used for RATE_OCTAVE. |
|
|
|
|
* CBSEED is only used to ensure the occurrence of random bit |
|
|
|
|
* patterns in the 16 first bits that are used as the seed. |
|
|
|
|
* |
|
|
|
|
* TIA/EIA/IS-733 Table 2.4.7.4-1 |
|
|
|
|
*/ |
|
|
|
|
static const QCELPBitmap qcelp_rate_octave_bitmap[] = { |
|
|
|
|
// start on bit
|
|
|
|
|
QCELP_OF(cbsign[15], 3, 1), // 19
|
|
|
|
|
QCELP_OF(lspv [0], 0, 1), // 18
|
|
|
|
|
QCELP_OF(lspv [1], 0, 1), // 17
|
|
|
|
|
QCELP_OF(lspv [2], 0, 1), // 16
|
|
|
|
|
QCELP_OF(cbsign[15], 2, 1), // 15
|
|
|
|
|
QCELP_OF(lspv [3], 0, 1), // 14
|
|
|
|
|
QCELP_OF(lspv [4], 0, 1), // 13
|
|
|
|
|
QCELP_OF(lspv [5], 0, 1), // 12
|
|
|
|
|
QCELP_OF(cbsign[15], 1, 1), // 11
|
|
|
|
|
QCELP_OF(lspv [6], 0, 1), // 10
|
|
|
|
|
QCELP_OF(lspv [7], 0, 1), // 9
|
|
|
|
|
QCELP_OF(lspv [8], 0, 1), // 8
|
|
|
|
|
QCELP_OF(cbsign[15], 0, 1), // 7
|
|
|
|
|
QCELP_OF(lspv [9], 0, 1), // 6
|
|
|
|
|
QCELP_OF(cbgain [0], 0, 2), // 7
|
|
|
|
|
QCELP_OF(reserved, 0, 4) // 3
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* position of the bitmapping data for each packet type in |
|
|
|
|
* the QCELPContext |
|
|
|
|
*/ |
|
|
|
|
static const QCELPBitmap * const qcelp_unpacking_bitmaps_per_rate[5] = { |
|
|
|
|
NULL, ///!< for SILENCE rate
|
|
|
|
|
qcelp_rate_octave_bitmap, |
|
|
|
|
qcelp_rate_quarter_bitmap, |
|
|
|
|
qcelp_rate_half_bitmap, |
|
|
|
|
qcelp_rate_full_bitmap, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const uint16_t qcelp_bits_per_rate[5] = { |
|
|
|
|
0, ///!< for SILENCE rate
|
|
|
|
|
FF_ARRAY_ELEMS(qcelp_rate_octave_bitmap), |
|
|
|
|
FF_ARRAY_ELEMS(qcelp_rate_quarter_bitmap), |
|
|
|
|
FF_ARRAY_ELEMS(qcelp_rate_half_bitmap), |
|
|
|
|
FF_ARRAY_ELEMS(qcelp_rate_full_bitmap), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
typedef uint16_t qcelp_vector[2]; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|