Ignore:
Timestamp:
Dec 4, 2009, 1:38:30 AM (14 years ago)
Author:
Paul Brossier <piem@piem.org>
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
Message:

src/spectral: switch to mono

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/spectral/statistics.c

    r0b9a02a rd95ff38  
    2424
    2525smpl_t
    26 cvec_sum_channel (cvec_t * s, uint_t i)
     26cvec_sum (cvec_t * s)
    2727{
    2828  uint_t j;
    2929  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  }
    3233  return tmp;
    3334}
    3435
    3536smpl_t
    36 cvec_mean_channel (cvec_t * s, uint_t i)
     37cvec_mean (cvec_t * s)
    3738{
    38   return cvec_sum_channel(s, i) / (smpl_t) (s->length);
     39  return cvec_sum (s) / (smpl_t) (s->length);
    3940}
    4041
    4142smpl_t
    42 cvec_centroid_channel (cvec_t * spec, uint_t i)
     43cvec_centroid (cvec_t * spec)
    4344{
    4445  smpl_t sum = 0., sc = 0.;
    4546  uint_t j;
    46   sum = cvec_sum_channel (spec, i);
     47  sum = cvec_sum (spec);
    4748  if (sum == 0.) {
    4849    return 0.;
    4950  } else {
    5051    for (j = 0; j < spec->length; j++) {
    51       sc += (smpl_t) j *spec->norm[i][j];
     52      sc += (smpl_t) j *spec->norm[j];
    5253    }
    5354    return sc / sum;
     
    5657
    5758smpl_t
    58 cvec_moment_channel (cvec_t * spec, uint_t i, uint_t order)
     59cvec_moment (cvec_t * spec, uint_t order)
    5960{
    6061  smpl_t sum = 0., centroid = 0., sc = 0.;
    6162  uint_t j;
    62   sum = cvec_sum_channel (spec, i);
     63  sum = cvec_sum (spec);
    6364  if (sum == 0.) {
    6465    return 0.;
    6566  } else {
    66     centroid = cvec_centroid_channel (spec, i);
     67    centroid = cvec_centroid (spec);
    6768    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];
    6970    }
    7071    return sc / sum;
     
    7677    fvec_t * desc)
    7778{
    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);
    8280}
    8381
     
    8684    fvec_t * desc)
    8785{
    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);
    9287}
    9388
     
    9691    fvec_t * desc)
    9792{
    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);
    107100  }
    108101}
     
    112105    fvec_t * desc)
    113106{
    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);
    123114  }
    124115}
     
    128119    fvec_t * desc)
    129120{
    130   uint_t i, j;
     121  uint_t j;
    131122  smpl_t norm = 0, sum = 0.;
    132123  // compute N * sum(j**2) - sum(j)**2
     
    137128  // sum_0^N(j) = length * (length + 1) / 2
    138129  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];
    152137    }
     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;
    153142  }
    154143}
     
    158147    fvec_t * desc)
    159148{
    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;
    172158    }
     159    desc->data[0] /= sum;
    173160  }
    174161}
     
    178165    fvec_t *desc)
    179166{
    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++;
    185180    }
    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;
    197182  }
    198183}
Note: See TracChangeset for help on using the changeset viewer.