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 }
|