1 /* Apache 2.0 INS-AMU 2015 */
10 /* write data to file */
12 struct sk_out_file_data
{
17 sk_out_file_data
*sk_out_file_alloc() {
18 return sk_malloc (sizeof(sk_out_file_data
));
21 int sk_out_file_is_std(sk_out_file_data
*d
) {
25 int sk_out_file_from_fname(sk_out_file_data
*d
, char *fname
) {
26 d
->fd
= fopen(fname
, "w");
31 int sk_out_file_from_std(sk_out_file_data
*d
, FILE *std
) {
37 SK_DEFOUT(sk_out_file
) {
39 sk_out_file_data
*d
= data
;
40 fprintf(d
->fd
, "%f %d ", t
, nx
);
41 for (i
=0; i
<nx
; i
++) fprintf(d
->fd
, "%f ", x
[i
]);
42 fprintf(d
->fd
, "%d ", nc
);
43 for (i
=0; i
<nc
; i
++) fprintf(d
->fd
, "%f ", c
[i
]);
48 void sk_out_file_free(sk_out_file_data
*d
) {
54 /* auto-allocating array */
55 struct sk_out_mem_data
{
56 int n_sample
, capacity
, nx
, nc
;
60 sk_out_mem_data
*sk_out_mem_alloc() {
61 return sk_malloc (sizeof(sk_out_mem_data
));
64 int sk_out_mem_get_n_sample(sk_out_mem_data
*d
) {
68 int sk_out_mem_get_nx(sk_out_mem_data
*d
) {
72 int sk_out_mem_get_nc(sk_out_mem_data
*d
) {
76 double *sk_out_mem_get_xs(sk_out_mem_data
*d
) {
80 double *sk_out_mem_get_cs(sk_out_mem_data
*d
) {
84 int sk_out_mem_init(sk_out_mem_data
*d
) {
92 SK_DEFOUT(sk_out_mem
) {
93 sk_out_mem_data
*d
= data
;
99 d
->xs
= sk_malloc (sizeof(double)*nx
);
100 d
->cs
= sk_malloc (sizeof(double)*nc
);
103 memcpy(d
->xs
+ d
->n_sample
*nx
, x
, sizeof(double)*nx
);
104 memcpy(d
->cs
+ d
->n_sample
*nc
, c
, sizeof(double)*nc
);
106 if (d
->n_sample
==d
->capacity
) {
109 x_
= sk_realloc (d
->xs
, sizeof(double)*nx
*2*d
->capacity
);
112 c_
= sk_realloc (d
->cs
, sizeof(double)*nc
*2*d
->capacity
);
122 void sk_out_mem_free(sk_out_mem_data
*d
) {
132 struct sk_out_tee_data
{
138 sk_out_tee_data
*sk_out_tee_alloc() {
139 return sk_malloc (sizeof(sk_out_tee_data
));
142 int sk_out_tee_init(sk_out_tee_data
*d
, int nout
) {
144 d
->outs
= sk_malloc (sizeof(sk_out
) * nout
);
145 d
->outd
= sk_malloc (sizeof(void*) * nout
);
149 int sk_out_tee_set_out(sk_out_tee_data
*d
, int i
, sk_out out
, void *data
) {
158 SK_DEFOUT(sk_out_tee
) {
160 sk_out_tee_data
*d
= data
;
162 for (i
=0; i
<d
->nout
; i
++)
163 flag
&= (*(d
->outs
[i
]))(d
->outd
[i
], t
, nx
, x
, nc
, c
);
167 void sk_out_tee_free(sk_out_tee_data
*d
) {
173 /* temporal average / downsample */
175 struct sk_out_tavg_data
{
182 sk_out_tavg_data
*sk_out_tavg_alloc() {
183 return sk_malloc (sizeof(sk_out_tavg_data
));
186 int sk_out_tavg_init(sk_out_tavg_data
*d
, int len
, sk_out out
, void *outd
) {
197 SK_DEFOUT(sk_out_tavg
) {
202 #define ALL(lim) for(i=0;i<(lim);i++)
204 d
->x
= sk_malloc (sizeof(double) * nx
);
205 d
->c
= sk_malloc (sizeof(double) * nc
);
206 ALL(nx
) d
->x
[i
] = 0.0;
207 ALL(nc
) d
->c
[i
] = 0.0;
210 ALL(nx
) d
->x
[i
] += x
[i
];
211 ALL(nc
) d
->c
[i
] += c
[i
];
214 if (d
->pos
==d
->len
) {
215 ALL(nx
) d
->x
[i
] /= d
->len
;
216 ALL(nc
) d
->c
[i
] /= d
->len
;
218 flag
= (*(d
->out
))(d
->outd
, d
->t
, nx
, d
->x
, nc
, d
->c
);
220 ALL(nx
) d
->x
[i
] = 0.0;
221 ALL(nc
) d
->c
[i
] = 0.0;
228 void sk_out_tavg_free(sk_out_tavg_data
*d
) {
229 if (d
->x
!=NULL
) sk_free(d
->x
);
230 if (d
->c
!=NULL
) sk_free(d
->c
);
234 /* spatial filter (bank)
236 * xfilts laid out as filter per row, i.e. shape [nfilt nx] & [nfilt nc]
239 struct sk_out_sfilt_data
{
241 double *xfilts
, *cfilts
, *x
, *c
;
246 sk_out_sfilt_data
*sk_out_sfilt_alloc() {
247 return sk_malloc (sizeof(sk_out_sfilt_data
));
250 int sk_out_sfilt_init(sk_out_sfilt_data
*d
, int nfilt
, int filtlen
,
251 double *xfilts
, double *cfilts
, sk_out out
, void *outd
) {
254 d
->filtlen
= filtlen
;
255 nb
= nfilt
* filtlen
* sizeof(double);
256 d
->xfilts
= sk_malloc(nb
);
257 d
->cfilts
= sk_malloc(nb
);
258 d
->x
= sk_malloc (sizeof(double) * nfilt
);
259 d
->c
= sk_malloc (sizeof(double) * nfilt
);
260 memcpy(d
->xfilts
, xfilts
, nb
);
261 memcpy(d
->cfilts
, cfilts
, nb
);
267 SK_DEFOUT(sk_out_sfilt
) {
269 sk_out_sfilt_data
*d
= data
;
270 /* unused */ (void) nx
; (void) nc
;
271 for (i
=0; i
<d
->nfilt
; i
++) {
272 d
->x
[i
] = d
->c
[i
] = 0.0;
273 for (j
=0; j
<d
->filtlen
; j
++) {
274 d
->x
[i
] += d
->xfilts
[i
*d
->filtlen
+j
] * x
[j
];
275 d
->c
[i
] += d
->cfilts
[i
*d
->filtlen
+j
] * c
[j
];
278 return (*(d
->out
))(d
->outd
, t
, d
->nfilt
, d
->x
, d
->nfilt
, d
->c
);
281 void sk_out_sfilt_free(sk_out_sfilt_data
*d
) {
289 FILE *sk_out_file_get_fd(sk_out_file_data
*d
) { return d
->fd
; }
290 int sk_out_mem_get_capacity(sk_out_mem_data
*d
) { return d
->capacity
; }
291 int sk_out_tee_get_nout(sk_out_tee_data
*d
) { return d
->nout
; }
292 int sk_out_tee_outs_is_null(sk_out_tee_data
*d
) { return d
->outs
== NULL
; }
293 int sk_out_tee_outd_is_null(sk_out_tee_data
*d
) { return d
->outd
== NULL
; }
294 sk_out
sk_out_tee_get_out_i(sk_out_tee_data
*d
, int i
) { return d
->outs
[i
]; }
295 void *sk_out_tee_get_outd_i(sk_out_tee_data
*d
, int i
) { return d
->outd
[i
]; }
296 int sk_out_tavg_get_len(sk_out_tavg_data
*d
) { return d
->len
; }
297 int sk_out_tavg_get_pos(sk_out_tavg_data
*d
) { return d
->pos
; }
298 double sk_out_tavg_get_t(sk_out_tavg_data
*d
) { return d
->t
; }
299 sk_out
sk_out_tavg_get_out(sk_out_tavg_data
*d
) { return d
->out
; }
300 void *sk_out_tavg_get_outd(sk_out_tavg_data
*d
) { return d
->outd
; }
301 double *sk_out_tavg_get_x(sk_out_tavg_data
*d
) { return d
->x
; }
302 double *sk_out_tavg_get_c(sk_out_tavg_data
*d
) { return d
->c
; }
303 int sk_out_sfilt_get_nfilt(sk_out_sfilt_data
*d
) { return d
->nfilt
; }
304 int sk_out_sfilt_get_filtlen(sk_out_sfilt_data
*d
) { return d
->filtlen
; }
305 double *sk_out_sfilt_get_xfilts(sk_out_sfilt_data
*d
) { return d
->xfilts
; }
306 double *sk_out_sfilt_get_cfilts(sk_out_sfilt_data
*d
) { return d
->cfilts
; }
307 double *sk_out_sfilt_get_x(sk_out_sfilt_data
*d
) { return d
->x
; }
308 double *sk_out_sfilt_get_c(sk_out_sfilt_data
*d
) { return d
->c
; }
309 sk_out
sk_out_sfilt_get_out(sk_out_sfilt_data
*d
) { return d
->out
; }
310 void *sk_out_sfilt_get_outd(sk_out_sfilt_data
*d
) { return d
->outd
; }