Mercurial > hg > libxtract
comparison src/vector.c @ 111:c7e1fe63eedb
- Re-factoring in xtract_spectrum and fixed normalisation bug
- Fixed bug in xtract_lnorm
author | Jamie Bullock <jamie@postlude.co.uk> |
---|---|
date | Wed, 02 Jan 2008 02:26:13 +0000 |
parents | c8502708853b |
children | a76501dc5307 |
comparison
equal
deleted
inserted
replaced
110:c8502708853b | 111:c7e1fe63eedb |
---|---|
45 | 45 |
46 int xtract_spectrum(const float *data, const int N, const void *argv, float *result){ | 46 int xtract_spectrum(const float *data, const int N, const void *argv, float *result){ |
47 | 47 |
48 float *input, *rfft, q, temp, max; | 48 float *input, *rfft, q, temp, max; |
49 size_t bytes; | 49 size_t bytes; |
50 int n, | 50 int n, |
51 m, | |
51 NxN, | 52 NxN, |
52 M, | 53 M, |
53 vector, | 54 vector, |
54 withDC, | 55 withDC, |
55 argc, | 56 argc, |
89 if ((temp = XTRACT_SQ(rfft[n]) + | 90 if ((temp = XTRACT_SQ(rfft[n]) + |
90 XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT) | 91 XTRACT_SQ(rfft[N - n])) > XTRACT_LOG_LIMIT) |
91 temp = log(sqrt(temp) / N); | 92 temp = log(sqrt(temp) / N); |
92 else | 93 else |
93 temp = XTRACT_LOG_LIMIT_DB; | 94 temp = XTRACT_LOG_LIMIT_DB; |
94 if(withDC) { | 95 |
95 result[n] = | 96 if(withDC){ |
96 /*Normalise*/ | 97 m = n; |
97 (temp + XTRACT_DB_SCALE_OFFSET) / | 98 result[M + m + 1] = n * q; |
98 XTRACT_DB_SCALE_OFFSET; | 99 } |
99 result[M + n + 1] = n * q; | 100 else{ |
100 } | 101 m = n - 1; |
101 else { | 102 result[M + m] = n * q; |
102 result[n - 1] = | 103 } |
103 (temp + XTRACT_DB_SCALE_OFFSET) / | 104 |
104 XTRACT_DB_SCALE_OFFSET; | 105 result[m] = |
105 result[M + n - 1] = n * q; | 106 /* Scaling */ |
106 } | 107 (temp + XTRACT_DB_SCALE_OFFSET) / |
107 max = result[n] > max ? result[n] : max; | 108 XTRACT_DB_SCALE_OFFSET; |
109 | |
110 max = result[m] > max ? result[m] : max; | |
108 } | 111 } |
109 break; | 112 break; |
110 | 113 |
111 case XTRACT_POWER_SPECTRUM: | 114 case XTRACT_POWER_SPECTRUM: |
112 for(n = 1; n < M; n++){ | 115 for(n = 1; n < M; n++){ |
113 if(withDC){ | 116 if(withDC){ |
114 result[n] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) | 117 m = n; |
115 / NxN; | 118 result[M + m + 1] = n * q; |
116 result[M + n + 1] = n * q; | 119 } |
117 } | 120 else{ |
118 else { | 121 m = n - 1; |
119 result[n - 1] = | 122 result[M + m] = n * q; |
120 (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN; | 123 } |
121 result[M + n - 1] = n * q; | 124 result[m] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN; |
122 } | 125 max = result[m] > max ? result[m] : max; |
123 max = result[n] > max ? result[n] : max; | |
124 } | 126 } |
125 break; | 127 break; |
126 | 128 |
127 case XTRACT_LOG_POWER_SPECTRUM: | 129 case XTRACT_LOG_POWER_SPECTRUM: |
128 for(n = 1; n < M; n++){ | 130 for(n = 1; n < M; n++){ |
129 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) > | 131 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) > |
130 XTRACT_LOG_LIMIT) | 132 XTRACT_LOG_LIMIT) |
131 temp = log(temp / NxN); | 133 temp = log(temp / NxN); |
132 else | 134 else |
133 temp = XTRACT_LOG_LIMIT_DB; | 135 temp = XTRACT_LOG_LIMIT_DB; |
134 if(withDC){ | 136 |
135 result[n] = (temp + XTRACT_DB_SCALE_OFFSET) / | 137 if(withDC){ |
138 m = n; | |
139 result[M + m + 1] = n * q; | |
140 } | |
141 else{ | |
142 m = n - 1; | |
143 result[M + m] = n * q; | |
144 } | |
145 | |
146 result[m] = (temp + XTRACT_DB_SCALE_OFFSET) / | |
136 XTRACT_DB_SCALE_OFFSET; | 147 XTRACT_DB_SCALE_OFFSET; |
137 result[M + n + 1] = n * q; | 148 max = result[m] > max ? result[m] : max; |
138 } | |
139 else { | |
140 result[n - 1] = (temp + XTRACT_DB_SCALE_OFFSET) / | |
141 XTRACT_DB_SCALE_OFFSET; | |
142 result[M + n - 1] = n * q; | |
143 } | |
144 max = result[n] > max ? result[n] : max; | |
145 } | 149 } |
146 break; | 150 break; |
147 | 151 |
148 default: | 152 default: |
149 /* MAGNITUDE_SPECTRUM */ | 153 /* MAGNITUDE_SPECTRUM */ |
150 for(n = 1; n < M; n++){ | 154 for(n = 1; n < M; n++){ |
151 if(withDC){ | 155 if(withDC){ |
152 result[n] = sqrt(XTRACT_SQ(rfft[n]) + | 156 m = n; |
153 XTRACT_SQ(rfft[N - n])) / N; | 157 result[M + m + 1] = n * q; |
154 result[M + n + 1] = n * q; | 158 } |
155 } | 159 else{ |
156 else { | 160 m = n - 1; |
157 result[n - 1] = sqrt(XTRACT_SQ(rfft[n]) + | 161 result[M + m] = n * q; |
158 XTRACT_SQ(rfft[N - n])) / N; | 162 } |
159 result[M + n - 1] = n * q; | 163 |
160 } | 164 result[m] = sqrt(XTRACT_SQ(rfft[n]) + |
161 max = result[n] > max ? result[n] : max; | 165 XTRACT_SQ(rfft[N - n])) / N; |
166 max = result[m] > max ? result[m] : max; | |
162 } | 167 } |
163 break; | 168 break; |
164 } | 169 } |
165 | 170 |
166 if(withDC){ | 171 if(withDC){ |
170 max = result[0] > max ? result[0] : max; | 175 max = result[0] > max ? result[0] : max; |
171 /* The Nyquist */ | 176 /* The Nyquist */ |
172 result[M] = XTRACT_SQ(rfft[M]); | 177 result[M] = XTRACT_SQ(rfft[M]); |
173 result[N + 1] = q * M; | 178 result[N + 1] = q * M; |
174 max = result[M] > max ? result[M] : max; | 179 max = result[M] > max ? result[M] : max; |
175 M++; /* So we normalise the Nyquist (below) */ | |
176 } | 180 } |
177 else { | 181 else { |
178 /* The Nyquist */ | 182 /* The Nyquist */ |
179 result[M - 1] = (float)XTRACT_SQ(rfft[M]); | 183 result[M - 1] = (float)XTRACT_SQ(rfft[M]); |
180 result[N - 1] = q * M; | 184 result[N - 1] = q * M; |
181 max = result[M - 1] > max ? result[M - 1] : max; | 185 max = result[M - 1] > max ? result[M - 1] : max; |
182 } | 186 } |
183 | |
184 | 187 |
185 if(normalise){ | 188 if(normalise){ |
186 for(n = 0; n < M; n++) | 189 for(n = 0; n < M; n++) |
187 result[n] /= max; | 190 result[n] /= max; |
188 } | 191 } |