annotate sv/filter/DSP.cpp @ 99:ca1f73f027f5

fix the play checkBox bug
author benoitrigolleau
date Wed, 11 Jul 2007 12:18:15 +0000
parents 8ebc85f6ce4e
children b8969a96b678
rev   line source
lbajardsilogic@79 1 //#include "stdafx.h"
lbajardsilogic@79 2 #include "DSP.h"
lbajardsilogic@79 3 #include "math.h"
lbajardsilogic@79 4 #include <cassert>
lbajardsilogic@79 5 #include <cmath>
lbajardsilogic@79 6 extern int currentposition;
lbajardsilogic@79 7 extern float lastfactor;
lbajardsilogic@79 8 extern float hopfactor;
lbajardsilogic@79 9
lbajardsilogic@79 10
lbajardsilogic@79 11 //These variables are only required for find peaks...the same variables are passed in to other functions
lbajardsilogic@79 12 extern int numpeaks;
lbajardsilogic@79 13 extern float *peak_locations;
lbajardsilogic@79 14 extern float *p_mags;
lbajardsilogic@79 15 extern float *c_mags;
lbajardsilogic@79 16
lbajardsilogic@79 17 void intobyte(int num, char* pbyte1 ,char* pbyte2)
lbajardsilogic@79 18 {
lbajardsilogic@79 19
lbajardsilogic@79 20
lbajardsilogic@79 21 char firstByte = (num & 0xff);
lbajardsilogic@79 22 int secondByteInt = (num & 0xff00);
lbajardsilogic@79 23 secondByteInt = secondByteInt>>8;
lbajardsilogic@79 24 char secondByte = secondByteInt;
lbajardsilogic@79 25
lbajardsilogic@79 26 /*int thirdByteInt = (array[i] & 0xff0000);
lbajardsilogic@79 27 thirdByteInt = thirdByteInt>>16;
lbajardsilogic@79 28 char thirdByte = thirdByteInt;
lbajardsilogic@79 29
lbajardsilogic@79 30 int fourthByteInt = (array[i] & 0xff000000);
lbajardsilogic@79 31 fourthByteInt = fourthByteInt>>24;
lbajardsilogic@79 32 char fourthByte = fourthByteInt;*/
lbajardsilogic@79 33
lbajardsilogic@79 34
lbajardsilogic@79 35 *pbyte1 = firstByte;
lbajardsilogic@79 36 *pbyte2 = secondByte;
lbajardsilogic@79 37 }
lbajardsilogic@79 38
lbajardsilogic@79 39
lbajardsilogic@79 40 void cart2pol(float* cart, float* mags, float* phases, int framesize)
lbajardsilogic@79 41 {
lbajardsilogic@79 42 int length=framesize/2;
lbajardsilogic@79 43 for (int f = 0; f<length; f++)
lbajardsilogic@79 44 {
lbajardsilogic@79 45
lbajardsilogic@79 46 mags[f]=sqrt((cart[f]*cart[f])+(cart[length+f]*cart[length+f]));
lbajardsilogic@79 47
lbajardsilogic@79 48
lbajardsilogic@79 49 phases[f]=atan2((double)(-1*cart[f+length]),(double)(cart[f]));
lbajardsilogic@79 50
lbajardsilogic@79 51
lbajardsilogic@79 52
lbajardsilogic@79 53 }
lbajardsilogic@79 54
lbajardsilogic@79 55
lbajardsilogic@79 56 }
lbajardsilogic@79 57
lbajardsilogic@79 58 void pol2cart(float* cart, float* mags, float* phases, int framesize)
lbajardsilogic@79 59 {
lbajardsilogic@79 60 int length=framesize/2;
lbajardsilogic@79 61 for (int f = 0; f<length; f++)
lbajardsilogic@79 62 {
lbajardsilogic@79 63
lbajardsilogic@79 64 cart[f]=mags[f]*cos(phases[f]);
lbajardsilogic@79 65 cart[length+f]=-(mags[f]*sin(phases[f]));
lbajardsilogic@79 66
lbajardsilogic@79 67
lbajardsilogic@79 68 }
lbajardsilogic@79 69
lbajardsilogic@79 70
lbajardsilogic@79 71 }
lbajardsilogic@79 72
lbajardsilogic@79 73 void hanning(float* window, int framesize)
lbajardsilogic@79 74 {
lbajardsilogic@79 75 for (int f = 0; f<framesize; f++)
lbajardsilogic@79 76 {
lbajardsilogic@79 77
lbajardsilogic@79 78 window[f]= (0.5*(1-cos(2*PI*(f+1)/(framesize+1))));
lbajardsilogic@79 79 }
lbajardsilogic@79 80 }
lbajardsilogic@79 81
lbajardsilogic@79 82 void updatephases(float* c_phase,float* p_phase,float* c_synthphase,float* p_synthphase, int framesize,float hopfactor,float interpfactor)
lbajardsilogic@79 83 {
lbajardsilogic@79 84
lbajardsilogic@79 85 float synth_hopsize=framesize/4;
lbajardsilogic@79 86 float actual_anhop=floor(hopfactor*synth_hopsize);
lbajardsilogic@79 87 float anhop = floor((hopfactor*synth_hopsize)/interpfactor);
lbajardsilogic@79 88 float inst_freq;
lbajardsilogic@79 89 float omega_k;
lbajardsilogic@79 90 float delta_phi;
lbajardsilogic@79 91 float a, k;
lbajardsilogic@79 92
lbajardsilogic@79 93 for (int f = 0; f<(framesize/2); f++)
lbajardsilogic@79 94 {
lbajardsilogic@79 95
lbajardsilogic@79 96 //float bin = (f/(float)framesize);
lbajardsilogic@79 97
lbajardsilogic@79 98 interpfactor;
lbajardsilogic@79 99
lbajardsilogic@79 100 omega_k=(2*PI*f)/float(framesize); //This is the predicted angular freqency rads/sec of the centre frequency
lbajardsilogic@79 101
lbajardsilogic@79 102 delta_phi=(c_phase[f]-p_phase[f])-(anhop*omega_k);
lbajardsilogic@79 103
lbajardsilogic@79 104 a = delta_phi/(2*PI);
lbajardsilogic@79 105
lbajardsilogic@79 106 k = floor(a+0.5);
lbajardsilogic@79 107
lbajardsilogic@79 108 delta_phi = delta_phi-k*2*PI;
lbajardsilogic@79 109
lbajardsilogic@79 110 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 111
lbajardsilogic@79 112
lbajardsilogic@79 113
lbajardsilogic@79 114 c_synthphase[f] = p_synthphase[f]+(inst_freq*synth_hopsize);
lbajardsilogic@79 115
lbajardsilogic@79 116 if (currentposition<actual_anhop){c_synthphase[f] = c_phase[f];}
lbajardsilogic@79 117
lbajardsilogic@79 118 p_synthphase[f] = c_synthphase[f];
lbajardsilogic@79 119
lbajardsilogic@79 120 p_phase[f] = c_phase[f];
lbajardsilogic@79 121
lbajardsilogic@79 122
lbajardsilogic@79 123
lbajardsilogic@79 124
lbajardsilogic@79 125
lbajardsilogic@79 126
lbajardsilogic@79 127 }
lbajardsilogic@79 128 }
lbajardsilogic@79 129
lbajardsilogic@79 130 void updatephases2(float* c_phase,float* p_phase,float* c_synthphase,float* p_synthphase, int framesize,float hopfactor,float interpfactor)
lbajardsilogic@79 131 {
lbajardsilogic@79 132
lbajardsilogic@79 133 float synth_hopsize=framesize/4;
lbajardsilogic@79 134 float actual_anhop=actual_anhop=floor(hopfactor*synth_hopsize);
lbajardsilogic@79 135 float anhop = floor((hopfactor*synth_hopsize)/interpfactor);
lbajardsilogic@79 136 float inst_freq;
lbajardsilogic@79 137 float omega_k;
lbajardsilogic@79 138 float delta_phi;
lbajardsilogic@79 139 float a, k;
lbajardsilogic@79 140
lbajardsilogic@79 141 for (int f = 0; f<(framesize/2); f++)
lbajardsilogic@79 142 {
lbajardsilogic@79 143
lbajardsilogic@79 144 //float bin = (f/(float)framesize);
lbajardsilogic@79 145
lbajardsilogic@79 146 interpfactor;
lbajardsilogic@79 147
lbajardsilogic@79 148 omega_k=(2*PI*f)/float(framesize); //This is the predicted angular freqency rads/sec of the centre frequency
lbajardsilogic@79 149
lbajardsilogic@79 150 delta_phi=(c_phase[f]-p_phase[f])-(anhop*omega_k);
lbajardsilogic@79 151
lbajardsilogic@79 152 a = delta_phi/(2*PI);
lbajardsilogic@79 153
lbajardsilogic@79 154 k = floor(a+0.5);
lbajardsilogic@79 155
lbajardsilogic@79 156 delta_phi = delta_phi-k*2*PI;
lbajardsilogic@79 157
lbajardsilogic@79 158 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 159
lbajardsilogic@79 160
lbajardsilogic@79 161
lbajardsilogic@79 162 c_synthphase[f] = p_synthphase[f]+(inst_freq*synth_hopsize);
lbajardsilogic@79 163
lbajardsilogic@79 164
lbajardsilogic@79 165
lbajardsilogic@79 166 if (currentposition<actual_anhop){c_synthphase[f] = c_phase[f];}
lbajardsilogic@79 167
lbajardsilogic@79 168 if (!(anhop==lastfactor)){c_synthphase[f]=c_phase[f];}
lbajardsilogic@79 169
lbajardsilogic@79 170
lbajardsilogic@79 171
lbajardsilogic@79 172 p_synthphase[f] = c_synthphase[f];
lbajardsilogic@79 173
lbajardsilogic@79 174
lbajardsilogic@79 175 p_phase[f] = c_phase[f];
lbajardsilogic@79 176
lbajardsilogic@79 177
lbajardsilogic@79 178
lbajardsilogic@79 179
lbajardsilogic@79 180
lbajardsilogic@79 181
lbajardsilogic@79 182 }
lbajardsilogic@79 183 lastfactor=anhop;
lbajardsilogic@79 184 }
lbajardsilogic@79 185
lbajardsilogic@79 186 void rotatephases(float* c_phase, float* p_phase, float* c_synthphase, float* p_synthphase, int framesize, float interpfactor)
lbajardsilogic@79 187 {
lbajardsilogic@79 188 float phase_diff;
lbajardsilogic@79 189 int diffhop = framesize/4;
lbajardsilogic@79 190
lbajardsilogic@79 191 float anhop = floor((diffhop)/interpfactor);
lbajardsilogic@79 192 float inst_freq;
lbajardsilogic@79 193 float omega_k;
lbajardsilogic@79 194 float delta_phi;
lbajardsilogic@79 195 float a, k;
lbajardsilogic@79 196
lbajardsilogic@79 197 //findpeaks(c_mags, p_mags, framesize, peak_locations, numpeaks);
lbajardsilogic@79 198
lbajardsilogic@79 199 for (int i=0; i<framesize/2; i++)
lbajardsilogic@79 200 {
lbajardsilogic@79 201
lbajardsilogic@79 202 phase_diff=(c_phase[i]-p_phase[i]);
lbajardsilogic@79 203
lbajardsilogic@79 204 omega_k=(2*PI*i)/float(framesize);
lbajardsilogic@79 205
lbajardsilogic@79 206 delta_phi=(phase_diff)-(anhop*omega_k);
lbajardsilogic@79 207
lbajardsilogic@79 208 a = delta_phi/(2*PI);
lbajardsilogic@79 209
lbajardsilogic@79 210 k = floor(a+0.5);
lbajardsilogic@79 211
lbajardsilogic@79 212 delta_phi = delta_phi-k*2*PI;
lbajardsilogic@79 213
lbajardsilogic@79 214 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 215
lbajardsilogic@79 216 c_synthphase[i]=p_synthphase[i]+(inst_freq*diffhop);
lbajardsilogic@79 217
lbajardsilogic@79 218 //c_synthphase[i]=p_synthphase[i]+(phase_diff);
lbajardsilogic@79 219
lbajardsilogic@79 220 //c_synthphase[i]=p_synthphase[i]+((phase_diff*diffhop)*interpfactor);
lbajardsilogic@79 221
lbajardsilogic@79 222 //if (currentposition<framesize/2 || (!(lastfactor==hopfactor))){c_synthphase[i] = c_phase[i];}
lbajardsilogic@79 223 if (currentposition<framesize/2){c_synthphase[i] = c_phase[i];}
lbajardsilogic@79 224
lbajardsilogic@79 225 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 226 }
lbajardsilogic@79 227
lbajardsilogic@79 228 lastfactor=hopfactor;
lbajardsilogic@79 229 }
lbajardsilogic@79 230
lbajardsilogic@79 231 void rotatephases_peaklocked(float* c_phase, float* p_phase, float* c_synthphase, float* p_synthphase, int framesize, float interpfactor)
lbajardsilogic@79 232 {
lbajardsilogic@79 233 float phase_diff;
lbajardsilogic@79 234 int diffhop = framesize/4;
lbajardsilogic@79 235
lbajardsilogic@79 236 float anhop = floor((diffhop)/interpfactor);
lbajardsilogic@79 237 float inst_freq;
lbajardsilogic@79 238 float omega_k;
lbajardsilogic@79 239 float delta_phi;
lbajardsilogic@79 240 float a, k;
lbajardsilogic@79 241 int start, end, i;
lbajardsilogic@79 242 float original_peak_phase;
lbajardsilogic@79 243 float cutoff;
lbajardsilogic@79 244
lbajardsilogic@79 245 cutoff = 10000;
lbajardsilogic@79 246
lbajardsilogic@79 247 cutoff = floor(cutoff/(44100/framesize));
lbajardsilogic@79 248
lbajardsilogic@79 249 numpeaks = findpeaks(c_mags, p_mags, framesize, peak_locations);
lbajardsilogic@79 250
lbajardsilogic@79 251 int p=1;
lbajardsilogic@79 252 //while(peak_locations[p]<cutoff)
lbajardsilogic@79 253 while(p<=numpeaks)
lbajardsilogic@79 254 {
lbajardsilogic@79 255
lbajardsilogic@79 256 i=peak_locations[p];
lbajardsilogic@79 257
lbajardsilogic@79 258 original_peak_phase=c_phase[i];
lbajardsilogic@79 259
lbajardsilogic@79 260 //start=i-2;
lbajardsilogic@79 261 //end=i+2;
lbajardsilogic@79 262
lbajardsilogic@79 263
lbajardsilogic@79 264 if (p==1){
lbajardsilogic@79 265 start=0;
lbajardsilogic@79 266 end=floor(peak_locations[p]+((peak_locations[p+1]-peak_locations[p])/2));
lbajardsilogic@79 267 }
lbajardsilogic@79 268
lbajardsilogic@79 269 else{
lbajardsilogic@79 270 if (p==numpeaks){
lbajardsilogic@79 271 start=floor(peak_locations[p-1]+((peak_locations[p]-peak_locations[p-1])/2));
lbajardsilogic@79 272 end=(framesize/2);
lbajardsilogic@79 273 }
lbajardsilogic@79 274 else {
lbajardsilogic@79 275 start=floor(peak_locations[p-1]+((peak_locations[p]-peak_locations[p-1])/2));
lbajardsilogic@79 276 end=floor(peak_locations[p]+((peak_locations[p+1]-peak_locations[p])/2));
lbajardsilogic@79 277 }
lbajardsilogic@79 278 }
lbajardsilogic@79 279
lbajardsilogic@79 280 phase_diff=(c_phase[i]-p_phase[i]);
lbajardsilogic@79 281 omega_k=(2*PI*i)/float(framesize);
lbajardsilogic@79 282 delta_phi=(phase_diff)-(anhop*omega_k);
lbajardsilogic@79 283 a = delta_phi/(2*PI);
lbajardsilogic@79 284 k = floor(a+0.5);
lbajardsilogic@79 285 delta_phi = delta_phi-k*2*PI;
lbajardsilogic@79 286 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 287 c_synthphase[i]=p_synthphase[i]+(inst_freq*diffhop);
lbajardsilogic@79 288 //c_synthphase[i]=p_synthphase[i]+(phase_diff);
lbajardsilogic@79 289 //c_synthphase[i]=p_synthphase[i]+((phase_diff*diffhop)*interpfactor);
lbajardsilogic@79 290 //if (currentposition<framesize/2 || (!(lastfactor==hopfactor))){c_synthphase[i] = c_phase[i];}
lbajardsilogic@79 291 if (currentposition<framesize/2){c_synthphase[i] = c_phase[i];}
lbajardsilogic@79 292 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 293
lbajardsilogic@79 294 int j;
lbajardsilogic@79 295 for (j=start; j<i; j++)
lbajardsilogic@79 296 {
lbajardsilogic@79 297 c_synthphase[j]=c_synthphase[i]-(original_peak_phase-c_phase[j]);
lbajardsilogic@79 298 p_synthphase[j]=c_synthphase[j];
lbajardsilogic@79 299 }
lbajardsilogic@79 300
lbajardsilogic@79 301 for (j=i+1; j<end; j++)
lbajardsilogic@79 302 {
lbajardsilogic@79 303 c_synthphase[j]=c_synthphase[i]-(original_peak_phase-c_phase[j]);
lbajardsilogic@79 304 p_synthphase[j]=c_synthphase[j];
lbajardsilogic@79 305 }
lbajardsilogic@79 306
lbajardsilogic@79 307
lbajardsilogic@79 308 p++;
lbajardsilogic@79 309 }
lbajardsilogic@79 310
lbajardsilogic@79 311 /*for (i=peak_locations[p]+1; i<(framesize/2); i++)
lbajardsilogic@79 312 {
lbajardsilogic@79 313 phase_diff=(c_phase[i]-p_phase[i]);
lbajardsilogic@79 314
lbajardsilogic@79 315 omega_k=(2*PI*i)/float(framesize);
lbajardsilogic@79 316
lbajardsilogic@79 317 delta_phi=(phase_diff)-(anhop*omega_k);
lbajardsilogic@79 318
lbajardsilogic@79 319 a = delta_phi/(2*PI);
lbajardsilogic@79 320
lbajardsilogic@79 321 k = floor(a+0.5);
lbajardsilogic@79 322
lbajardsilogic@79 323 delta_phi = delta_phi-k*2*PI;
lbajardsilogic@79 324
lbajardsilogic@79 325 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 326
lbajardsilogic@79 327 c_synthphase[i]=p_synthphase[i]+(inst_freq*diffhop);
lbajardsilogic@79 328
lbajardsilogic@79 329 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 330 } */
lbajardsilogic@79 331
lbajardsilogic@79 332 lastfactor=hopfactor;
lbajardsilogic@79 333 }
lbajardsilogic@79 334
lbajardsilogic@79 335
lbajardsilogic@79 336
lbajardsilogic@79 337 bool transient_detect(float* L_mags, float* R_mags, float* pL_mags, float* pR_mags, float drumthresh, float framesize)
lbajardsilogic@79 338 {
lbajardsilogic@79 339
lbajardsilogic@79 340 extern float *L_phase, *R_phase;
lbajardsilogic@79 341 int trans = 0;
lbajardsilogic@79 342
lbajardsilogic@79 343 for (int f = 0; f<(framesize/2); f++)
lbajardsilogic@79 344 {
lbajardsilogic@79 345
lbajardsilogic@79 346 if ((R_mags[f]-pR_mags[f])>0 &&
lbajardsilogic@79 347 (L_mags[f]-pL_mags[f])>0){trans++;}
lbajardsilogic@79 348
lbajardsilogic@79 349
lbajardsilogic@79 350 pR_mags[f]=R_mags[f];
lbajardsilogic@79 351 pL_mags[f]=L_mags[f];
lbajardsilogic@79 352
lbajardsilogic@79 353
lbajardsilogic@79 354 }
lbajardsilogic@79 355 drumthresh=(drumthresh/100)*(framesize/2);
lbajardsilogic@79 356
lbajardsilogic@79 357
lbajardsilogic@79 358 if (trans>=drumthresh)
lbajardsilogic@79 359 {
lbajardsilogic@79 360
lbajardsilogic@79 361 return true;
lbajardsilogic@79 362 }
lbajardsilogic@79 363 else{return false;}
lbajardsilogic@79 364 }
lbajardsilogic@79 365
lbajardsilogic@79 366 void sintable(float* sinewave, float length, float sr)
lbajardsilogic@79 367 {
lbajardsilogic@79 368 double pi=3.14179;
lbajardsilogic@79 369 double time;
lbajardsilogic@79 370 double amp, freq;
lbajardsilogic@79 371
lbajardsilogic@79 372 for (int i = 0; i<sr; i++)
lbajardsilogic@79 373
lbajardsilogic@79 374 {
lbajardsilogic@79 375 time=double(i*(1/sr));
lbajardsilogic@79 376 sinewave[i]=(amp)*(cos(2*pi*freq*(time)));
lbajardsilogic@79 377 }
lbajardsilogic@79 378 }
lbajardsilogic@79 379
lbajardsilogic@79 380 void cur2last(float* c_phase, float* c_synthphase, float* p_synthphase, int framesize)
lbajardsilogic@79 381 {
lbajardsilogic@79 382
lbajardsilogic@79 383 for (int i=0; i<framesize/2; i++)
lbajardsilogic@79 384 {
lbajardsilogic@79 385
lbajardsilogic@79 386 c_synthphase[i]=c_phase[i];
lbajardsilogic@79 387
lbajardsilogic@79 388 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 389 }
lbajardsilogic@79 390
lbajardsilogic@79 391
lbajardsilogic@79 392 }
lbajardsilogic@79 393
lbajardsilogic@79 394
lbajardsilogic@79 395 int findpeaks(float* c_mags, float* p_mags, float framesize, float* peak_locations)
lbajardsilogic@79 396
lbajardsilogic@79 397 {
lbajardsilogic@79 398 numpeaks=0;
lbajardsilogic@79 399 peak_locations[0]=0;
lbajardsilogic@79 400 float peakthreshold=0;
lbajardsilogic@79 401
lbajardsilogic@79 402 for (int i=2; i<(framesize/2)-2; i++)
lbajardsilogic@79 403 {
lbajardsilogic@79 404
lbajardsilogic@79 405 if(c_mags[i]>c_mags[i-1] && c_mags[i]>c_mags[i+1] && c_mags[i]>c_mags[i-2] && c_mags[i]>c_mags[i+2] && c_mags[i]>peakthreshold)
lbajardsilogic@79 406 {
lbajardsilogic@79 407 numpeaks++;
lbajardsilogic@79 408 peak_locations[numpeaks]=i;
lbajardsilogic@79 409
lbajardsilogic@79 410 }
lbajardsilogic@79 411
lbajardsilogic@79 412
lbajardsilogic@79 413 }
lbajardsilogic@79 414 return numpeaks;
lbajardsilogic@79 415 }