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 }