1
[+ AutoGen5 template c +]
3
* Last Change: Tue Nov 28 03:00 PM 2006 J
6
* TODO: is size_t 64 bits long on 64 bits machines ?
8
#include <stddef.h> /* for size_t */
9
#include <stdio.h> /* for size_t */
11
#include "autocorr_nofft.h"
14
* NOFFT auto correlation
19
* [+ (get "type_name") +] version; out must have a size of lag+1, already pre allocated
21
* lag should be < size
23
* returns 0 is succesfull, other value otherwise.
25
int [+ (get "short_name") +]_xcorr_nofft_1d(const [+ (get "type_name") +] *in,
26
const size_t size, [+ (get "type_name") +] *out, const size_t lag)
29
[+ (get "type_name") +] acc;
33
for (i = 0; i < size; ++i) {
39
for (i = 1; i <= lag; ++i) {
41
for (j = i; j < size; ++j) {
49
[+ ENDFOR float_type +]
53
* [+ (get "type_name") +] version for non contiguous arrays; the corresponding
54
* array should have at least in_size elements.
57
* - lag should be < in_size
59
* - TODO: check if should be aligned ?
61
* returns 0 is succesfull, other value otherwise.
63
int [+ (get "short_name") +]_xcorr_nofft_1d_noncontiguous(const [+ (get "type_name") +] *in, size_t in_size,
64
size_t in_stride, [+ (get "type_name") +] *out, size_t out_stride, size_t lag)
67
size_t istride = in_stride / sizeof([+ (get "type_name") +]);
68
size_t ostride = out_stride / sizeof([+ (get "type_name") +]);
69
[+ (get "type_name") +] acc;
73
for (i = 0; i < in_size * istride; i+= istride) {
79
for (i = 1; i <= lag ; ++i) {
82
for (j = clag; j < in_size * istride; j += istride) {
83
acc += in[j-clag]*in[j];
85
out[i * ostride] = acc;
90
[+ ENDFOR float_type +]
94
* For rank 2 arrays, contiguous cases
95
* [+ (get "type_name") +] version; out must have a size of lag+1, already pre allocated
97
* lag should be < size
99
* returns 0 is succesfull, other value otherwise.
101
int [+ (get "short_name") +]_xcorr_nofft_2d(const [+ (get "type_name") +] *in,
102
size_t dim0, size_t dim1, [+ (get "type_name") +] *out, const size_t lag)
105
[+ (get "type_name") +] *coaxis;
108
for(i = 0; i < dim0; ++i) {
109
fprintf(stdout, "%d 1d autocorr, first element is %f\n", i, in[i * dim1]);
112
for(i = 0; i < dim0; ++i) {
113
coaxis = out + i * (lag + 1);
114
[+ (get "short_name") +]_xcorr_nofft_1d(in + i * dim1, dim1, coaxis, lag);
119
[+ ENDFOR float_type +]
123
* For rank 2 arrays, non contiguous cases
124
* [+ (get "type_name") +] version; out must have a size of lag+1, already pre allocated
126
* lag should be < size
128
* returns 0 is succesfull, other value otherwise.
130
int [+ (get "short_name") +]_xcorr_nofft_2d_noncontiguous(const [+ (get "type_name") +] *in,
131
size_t dim0, size_t dim1, size_t in_stride0, size_t in_stride1,
132
[+ (get "type_name") +] *out, size_t out_stride0, size_t out_stride1,
137
size_t istride0 = in_stride0 / sizeof([+ (get "type_name") +]);
138
size_t ostride0 = out_stride0 / sizeof([+ (get "type_name") +]);
140
[+ (get "type_name") +] *coaxis;
142
fprintf(stdout, "%s: shape is (%d, %d)\n", __func__, dim0, dim1);
143
fprintf(stdout, "%s: istrides are (%d, %d)\n", __func__, istride0, istride1);
145
fprintf(stdout, "%s: ostrides are (%d, %d)\n", __func__, ostride0, ostride1);
146
for(i = 0; i < dim0; ++i) {
147
ciaxis = in + i * istride0;
148
coaxis = out + i * istride0;
149
fprintf(stdout, "%d 1d autocorr, first element is %f, last is %f (%d el)\n",
150
i, ciaxis[0], ciaxis[(dim1-1) * istride1], dim1);
154
for(i = 0; i < dim0; ++i) {
155
coaxis = out + i * ostride0;
156
[+ (get "short_name") +]_xcorr_nofft_1d_noncontiguous(in + i * istride0, dim1, in_stride1,
157
coaxis, out_stride1, lag);
161
[+ ENDFOR float_type +]