Changeset d95ff38 for src/spectral/statistics.c
- Timestamp:
- Dec 4, 2009, 1:38:30 AM (14 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- 741bdda
- Parents:
- 0b9a02a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/spectral/statistics.c
r0b9a02a rd95ff38 24 24 25 25 smpl_t 26 cvec_sum _channel (cvec_t * s, uint_t i)26 cvec_sum (cvec_t * s) 27 27 { 28 28 uint_t j; 29 29 smpl_t tmp = 0.0; 30 for (j = 0; j < s->length; j++) 31 tmp += s->norm[i][j]; 30 for (j = 0; j < s->length; j++) { 31 tmp += s->norm[j]; 32 } 32 33 return tmp; 33 34 } 34 35 35 36 smpl_t 36 cvec_mean _channel (cvec_t * s, uint_t i)37 cvec_mean (cvec_t * s) 37 38 { 38 return cvec_sum _channel(s, i) / (smpl_t) (s->length);39 return cvec_sum (s) / (smpl_t) (s->length); 39 40 } 40 41 41 42 smpl_t 42 cvec_centroid _channel (cvec_t * spec, uint_t i)43 cvec_centroid (cvec_t * spec) 43 44 { 44 45 smpl_t sum = 0., sc = 0.; 45 46 uint_t j; 46 sum = cvec_sum _channel (spec, i);47 sum = cvec_sum (spec); 47 48 if (sum == 0.) { 48 49 return 0.; 49 50 } else { 50 51 for (j = 0; j < spec->length; j++) { 51 sc += (smpl_t) j *spec->norm[ i][j];52 sc += (smpl_t) j *spec->norm[j]; 52 53 } 53 54 return sc / sum; … … 56 57 57 58 smpl_t 58 cvec_moment _channel (cvec_t * spec, uint_t i, uint_t order)59 cvec_moment (cvec_t * spec, uint_t order) 59 60 { 60 61 smpl_t sum = 0., centroid = 0., sc = 0.; 61 62 uint_t j; 62 sum = cvec_sum _channel (spec, i);63 sum = cvec_sum (spec); 63 64 if (sum == 0.) { 64 65 return 0.; 65 66 } else { 66 centroid = cvec_centroid _channel (spec, i);67 centroid = cvec_centroid (spec); 67 68 for (j = 0; j < spec->length; j++) { 68 sc += (smpl_t) POW(j - centroid, order) * spec->norm[ i][j];69 sc += (smpl_t) POW(j - centroid, order) * spec->norm[j]; 69 70 } 70 71 return sc / sum; … … 76 77 fvec_t * desc) 77 78 { 78 uint_t i; 79 for (i = 0; i < spec->channels; i++) { 80 desc->data[i][0] = cvec_centroid_channel (spec, i); 81 } 79 desc->data[0] = cvec_centroid (spec); 82 80 } 83 81 … … 86 84 fvec_t * desc) 87 85 { 88 uint_t i; 89 for (i = 0; i < spec->channels; i++) { 90 desc->data[i][0] = cvec_moment_channel (spec, i, 2); 91 } 86 desc->data[0] = cvec_moment (spec, 2); 92 87 } 93 88 … … 96 91 fvec_t * desc) 97 92 { 98 uint_t i; smpl_t spread; 99 for (i = 0; i < spec->channels; i++) { 100 spread = cvec_moment_channel (spec, i, 2); 101 if (spread == 0) { 102 desc->data[i][0] = 0.; 103 } else { 104 desc->data[i][0] = cvec_moment_channel (spec, i, 3); 105 desc->data[i][0] /= POW ( SQRT (spread), 3); 106 } 93 smpl_t spread; 94 spread = cvec_moment (spec, 2); 95 if (spread == 0) { 96 desc->data[0] = 0.; 97 } else { 98 desc->data[0] = cvec_moment (spec, 3); 99 desc->data[0] /= POW ( SQRT (spread), 3); 107 100 } 108 101 } … … 112 105 fvec_t * desc) 113 106 { 114 uint_t i; smpl_t spread; 115 for (i = 0; i < spec->channels; i++) { 116 spread = cvec_moment_channel (spec, i, 2); 117 if (spread == 0) { 118 desc->data[i][0] = 0.; 119 } else { 120 desc->data[i][0] = cvec_moment_channel (spec, i, 4); 121 desc->data[i][0] /= SQR (spread); 122 } 107 smpl_t spread; 108 spread = cvec_moment (spec, 2); 109 if (spread == 0) { 110 desc->data[0] = 0.; 111 } else { 112 desc->data[0] = cvec_moment (spec, 4); 113 desc->data[0] /= SQR (spread); 123 114 } 124 115 } … … 128 119 fvec_t * desc) 129 120 { 130 uint_t i,j;121 uint_t j; 131 122 smpl_t norm = 0, sum = 0.; 132 123 // compute N * sum(j**2) - sum(j)**2 … … 137 128 // sum_0^N(j) = length * (length + 1) / 2 138 129 norm -= SQR( (spec->length) * (spec->length - 1.) / 2. ); 139 for (i = 0; i < spec->channels; i++) { 140 sum = cvec_sum_channel (spec, i); 141 desc->data[i][0] = 0.; 142 if (sum == 0.) { 143 break; 144 } else { 145 for (j = 0; j < spec->length; j++) { 146 desc->data[i][0] += j * spec->norm[i][j]; 147 } 148 desc->data[i][0] *= spec->length; 149 desc->data[i][0] -= sum * spec->length * (spec->length - 1) / 2.; 150 desc->data[i][0] /= norm; 151 desc->data[i][0] /= sum; 130 sum = cvec_sum (spec); 131 desc->data[0] = 0.; 132 if (sum == 0.) { 133 return; 134 } else { 135 for (j = 0; j < spec->length; j++) { 136 desc->data[0] += j * spec->norm[j]; 152 137 } 138 desc->data[0] *= spec->length; 139 desc->data[0] -= sum * spec->length * (spec->length - 1) / 2.; 140 desc->data[0] /= norm; 141 desc->data[0] /= sum; 153 142 } 154 143 } … … 158 147 fvec_t * desc) 159 148 { 160 uint_t i, j; smpl_t sum; 161 for (i = 0; i < spec->channels; i++) { 162 sum = cvec_sum_channel (spec, i); 163 desc->data[i][0] = 0; 164 if (sum == 0.) { 165 break; 166 } else { 167 sum -= spec->norm[i][0]; 168 for (j = 1; j < spec->length; j++) { 169 desc->data[i][0] += (spec->norm[i][j] - spec->norm[i][0]) / j; 170 } 171 desc->data[i][0] /= sum; 149 uint_t j; smpl_t sum; 150 sum = cvec_sum (spec); 151 desc->data[0] = 0; 152 if (sum == 0.) { 153 return; 154 } else { 155 sum -= spec->norm[0]; 156 for (j = 1; j < spec->length; j++) { 157 desc->data[0] += (spec->norm[j] - spec->norm[0]) / j; 172 158 } 159 desc->data[0] /= sum; 173 160 } 174 161 } … … 178 165 fvec_t *desc) 179 166 { 180 uint_t i, j; smpl_t cumsum, rollsum; 181 for (i = 0; i < spec->channels; i++) { 182 cumsum = 0.; rollsum = 0.; 183 for (j = 0; j < spec->length; j++) { 184 cumsum += SQR (spec->norm[i][j]); 167 uint_t j; smpl_t cumsum, rollsum; 168 cumsum = 0.; rollsum = 0.; 169 for (j = 0; j < spec->length; j++) { 170 cumsum += SQR (spec->norm[j]); 171 } 172 if (cumsum == 0) { 173 desc->data[0] = 0.; 174 } else { 175 cumsum *= 0.95; 176 j = 0; 177 while (rollsum < cumsum) { 178 rollsum += SQR (spec->norm[j]); 179 j++; 185 180 } 186 if (cumsum == 0) { 187 desc->data[i][0] = 0.; 188 } else { 189 cumsum *= 0.95; 190 j = 0; 191 while (rollsum < cumsum) { 192 rollsum += SQR (spec->norm[i][j]); 193 j++; 194 } 195 desc->data[i][0] = j; 196 } 181 desc->data[0] = j; 197 182 } 198 183 }
Note: See TracChangeset
for help on using the changeset viewer.