annotate sv/filter/DSP.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 8b0f142fa8d2
children
rev   line source
lbajardsilogic@201 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@201 2
lbajardsilogic@201 3 /* Sound Access
lbajardsilogic@201 4 EASAIER client application.
lbajardsilogic@201 5 Dublin Institute of Technology - Audio Research Group 2007
lbajardsilogic@201 6 www.audioresearchgroup.com
lbajardsilogic@201 7 Author: Dan Barry
lbajardsilogic@201 8
lbajardsilogic@201 9 This program is free software; you can redistribute it and/or
lbajardsilogic@201 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@201 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@201 12 License, or (at your option) any later version. See the file
lbajardsilogic@201 13 COPYING included with this distribution for more information.
lbajardsilogic@201 14 */
lbajardsilogic@201 15
lbajardsilogic@79 16 //#include "stdafx.h"
lbajardsilogic@79 17 #include "DSP.h"
lbajardsilogic@79 18 #include "math.h"
lbajardsilogic@79 19 #include <cassert>
lbajardsilogic@79 20 #include <cmath>
lbajardsilogic@79 21 extern int currentposition;
lbajardsilogic@79 22 extern float lastfactor;
lbajardsilogic@79 23 extern float hopfactor;
lbajardsilogic@79 24 //These variables are only required for find peaks...the same variables are passed in to other functions
lbajardsilogic@79 25 extern int numpeaks;
lbajardsilogic@79 26 extern float *peak_locations;
lbajardsilogic@229 27
lbajardsilogic@229 28 extern float *L_mags; ///CURRENT FRAME MAGNITUDES
lbajardsilogic@229 29 extern float *R_mags; ///CURRENT FRAME MAGNITUDES
lbajardsilogic@229 30 extern float *pL_mags; ///PREVIOUS FRAME MAGNITUDES
lbajardsilogic@229 31 extern float *pR_mags; ///PREVIOUS FRAME MAGNITUDES
lbajardsilogic@229 32
lbajardsilogic@79 33 void intobyte(int num, char* pbyte1 ,char* pbyte2)
lbajardsilogic@79 34 {
lbajardsilogic@79 35
lbajardsilogic@79 36
lbajardsilogic@79 37 char firstByte = (num & 0xff);
lbajardsilogic@79 38 int secondByteInt = (num & 0xff00);
lbajardsilogic@79 39 secondByteInt = secondByteInt>>8;
lbajardsilogic@79 40 char secondByte = secondByteInt;
lbajardsilogic@79 41
lbajardsilogic@79 42 /*int thirdByteInt = (array[i] & 0xff0000);
lbajardsilogic@79 43 thirdByteInt = thirdByteInt>>16;
lbajardsilogic@79 44 char thirdByte = thirdByteInt;
lbajardsilogic@79 45
lbajardsilogic@79 46 int fourthByteInt = (array[i] & 0xff000000);
lbajardsilogic@79 47 fourthByteInt = fourthByteInt>>24;
lbajardsilogic@79 48 char fourthByte = fourthByteInt;*/
lbajardsilogic@79 49
lbajardsilogic@79 50
lbajardsilogic@79 51 *pbyte1 = firstByte;
lbajardsilogic@79 52 *pbyte2 = secondByte;
lbajardsilogic@79 53 }
lbajardsilogic@79 54
lbajardsilogic@79 55
lbajardsilogic@79 56 void cart2pol(float* cart, float* mags, float* phases, int framesize)
lbajardsilogic@79 57 {
lbajardsilogic@79 58 int length=framesize/2;
lbajardsilogic@79 59 for (int f = 0; f<length; f++)
lbajardsilogic@79 60 {
lbajardsilogic@79 61
lbajardsilogic@79 62 mags[f]=sqrt((cart[f]*cart[f])+(cart[length+f]*cart[length+f]));
lbajardsilogic@79 63
lbajardsilogic@79 64
lbajardsilogic@229 65 phases[f]=atan2((float)(-1*cart[f+length]),(float)(cart[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
lbajardsilogic@79 74 void pol2cart(float* cart, float* mags, float* phases, int framesize)
lbajardsilogic@79 75 {
lbajardsilogic@79 76 int length=framesize/2;
lbajardsilogic@79 77 for (int f = 0; f<length; f++)
lbajardsilogic@79 78 {
lbajardsilogic@79 79
lbajardsilogic@79 80 cart[f]=mags[f]*cos(phases[f]);
lbajardsilogic@79 81 cart[length+f]=-(mags[f]*sin(phases[f]));
lbajardsilogic@79 82
lbajardsilogic@79 83
lbajardsilogic@79 84 }
lbajardsilogic@79 85
lbajardsilogic@79 86
lbajardsilogic@79 87 }
lbajardsilogic@79 88
lbajardsilogic@79 89 void hanning(float* window, int framesize)
lbajardsilogic@79 90 {
lbajardsilogic@229 91
lbajardsilogic@79 92 for (int f = 0; f<framesize; f++)
lbajardsilogic@79 93 {
lbajardsilogic@79 94
lbajardsilogic@229 95 window[f]= (float) (0.5*(1-cos(2*PI*(f+1)/(framesize+1))));
lbajardsilogic@229 96
lbajardsilogic@79 97 }
lbajardsilogic@229 98
lbajardsilogic@229 99
lbajardsilogic@79 100 }
lbajardsilogic@79 101
lbajardsilogic@79 102 void updatephases(float* c_phase,float* p_phase,float* c_synthphase,float* p_synthphase, int framesize,float hopfactor,float interpfactor)
lbajardsilogic@79 103 {
lbajardsilogic@79 104
lbajardsilogic@229 105 float synth_hopsize=((float) framesize) /4;
lbajardsilogic@79 106 float actual_anhop=floor(hopfactor*synth_hopsize);
lbajardsilogic@79 107 float anhop = floor((hopfactor*synth_hopsize)/interpfactor);
lbajardsilogic@79 108 float inst_freq;
lbajardsilogic@79 109 float omega_k;
lbajardsilogic@79 110 float delta_phi;
lbajardsilogic@79 111 float a, k;
lbajardsilogic@79 112
lbajardsilogic@79 113 for (int f = 0; f<(framesize/2); f++)
lbajardsilogic@79 114 {
lbajardsilogic@79 115
lbajardsilogic@79 116 //float bin = (f/(float)framesize);
lbajardsilogic@79 117
lbajardsilogic@79 118 interpfactor;
lbajardsilogic@79 119
lbajardsilogic@229 120 omega_k=(float) ((2*PI*f)/float(framesize)); //This is the predicted angular freqency rads/sec of the centre frequency
lbajardsilogic@79 121
lbajardsilogic@79 122 delta_phi=(c_phase[f]-p_phase[f])-(anhop*omega_k);
lbajardsilogic@79 123
lbajardsilogic@229 124 a = (float) (delta_phi/(2*PI));
lbajardsilogic@79 125
lbajardsilogic@229 126 k = (float) (floor(a+0.5));
lbajardsilogic@79 127
lbajardsilogic@229 128 delta_phi = (float) (delta_phi-k*2*PI);
lbajardsilogic@79 129
lbajardsilogic@79 130 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 131
lbajardsilogic@79 132
lbajardsilogic@79 133
lbajardsilogic@79 134 c_synthphase[f] = p_synthphase[f]+(inst_freq*synth_hopsize);
lbajardsilogic@79 135
lbajardsilogic@79 136 if (currentposition<actual_anhop){c_synthphase[f] = c_phase[f];}
lbajardsilogic@79 137
lbajardsilogic@79 138 p_synthphase[f] = c_synthphase[f];
lbajardsilogic@79 139
lbajardsilogic@79 140 p_phase[f] = c_phase[f];
lbajardsilogic@79 141
lbajardsilogic@79 142
lbajardsilogic@79 143
lbajardsilogic@79 144
lbajardsilogic@79 145
lbajardsilogic@79 146
lbajardsilogic@79 147 }
lbajardsilogic@79 148 }
lbajardsilogic@79 149
lbajardsilogic@79 150 void updatephases2(float* c_phase,float* p_phase,float* c_synthphase,float* p_synthphase, int framesize,float hopfactor,float interpfactor)
lbajardsilogic@79 151 {
lbajardsilogic@79 152
lbajardsilogic@229 153 float synth_hopsize=((float) framesize)/4;
lbajardsilogic@79 154 float actual_anhop=actual_anhop=floor(hopfactor*synth_hopsize);
lbajardsilogic@79 155 float anhop = floor((hopfactor*synth_hopsize)/interpfactor);
lbajardsilogic@79 156 float inst_freq;
lbajardsilogic@79 157 float omega_k;
lbajardsilogic@79 158 float delta_phi;
lbajardsilogic@79 159 float a, k;
lbajardsilogic@79 160
lbajardsilogic@79 161 for (int f = 0; f<(framesize/2); f++)
lbajardsilogic@79 162 {
lbajardsilogic@79 163
lbajardsilogic@79 164 //float bin = (f/(float)framesize);
lbajardsilogic@79 165
lbajardsilogic@79 166 interpfactor;
lbajardsilogic@79 167
lbajardsilogic@229 168 omega_k=(float) ((2*PI*f)/float(framesize)); //This is the predicted angular freqency rads/sec of the centre frequency
lbajardsilogic@79 169
lbajardsilogic@79 170 delta_phi=(c_phase[f]-p_phase[f])-(anhop*omega_k);
lbajardsilogic@79 171
lbajardsilogic@229 172 a = (float) (delta_phi/(2*PI));
lbajardsilogic@79 173
lbajardsilogic@229 174 k = (float) (floor(a+0.5));
lbajardsilogic@79 175
lbajardsilogic@229 176 delta_phi = (float) (delta_phi-k*2*PI);
lbajardsilogic@79 177
lbajardsilogic@79 178 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 179
lbajardsilogic@79 180
lbajardsilogic@79 181
lbajardsilogic@79 182 c_synthphase[f] = p_synthphase[f]+(inst_freq*synth_hopsize);
lbajardsilogic@79 183
lbajardsilogic@79 184
lbajardsilogic@79 185
lbajardsilogic@79 186 if (currentposition<actual_anhop){c_synthphase[f] = c_phase[f];}
lbajardsilogic@79 187
lbajardsilogic@79 188 if (!(anhop==lastfactor)){c_synthphase[f]=c_phase[f];}
lbajardsilogic@79 189
lbajardsilogic@79 190
lbajardsilogic@79 191
lbajardsilogic@79 192 p_synthphase[f] = c_synthphase[f];
lbajardsilogic@79 193
lbajardsilogic@79 194
lbajardsilogic@79 195 p_phase[f] = c_phase[f];
lbajardsilogic@79 196
lbajardsilogic@79 197
lbajardsilogic@79 198
lbajardsilogic@79 199
lbajardsilogic@79 200
lbajardsilogic@79 201
lbajardsilogic@79 202 }
lbajardsilogic@79 203 lastfactor=anhop;
lbajardsilogic@79 204 }
lbajardsilogic@79 205
lbajardsilogic@79 206 void rotatephases(float* c_phase, float* p_phase, float* c_synthphase, float* p_synthphase, int framesize, float interpfactor)
lbajardsilogic@79 207 {
lbajardsilogic@79 208 float phase_diff;
lbajardsilogic@79 209 int diffhop = framesize/4;
lbajardsilogic@79 210
lbajardsilogic@79 211 float anhop = floor((diffhop)/interpfactor);
lbajardsilogic@79 212 float inst_freq;
lbajardsilogic@79 213 float omega_k;
lbajardsilogic@79 214 float delta_phi;
lbajardsilogic@79 215 float a, k;
lbajardsilogic@79 216
lbajardsilogic@79 217 //findpeaks(c_mags, p_mags, framesize, peak_locations, numpeaks);
lbajardsilogic@79 218
lbajardsilogic@79 219 for (int i=0; i<framesize/2; i++)
lbajardsilogic@79 220 {
lbajardsilogic@79 221
lbajardsilogic@79 222 phase_diff=(c_phase[i]-p_phase[i]);
lbajardsilogic@79 223
lbajardsilogic@229 224 omega_k=(float) ((2*PI*i)/float(framesize));
lbajardsilogic@79 225
lbajardsilogic@79 226 delta_phi=(phase_diff)-(anhop*omega_k);
lbajardsilogic@79 227
lbajardsilogic@229 228 a = (float) (delta_phi/(2*PI));
lbajardsilogic@79 229
lbajardsilogic@229 230 k = (float) (floor(a+0.5));
lbajardsilogic@79 231
lbajardsilogic@229 232 delta_phi = (float) (delta_phi-k*2*PI);
lbajardsilogic@79 233
lbajardsilogic@79 234 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 235
lbajardsilogic@79 236 c_synthphase[i]=p_synthphase[i]+(inst_freq*diffhop);
lbajardsilogic@79 237
lbajardsilogic@79 238 //c_synthphase[i]=p_synthphase[i]+(phase_diff);
lbajardsilogic@79 239
lbajardsilogic@79 240 //c_synthphase[i]=p_synthphase[i]+((phase_diff*diffhop)*interpfactor);
lbajardsilogic@79 241
lbajardsilogic@79 242 //if (currentposition<framesize/2 || (!(lastfactor==hopfactor))){c_synthphase[i] = c_phase[i];}
lbajardsilogic@229 243 if (currentposition<framesize/2){c_synthphase[i] = c_phase[i];}
lbajardsilogic@79 244
lbajardsilogic@79 245 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 246 }
lbajardsilogic@79 247
lbajardsilogic@79 248 lastfactor=hopfactor;
lbajardsilogic@79 249 }
lbajardsilogic@79 250
lbajardsilogic@229 251 void rotatephases_peaklocked(float* c_phase, float* p_phase, float* c_synthphase, float* p_synthphase, float* c_mags, int framesize, float interpfactor)
lbajardsilogic@79 252 {
lbajardsilogic@79 253 float phase_diff;
lbajardsilogic@79 254 int diffhop = framesize/4;
lbajardsilogic@79 255
lbajardsilogic@79 256 float anhop = floor((diffhop)/interpfactor);
lbajardsilogic@79 257 float inst_freq;
lbajardsilogic@79 258 float omega_k;
lbajardsilogic@79 259 float delta_phi;
lbajardsilogic@79 260 float a, k;
lbajardsilogic@79 261 int start, end, i;
lbajardsilogic@79 262 float original_peak_phase;
lbajardsilogic@79 263 float cutoff;
lbajardsilogic@79 264
lbajardsilogic@79 265 cutoff = 10000;
lbajardsilogic@79 266
lbajardsilogic@79 267 cutoff = floor(cutoff/(44100/framesize));
lbajardsilogic@79 268
lbajardsilogic@229 269 numpeaks = findpeaks(c_mags, pL_mags,(float) framesize, peak_locations);
lbajardsilogic@79 270
lbajardsilogic@79 271 int p=1;
lbajardsilogic@79 272 //while(peak_locations[p]<cutoff)
lbajardsilogic@79 273 while(p<=numpeaks)
lbajardsilogic@79 274 {
lbajardsilogic@79 275
lbajardsilogic@229 276 i=(int) peak_locations[p];
lbajardsilogic@79 277
lbajardsilogic@79 278 original_peak_phase=c_phase[i];
lbajardsilogic@79 279
lbajardsilogic@79 280 //start=i-2;
lbajardsilogic@79 281 //end=i+2;
lbajardsilogic@79 282
lbajardsilogic@79 283
lbajardsilogic@79 284 if (p==1){
lbajardsilogic@79 285 start=0;
lbajardsilogic@229 286 end=(int) floor(peak_locations[p]+((peak_locations[p+1]-peak_locations[p])/2));
lbajardsilogic@79 287 }
lbajardsilogic@79 288
lbajardsilogic@79 289 else{
lbajardsilogic@79 290 if (p==numpeaks){
lbajardsilogic@229 291 start=(int) floor(peak_locations[p-1]+((peak_locations[p]-peak_locations[p-1])/2));
lbajardsilogic@79 292 end=(framesize/2);
lbajardsilogic@79 293 }
lbajardsilogic@79 294 else {
lbajardsilogic@229 295 start=(int) floor(peak_locations[p-1]+((peak_locations[p]-peak_locations[p-1])/2));
lbajardsilogic@229 296 end=(int) floor(peak_locations[p]+((peak_locations[p+1]-peak_locations[p])/2));
lbajardsilogic@79 297 }
lbajardsilogic@79 298 }
lbajardsilogic@79 299
lbajardsilogic@79 300 phase_diff=(c_phase[i]-p_phase[i]);
lbajardsilogic@229 301 omega_k=(float) ((2*PI*i)/float(framesize));
lbajardsilogic@79 302 delta_phi=(phase_diff)-(anhop*omega_k);
lbajardsilogic@229 303 a = (float) (delta_phi/(2*PI));
lbajardsilogic@229 304 k = (float) (floor(a+0.5));
lbajardsilogic@229 305 delta_phi = (float) (delta_phi-k*2*PI);
lbajardsilogic@79 306 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 307 c_synthphase[i]=p_synthphase[i]+(inst_freq*diffhop);
lbajardsilogic@79 308 //c_synthphase[i]=p_synthphase[i]+(phase_diff);
lbajardsilogic@79 309 //c_synthphase[i]=p_synthphase[i]+((phase_diff*diffhop)*interpfactor);
lbajardsilogic@79 310 //if (currentposition<framesize/2 || (!(lastfactor==hopfactor))){c_synthphase[i] = c_phase[i];}
lbajardsilogic@229 311 if (currentposition<framesize/2){c_synthphase[i] = c_phase[i];}
lbajardsilogic@79 312 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 313
lbajardsilogic@79 314 int j;
lbajardsilogic@79 315 for (j=start; j<i; j++)
lbajardsilogic@79 316 {
lbajardsilogic@79 317 c_synthphase[j]=c_synthphase[i]-(original_peak_phase-c_phase[j]);
lbajardsilogic@79 318 p_synthphase[j]=c_synthphase[j];
lbajardsilogic@79 319 }
lbajardsilogic@79 320
lbajardsilogic@79 321 for (j=i+1; j<end; j++)
lbajardsilogic@79 322 {
lbajardsilogic@79 323 c_synthphase[j]=c_synthphase[i]-(original_peak_phase-c_phase[j]);
lbajardsilogic@79 324 p_synthphase[j]=c_synthphase[j];
lbajardsilogic@79 325 }
lbajardsilogic@79 326
lbajardsilogic@79 327
lbajardsilogic@79 328 p++;
lbajardsilogic@79 329 }
lbajardsilogic@79 330
lbajardsilogic@79 331 /*for (i=peak_locations[p]+1; i<(framesize/2); i++)
lbajardsilogic@79 332 {
lbajardsilogic@79 333 phase_diff=(c_phase[i]-p_phase[i]);
lbajardsilogic@79 334
lbajardsilogic@79 335 omega_k=(2*PI*i)/float(framesize);
lbajardsilogic@79 336
lbajardsilogic@79 337 delta_phi=(phase_diff)-(anhop*omega_k);
lbajardsilogic@79 338
lbajardsilogic@79 339 a = delta_phi/(2*PI);
lbajardsilogic@79 340
lbajardsilogic@79 341 k = floor(a+0.5);
lbajardsilogic@79 342
lbajardsilogic@79 343 delta_phi = delta_phi-k*2*PI;
lbajardsilogic@79 344
lbajardsilogic@79 345 inst_freq=omega_k+delta_phi/anhop;
lbajardsilogic@79 346
lbajardsilogic@79 347 c_synthphase[i]=p_synthphase[i]+(inst_freq*diffhop);
lbajardsilogic@79 348
lbajardsilogic@79 349 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@79 350 } */
lbajardsilogic@79 351
lbajardsilogic@79 352 lastfactor=hopfactor;
lbajardsilogic@79 353 }
lbajardsilogic@79 354
lbajardsilogic@229 355 void cur2last(float* c_phase, float* c_synthphase, float* p_synthphase, int framesize)
lbajardsilogic@229 356 {
lbajardsilogic@79 357
lbajardsilogic@229 358 for (int i=0; i<framesize/2; i++)
lbajardsilogic@229 359 {
lbajardsilogic@229 360
lbajardsilogic@229 361 c_synthphase[i]=c_phase[i];
lbajardsilogic@229 362
lbajardsilogic@229 363 p_synthphase[i]=c_synthphase[i];
lbajardsilogic@229 364 }
lbajardsilogic@229 365
lbajardsilogic@229 366
lbajardsilogic@229 367 }
lbajardsilogic@229 368
lbajardsilogic@229 369
lbajardsilogic@229 370 int findpeaks(float* c_mags, float* p_mags, float framesize, float* peak_locations)
lbajardsilogic@229 371
lbajardsilogic@229 372 {
lbajardsilogic@229 373 numpeaks=0;
lbajardsilogic@229 374 peak_locations[0]=0;
lbajardsilogic@229 375 float peakthreshold=0;
lbajardsilogic@229 376
lbajardsilogic@229 377 for (int i=2; i<(framesize/4)-10; i++)
lbajardsilogic@229 378 {
lbajardsilogic@229 379
lbajardsilogic@229 380 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@229 381 {
lbajardsilogic@229 382 numpeaks++;
lbajardsilogic@229 383 peak_locations[numpeaks]=(float) i;
lbajardsilogic@229 384
lbajardsilogic@229 385 }
lbajardsilogic@229 386
lbajardsilogic@229 387
lbajardsilogic@229 388 }
lbajardsilogic@229 389 return numpeaks;
lbajardsilogic@229 390 }
lbajardsilogic@79 391
lbajardsilogic@79 392 bool transient_detect(float* L_mags, float* R_mags, float* pL_mags, float* pR_mags, float drumthresh, float framesize)
lbajardsilogic@79 393 {
lbajardsilogic@79 394
lbajardsilogic@79 395 extern float *L_phase, *R_phase;
lbajardsilogic@79 396 int trans = 0;
lbajardsilogic@79 397
lbajardsilogic@79 398 for (int f = 0; f<(framesize/2); f++)
lbajardsilogic@79 399 {
lbajardsilogic@79 400
lbajardsilogic@229 401 if ((R_mags[f]-pR_mags[f])>0 ||
lbajardsilogic@79 402 (L_mags[f]-pL_mags[f])>0){trans++;}
lbajardsilogic@79 403
lbajardsilogic@79 404
lbajardsilogic@79 405 pR_mags[f]=R_mags[f];
lbajardsilogic@79 406 pL_mags[f]=L_mags[f];
lbajardsilogic@79 407
lbajardsilogic@79 408
lbajardsilogic@79 409 }
lbajardsilogic@79 410 drumthresh=(drumthresh/100)*(framesize/2);
lbajardsilogic@79 411
lbajardsilogic@79 412
lbajardsilogic@79 413 if (trans>=drumthresh)
lbajardsilogic@79 414 {
lbajardsilogic@79 415
lbajardsilogic@79 416 return true;
lbajardsilogic@79 417 }
lbajardsilogic@79 418 else{return false;}
lbajardsilogic@79 419 }
lbajardsilogic@79 420
lbajardsilogic@229 421
lbajardsilogic@229 422
lbajardsilogic@229 423
lbajardsilogic@229 424
lbajardsilogic@229 425 void log10plot(float* L_mags, float* plotFFTarray, int framesize, int plotsize)
lbajardsilogic@79 426 {
lbajardsilogic@229 427 float interpfactor1 = 10/100; //1 - 100hz bin 1 - 10
lbajardsilogic@229 428 float interpfactor2 = 90/100; //100 - 1000hz bin 10 - 100
lbajardsilogic@229 429 float interpfactor3 = 900/100; //1000 - 10000hz bin 100 - 1000
lbajardsilogic@229 430 float interpfactor4 = 1048/100; //10000 - 20000hz bin 1000 - 2048
lbajardsilogic@229 431 int temp;
lbajardsilogic@229 432 int i;
lbajardsilogic@229 433 float p;
lbajardsilogic@229 434 float ratio,dec;
lbajardsilogic@79 435
lbajardsilogic@229 436 for (i=0 ; i<plotsize/4; i++)
lbajardsilogic@229 437 {
lbajardsilogic@229 438 p=(float) i;
lbajardsilogic@229 439
lbajardsilogic@229 440 temp=(int) floor((((1+p)/100)*9)+1);
lbajardsilogic@229 441 ratio=((((1+p)/100)*9)+1)-floor((float) temp);
lbajardsilogic@229 442
lbajardsilogic@229 443 plotFFTarray[i]=log((((L_mags[temp+1]-L_mags[temp])*ratio)+L_mags[temp])/1000);
lbajardsilogic@229 444 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log((((L_mags[temp+1]-L_mags[temp])*ratio)+L_mags[temp])/1000);
lbajardsilogic@229 445 }
lbajardsilogic@79 446
lbajardsilogic@229 447 for (i=plotsize/4 ; i<(plotsize/4)*2; i++)
lbajardsilogic@79 448 {
lbajardsilogic@229 449 p=(float) i;
lbajardsilogic@229 450 temp= (int) floor((((1+p-plotsize/4)/100)*90)+10);
lbajardsilogic@229 451 plotFFTarray[i]=log(L_mags[temp]/1000);
lbajardsilogic@229 452 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log(L_mags[temp]/1000);
lbajardsilogic@229 453 }
lbajardsilogic@229 454
lbajardsilogic@229 455 for (i=(plotsize/4)*2 ; i<(plotsize/4)*3; i++)
lbajardsilogic@229 456 {
lbajardsilogic@229 457 p=(float) i;
lbajardsilogic@229 458 temp=(int) floor((((1+p-(plotsize/4)*2)/100)*900)+100);
lbajardsilogic@229 459
lbajardsilogic@229 460 plotFFTarray[i]=log(L_mags[temp]/1000);
lbajardsilogic@229 461 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log(L_mags[temp]/1000);
lbajardsilogic@229 462 }
lbajardsilogic@229 463
lbajardsilogic@229 464 for (i=(plotsize/4)*3 ; i<(plotsize/4)*4; i++)
lbajardsilogic@229 465 {
lbajardsilogic@229 466 p=(float) i;
lbajardsilogic@229 467 temp=(int) floor((((1+p-(plotsize/4)*3)/100)*1048)+1000);
lbajardsilogic@229 468
lbajardsilogic@229 469 plotFFTarray[i]=log(L_mags[temp]/1000);
lbajardsilogic@229 470 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log(L_mags[temp]/1000);
lbajardsilogic@79 471 }
lbajardsilogic@79 472 }
lbajardsilogic@79 473
lbajardsilogic@229 474
lbajardsilogic@233 475 void log10plot2(QVector<float>& L_mags, float* plotFFTarray, int framesize, int plotsize)
lbajardsilogic@79 476 {
lbajardsilogic@229 477 float interpfactor1 = 10/100; //1 - 100hz bin 1 - 10
lbajardsilogic@229 478 float interpfactor2 = 90/100; //100 - 1000hz bin 10 - 100
lbajardsilogic@229 479 float interpfactor3 = 900/100; //1000 - 10000hz bin 100 - 1000
lbajardsilogic@229 480 float interpfactor4 = 1048/100; //10000 - 20000hz bin 1000 - 2048
lbajardsilogic@229 481 int temp;
lbajardsilogic@229 482 int i;
lbajardsilogic@229 483 float p;
lbajardsilogic@229 484 float ratio,dec;
lbajardsilogic@79 485
lbajardsilogic@229 486
lbajardsilogic@229 487
lbajardsilogic@229 488 for (i=0 ; i<plotsize/4; i++)
lbajardsilogic@229 489 {
lbajardsilogic@229 490 p=(float) i;
lbajardsilogic@229 491
lbajardsilogic@229 492 temp=(int) floor((((1+p)/100)*9)+1);
lbajardsilogic@229 493 ratio=((((1+p)/100)*9)+1)-floor((float) temp);
lbajardsilogic@229 494
lbajardsilogic@229 495
lbajardsilogic@232 496 plotFFTarray[i]=((((L_mags.at(temp+1)-L_mags.at(temp))*ratio)+L_mags.at(temp)));
lbajardsilogic@229 497 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log((((L_mags[temp+1]-L_mags[temp])*ratio)+L_mags[temp])/1000);
lbajardsilogic@229 498 }
lbajardsilogic@229 499
lbajardsilogic@229 500 for (i=plotsize/4 ; i<(plotsize/4)*2; i++)
lbajardsilogic@229 501 {
lbajardsilogic@229 502 p=i;
lbajardsilogic@229 503 temp=floor((((1+p-plotsize/4)/100)*90)+10);
lbajardsilogic@232 504 plotFFTarray[i]=(L_mags.at(temp));
lbajardsilogic@229 505 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log(L_mags[temp]/1000);
lbajardsilogic@229 506 }
lbajardsilogic@229 507
lbajardsilogic@229 508 for (i=(plotsize/4)*2 ; i<(plotsize/4)*3; i++)
lbajardsilogic@229 509 {
lbajardsilogic@229 510 p=i;
lbajardsilogic@229 511 temp=floor((((1+p-(plotsize/4)*2)/100)*900)+100);
lbajardsilogic@229 512
lbajardsilogic@232 513 plotFFTarray[i]=(L_mags.at(temp));
lbajardsilogic@229 514 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log(L_mags[temp]/1000);
lbajardsilogic@229 515 }
lbajardsilogic@229 516
lbajardsilogic@232 517 for (i=(plotsize/4)*3 ; i<(plotsize/4)*4-1; i++)
lbajardsilogic@229 518 {
lbajardsilogic@229 519 p=i;
lbajardsilogic@229 520 temp=floor((((1+p-(plotsize/4)*3)/100)*1048)+1000);
lbajardsilogic@229 521
lbajardsilogic@232 522 plotFFTarray[i]=(L_mags.at(temp));
lbajardsilogic@229 523 //plotFFTarray[i]=dec*plotFFTarray[i]+0.5*log(L_mags[temp]/1000);
lbajardsilogic@229 524 }
lbajardsilogic@229 525 }
lbajardsilogic@229 526
lbajardsilogic@233 527 void applyEQ(float* L_mags, float* R_mags, int framesize, int plotsize, QVector<float>& eqcurve)
lbajardsilogic@229 528 {
lbajardsilogic@229 529 //(80,85,400,120,0) Screen Coordinates
lbajardsilogic@229 530 float gain, interpfactor, p,result;
lbajardsilogic@229 531 int i, ind;
lbajardsilogic@229 532
lbajardsilogic@229 533 for(i=0; i<10; i++)
lbajardsilogic@229 534 {
lbajardsilogic@237 535 gain=(119-(eqcurve.at(i*10)))/120; // eqcurve is the array filled when the user draws on the canvas
lbajardsilogic@229 536 if (gain < 0){gain=0;}
lbajardsilogic@229 537 L_mags[i]*=gain;
lbajardsilogic@229 538 R_mags[i]*=gain;
lbajardsilogic@229 539
lbajardsilogic@229 540 }
lbajardsilogic@229 541
lbajardsilogic@229 542 for(i=10; i<100; i++)
lbajardsilogic@79 543 {
lbajardsilogic@79 544
lbajardsilogic@229 545 p=i;
lbajardsilogic@229 546 interpfactor=1.1;
lbajardsilogic@229 547 result=100+((interpfactor*(p-10)));
lbajardsilogic@229 548 ind=int(result);
lbajardsilogic@237 549 gain=(119-(eqcurve.at(ind)))/120;
lbajardsilogic@229 550 //gain=(110-(eqcurve[i+90]-85))/120;
lbajardsilogic@229 551
lbajardsilogic@229 552 if (gain < 0){gain=0;}
lbajardsilogic@229 553 L_mags[i]*=gain;
lbajardsilogic@229 554 R_mags[i]*=gain;
lbajardsilogic@229 555
lbajardsilogic@229 556
lbajardsilogic@229 557
lbajardsilogic@79 558 }
lbajardsilogic@79 559
lbajardsilogic@229 560 for(i=100; i<1000; i++)
lbajardsilogic@229 561 {
lbajardsilogic@229 562 p=i;
lbajardsilogic@229 563 interpfactor=0.11;
lbajardsilogic@229 564 result=200+((interpfactor*(p-100)));
lbajardsilogic@229 565 ind=int(result);
lbajardsilogic@237 566 gain=(119-(eqcurve.at(ind)))/120;
lbajardsilogic@229 567 if (gain < 0){gain=0;}
lbajardsilogic@229 568 L_mags[i]*=gain;
lbajardsilogic@229 569 R_mags[i]*=gain;
lbajardsilogic@229 570
lbajardsilogic@229 571
lbajardsilogic@229 572
lbajardsilogic@229 573 }
lbajardsilogic@229 574
lbajardsilogic@229 575 for(i=1000; i<2048; i++)
lbajardsilogic@229 576 {
lbajardsilogic@229 577 p=i;
lbajardsilogic@229 578 interpfactor=.09;
lbajardsilogic@229 579 result=300+((interpfactor*(p-1000)));
lbajardsilogic@229 580 ind=int(result);
lbajardsilogic@237 581 gain=(119-(eqcurve.at(ind)))/120;
lbajardsilogic@229 582 if (gain < 0){gain=0;}
lbajardsilogic@229 583 L_mags[i]*=gain;
lbajardsilogic@229 584 R_mags[i]*=gain;
lbajardsilogic@229 585
lbajardsilogic@229 586
lbajardsilogic@229 587
lbajardsilogic@229 588 }
lbajardsilogic@229 589 }
lbajardsilogic@229 590
lbajardsilogic@229 591
lbajardsilogic@229 592
lbajardsilogic@229 593 void stereo2ms(float* left, float* right, int framesize)
lbajardsilogic@229 594 {
lbajardsilogic@229 595 float m, s;
lbajardsilogic@229 596 for (int i=0;i<framesize;i++)
lbajardsilogic@229 597 {
lbajardsilogic@229 598 m=(left[i]+right[i])/2;
lbajardsilogic@229 599 s=(left[i]-right[i])/2;
lbajardsilogic@229 600 left[i]=m;
lbajardsilogic@229 601 right[i]=s;
lbajardsilogic@229 602 }
lbajardsilogic@229 603 }
lbajardsilogic@229 604
lbajardsilogic@229 605 void ms2stereo(float* left, float* right, int framesize)
lbajardsilogic@229 606 {
lbajardsilogic@229 607 float m, s;
lbajardsilogic@229 608 for (int i=0;i<framesize;i++)
lbajardsilogic@229 609 {
lbajardsilogic@229 610 m=(left[i]+right[i]);
lbajardsilogic@229 611 s=(left[i]-right[i]);
lbajardsilogic@229 612 left[i]=m;
lbajardsilogic@229 613 right[i]=s;
lbajardsilogic@229 614 }
lbajardsilogic@229 615 }
lbajardsilogic@229 616
lbajardsilogic@229 617
lbajardsilogic@233 618 void bandeq(float* L_mags, float* R_mags, QVector<float>& eqcurve, int framesize)
lbajardsilogic@229 619 {
lbajardsilogic@229 620
lbajardsilogic@229 621 for (int i=0;i<framesize/2;i++)
lbajardsilogic@79 622 {
lbajardsilogic@232 623 L_mags[i] *= eqcurve.at(i);
lbajardsilogic@232 624 R_mags[i] *= eqcurve.at(i);
lbajardsilogic@79 625 }
lbajardsilogic@229 626
lbajardsilogic@232 627 }