Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/tools/sdk-tools/tabledesign/tabledesign.c
7861 views
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <math.h>
4
#include <getopt.h>
5
#include <audiofile.h>
6
#include "tabledesign.h"
7
8
#ifdef __sgi
9
10
typedef long SampleFormat;
11
12
#define MODE_READ "r"
13
14
#else
15
16
// The modern implementation of SGI's audiofile library which is in Ubuntu
17
// (https://github.com/mpruett/audiofile/) has renamed some of the functions,
18
// and changed some data types.
19
20
typedef int SampleFormat;
21
#define AFopenfile afOpenFile
22
#define AFgetchannels afGetChannels
23
#define AFgettrackids afGetTrackIDs
24
#define AFgetsampfmt afGetSampleFormat
25
#define AFgetframecnt afGetFrameCount
26
#define AFgetrate afGetRate
27
#define AFreadframes afReadFrames
28
29
#define MODE_READ "rb"
30
31
#endif
32
33
char usage[80] = "[-o order -s bits -t thresh -i refine_iter -f frame_size] aifcfile";
34
35
int main(int argc, char **argv)
36
{
37
const char *programName; // sp118
38
double thresh; // sp110
39
int order; // sp10C
40
int bits; // sp108
41
int refineIters; // sp104
42
int frameSize; // sp100
43
UNUSED int rate;
44
int frameCount;
45
int opt;
46
double *spF4;
47
double dummy; // spE8
48
double **mat; // spE4
49
double **data; // spD0
50
double *splitDelta; // spCC
51
int j; // spC0
52
int permDet;
53
int curBits; // spB8
54
int npredictors; // spB4
55
int *perm; // spB0
56
int numOverflows; // spAC
57
SampleFormat sampleFormat; // sp90
58
SampleFormat sampleWidth; // sp8C
59
AFfilehandle afFile; // sp88
60
int channels;
61
int tracks;
62
double *vec; // s2
63
double **temp_s1;
64
short *temp_s3;
65
int i;
66
int dataSize; // s4
67
68
order = 2;
69
bits = 2;
70
refineIters = 2;
71
frameSize = 16;
72
numOverflows = 0;
73
programName = argv[0];
74
thresh = 10.0;
75
76
if (argc < 2)
77
{
78
fprintf(stderr, "%s %s\n", argv[0], usage);
79
exit(1);
80
}
81
82
while ((opt = getopt(argc, argv, "o:s:t:i:f:")) != -1)
83
{
84
switch (opt)
85
{
86
case 'o':
87
if (sscanf(optarg, "%d", &order) != 1)
88
order = 2;
89
break;
90
case 's':
91
if (sscanf(optarg, "%d", &bits) != 1)
92
bits = 2;
93
break;
94
case 'f':
95
if (sscanf(optarg, "%d", &frameSize) != 1)
96
frameSize = 16;
97
break;
98
case 'i':
99
if (sscanf(optarg, "%d", &refineIters) != 1)
100
refineIters = 2;
101
break;
102
case 't':
103
if (sscanf(optarg, "%lf", &thresh) != 1)
104
thresh = 10.0;
105
break;
106
}
107
}
108
109
argv = &argv[optind - 1];
110
111
afFile = AFopenfile(argv[1], MODE_READ, NULL);
112
if (afFile == NULL)
113
{
114
fprintf(stderr,
115
"%s: input AIFC file [%s] could not be opened.\n",
116
programName, argv[1]);
117
exit(1);
118
}
119
120
channels = AFgetchannels(afFile, AF_DEFAULT_TRACK);
121
if (channels != 1)
122
{
123
fprintf(stderr,
124
"%s: file [%s] contains %d channels, only 1 channel supported.\n",
125
programName, argv[1], channels);
126
exit(1);
127
}
128
129
tracks = AFgettrackids(afFile, NULL);
130
if (tracks != 1)
131
{
132
fprintf(stderr,
133
"%s: file [%s] contains %d tracks, only 1 track supported.\n",
134
programName, argv[1], tracks);
135
exit(1);
136
}
137
138
AFgetsampfmt(afFile, AF_DEFAULT_TRACK, &sampleFormat, &sampleWidth);
139
if (sampleWidth != 16)
140
{
141
fprintf(stderr,
142
"%s: file [%s] contains %d bit samples, only 16 bit samples supported.\n",
143
programName, argv[1], (int)sampleWidth);
144
exit(1);
145
}
146
147
temp_s1 = malloc((1 << bits) * sizeof(double*));
148
for (i = 0; i < (1 << bits); i++)
149
{
150
temp_s1[i] = malloc((order + 1) * sizeof(double));
151
}
152
153
splitDelta = malloc((order + 1) * sizeof(double));
154
temp_s3 = malloc(frameSize * 2 * sizeof(short));
155
for (i = 0; i < frameSize * 2; i++)
156
{
157
temp_s3[i] = 0;
158
}
159
160
vec = malloc((order + 1) * sizeof(double));
161
spF4 = malloc((order + 1) * sizeof(double));
162
mat = malloc((order + 1) * sizeof(double*));
163
for (i = 0; i <= order; i++)
164
{
165
mat[i] = malloc((order + 1) * sizeof(double));
166
}
167
168
perm = malloc((order + 1) * sizeof(int));
169
frameCount = AFgetframecnt(afFile, AF_DEFAULT_TRACK);
170
rate = AFgetrate(afFile, AF_DEFAULT_TRACK);
171
data = malloc(frameCount * sizeof(double*));
172
dataSize = 0;
173
174
while (AFreadframes(afFile, AF_DEFAULT_TRACK, temp_s3 + frameSize, frameSize) == frameSize)
175
{
176
acvect(temp_s3 + frameSize, order, frameSize, vec);
177
if (fabs(vec[0]) > thresh)
178
{
179
acmat(temp_s3 + frameSize, order, frameSize, mat);
180
if (lud(mat, order, perm, &permDet) == 0)
181
{
182
lubksb(mat, order, perm, vec);
183
vec[0] = 1.0;
184
if (kfroma(vec, spF4, order) == 0)
185
{
186
data[dataSize] = malloc((order + 1) * sizeof(double));
187
data[dataSize][0] = 1.0;
188
189
for (i = 1; i <= order; i++)
190
{
191
if (spF4[i] >= 1.0) spF4[i] = 0.9999999999;
192
if (spF4[i] <= -1.0) spF4[i] = -0.9999999999;
193
}
194
195
afromk(spF4, data[dataSize], order);
196
dataSize++;
197
}
198
}
199
}
200
201
for (i = 0; i < frameSize; i++)
202
{
203
temp_s3[i] = temp_s3[i + frameSize];
204
}
205
}
206
207
vec[0] = 1.0;
208
for (j = 1; j <= order; j++)
209
{
210
vec[j] = 0.0;
211
}
212
213
for (i = 0; i < dataSize; i++)
214
{
215
rfroma(data[i], order, temp_s1[0]);
216
for (j = 1; j <= order; j++)
217
{
218
vec[j] += temp_s1[0][j];
219
}
220
}
221
222
for (j = 1; j <= order; j++)
223
{
224
vec[j] /= dataSize;
225
}
226
227
durbin(vec, order, spF4, temp_s1[0], &dummy);
228
229
for (j = 1; j <= order; j++)
230
{
231
if (spF4[j] >= 1.0) spF4[j] = 0.9999999999;
232
if (spF4[j] <= -1.0) spF4[j] = -0.9999999999;
233
}
234
235
afromk(spF4, temp_s1[0], order);
236
curBits = 0;
237
while (curBits < bits)
238
{
239
for (i = 0; i <= order; i++)
240
{
241
splitDelta[i] = 0.0;
242
}
243
splitDelta[order - 1] = -1.0;
244
split(temp_s1, splitDelta, order, 1 << curBits, 0.01);
245
curBits++;
246
refine(temp_s1, order, 1 << curBits, data, dataSize, refineIters, 0.0);
247
}
248
249
npredictors = 1 << curBits;
250
fprintf(stdout, "%d\n%d\n", order, npredictors);
251
252
for (i = 0; i < npredictors; i++)
253
{
254
numOverflows += print_entry(stdout, temp_s1[i], order);
255
}
256
257
if (numOverflows > 0)
258
{
259
fprintf(stderr, "There was overflow - check the table\n");
260
}
261
return 0;
262
}
263
264