00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static const int8_t exp_1[128] = {
00025 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
00026 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
00027 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00028 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00029 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00030 25,25,25
00031 };
00032 static const int8_t exp_2[128] = {
00033 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
00034 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
00035 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
00036 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
00037 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
00038 25,25,25
00039 };
00040 static const int8_t exp_3[128] = {
00041 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
00042 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
00043 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
00044 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
00045 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
00046 25,25,25
00047 };
00048
00049 #define Q0 ((-2 << 15) / 3.0)
00050 #define Q1 (0)
00051 #define Q2 ((2 << 15) / 3.0)
00052
00053 static const sample_t q_1_0[32] = {
00054 Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
00055 Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
00056 Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
00057 0,0,0,0,0
00058 };
00059
00060 static const sample_t q_1_1[32] = {
00061 Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
00062 Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
00063 Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
00064 0,0,0,0,0
00065 };
00066
00067 static const sample_t q_1_2[32] = {
00068 Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
00069 Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
00070 Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
00071 0,0,0,0,0
00072 };
00073
00074 #undef Q0
00075 #undef Q1
00076 #undef Q2
00077
00078 #define Q0 ((-4 << 15) / 5.0)
00079 #define Q1 ((-2 << 15) / 5.0)
00080 #define Q2 (0)
00081 #define Q3 ((2 << 15) / 5.0)
00082 #define Q4 ((4 << 15) / 5.0)
00083
00084 static const sample_t q_2_0[128] = {
00085 Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
00086 Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
00087 Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
00088 Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,
00089 Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,
00090 0,0,0
00091 };
00092
00093 static const sample_t q_2_1[128] = {
00094 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
00095 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
00096 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
00097 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
00098 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
00099 0,0,0
00100 };
00101
00102 static const sample_t q_2_2[128] = {
00103 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
00104 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
00105 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
00106 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
00107 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
00108 0,0,0
00109 };
00110
00111 #undef Q0
00112 #undef Q1
00113 #undef Q2
00114 #undef Q3
00115 #undef Q4
00116
00117 static const sample_t q_3[8] = {
00118 (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0, 0,
00119 ( 2 << 15)/7.0, ( 4 << 15)/7.0, ( 6 << 15)/7.0, 0
00120 };
00121
00122 #define Q0 ((-10 << 15) / 11.0)
00123 #define Q1 ((-8 << 15) / 11.0)
00124 #define Q2 ((-6 << 15) / 11.0)
00125 #define Q3 ((-4 << 15) / 11.0)
00126 #define Q4 ((-2 << 15) / 11.0)
00127 #define Q5 (0)
00128 #define Q6 ((2 << 15) / 11.0)
00129 #define Q7 ((4 << 15) / 11.0)
00130 #define Q8 ((6 << 15) / 11.0)
00131 #define Q9 ((8 << 15) / 11.0)
00132 #define QA ((10 << 15) / 11.0)
00133
00134 static const sample_t q_4_0[128] = {
00135 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
00136 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
00137 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
00138 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
00139 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
00140 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
00141 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
00142 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
00143 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
00144 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
00145 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
00146 0, 0, 0, 0, 0, 0, 0
00147 };
00148
00149 static const sample_t q_4_1[128] = {
00150 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00151 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00152 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00153 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00154 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00155 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00156 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00157 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00158 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00159 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00160 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
00161 0, 0, 0, 0, 0, 0, 0
00162 };
00163
00164 #undef Q0
00165 #undef Q1
00166 #undef Q2
00167 #undef Q3
00168 #undef Q4
00169 #undef Q5
00170 #undef Q6
00171 #undef Q7
00172 #undef Q8
00173 #undef Q9
00174 #undef QA
00175
00176 static const sample_t q_5[16] = {
00177 (-14 << 15)/15.0,(-12 << 15)/15.0,(-10 << 15)/15.0,
00178 ( -8 << 15)/15.0,( -6 << 15)/15.0,( -4 << 15)/15.0,
00179 ( -2 << 15)/15.0, 0 ,( 2 << 15)/15.0,
00180 ( 4 << 15)/15.0,( 6 << 15)/15.0,( 8 << 15)/15.0,
00181 ( 10 << 15)/15.0,( 12 << 15)/15.0,( 14 << 15)/15.0,
00182 0
00183 };
00184
00185 static const sample_t scale_factor[25] = {
00186 0.000030517578125,
00187 0.0000152587890625,
00188 0.00000762939453125,
00189 0.000003814697265625,
00190 0.0000019073486328125,
00191 0.00000095367431640625,
00192 0.000000476837158203125,
00193 0.0000002384185791015625,
00194 0.00000011920928955078125,
00195 0.000000059604644775390625,
00196 0.0000000298023223876953125,
00197 0.00000001490116119384765625,
00198 0.000000007450580596923828125,
00199 0.0000000037252902984619140625,
00200 0.00000000186264514923095703125,
00201 0.000000000931322574615478515625,
00202 0.0000000004656612873077392578125,
00203 0.00000000023283064365386962890625,
00204 0.000000000116415321826934814453125,
00205 0.0000000000582076609134674072265625,
00206 0.00000000002910383045673370361328125,
00207 0.000000000014551915228366851806640625,
00208 0.0000000000072759576141834259033203125,
00209 0.00000000000363797880709171295166015625,
00210 0.000000000001818989403545856475830078125
00211 };
00212
00213 static const uint16_t dither_lut[256] = {
00214 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
00215 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
00216 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
00217 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
00218 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
00219 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
00220 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
00221 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
00222 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
00223 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
00224 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
00225 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
00226 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
00227 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
00228 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
00229 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
00230 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
00231 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
00232 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
00233 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
00234 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
00235 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
00236 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
00237 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
00238 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
00239 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
00240 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
00241 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
00242 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
00243 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
00244 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
00245 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
00246 };