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