Mercurial > hg > precise-onset-detection
comparison src/btrack_plus/accFFT.cpp @ 0:3dcbd77efc94
added files for OF project
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Fri, 21 Sep 2012 16:35:17 +0100 |
parents | |
children | eb29c6b6dff8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3dcbd77efc94 |
---|---|
1 // | |
2 // accFFT.cpp | |
3 // AccelerateFFTtool | |
4 // | |
5 // Created by Adam Stark on 17/07/2012. | |
6 // Copyright (c) 2012 __MyCompanyName__. All rights reserved. | |
7 // | |
8 | |
9 #include "accFFT.h" | |
10 | |
11 | |
12 accFFT :: accFFT(int fft_size,int type) | |
13 { | |
14 fft_type = type; | |
15 | |
16 fftSize = fft_size; | |
17 fftSizeOver2 = fftSize/2; | |
18 log2n = log2f(fftSize); | |
19 log2nOver2 = log2n/2; | |
20 | |
21 if (fft_type == 0) | |
22 { | |
23 split.realp = (float *) malloc(fftSize * sizeof(float)); | |
24 split.imagp = (float *) malloc(fftSize * sizeof(float)); | |
25 | |
26 // allocate the fft object once | |
27 fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2); | |
28 if (fftSetup == NULL) { | |
29 //printf("FFT Setup failed\n"); | |
30 } | |
31 } | |
32 else if (fft_type == 1) | |
33 { | |
34 d_split.realp = (double *) malloc(fftSize * sizeof(double)); | |
35 d_split.imagp = (double *) malloc(fftSize * sizeof(double)); | |
36 | |
37 // allocate the fft object once | |
38 fftSetupD = vDSP_create_fftsetupD(log2n, FFT_RADIX2); | |
39 if (fftSetupD == NULL) { | |
40 //printf("FFT Setup failed\n"); | |
41 } | |
42 } | |
43 | |
44 | |
45 | |
46 } | |
47 | |
48 accFFT :: ~accFFT() | |
49 { | |
50 if (fft_type == 0) | |
51 { | |
52 free(split.realp); | |
53 free(split.imagp); | |
54 vDSP_destroy_fftsetup(fftSetup); | |
55 } | |
56 else if (fft_type == 1) | |
57 { | |
58 free(d_split.realp); | |
59 free(d_split.imagp); | |
60 vDSP_destroy_fftsetupD(fftSetupD); | |
61 } | |
62 | |
63 | |
64 } | |
65 | |
66 void accFFT :: forward_FFT_f(float *buffer,float *real,float *imag) | |
67 { | |
68 //convert to split complex format with evens in real and odds in imag | |
69 vDSP_ctoz((COMPLEX *) buffer, 2, &split, 1, fftSizeOver2); | |
70 | |
71 //calc fft | |
72 vDSP_fft_zrip(fftSetup, &split, 1, log2n, FFT_FORWARD); | |
73 | |
74 // set Nyquist component to imaginary of 0 component | |
75 split.realp[fftSizeOver2] = split.imagp[0]; | |
76 split.imagp[fftSizeOver2] = 0.0; | |
77 | |
78 // set 0 component to zero | |
79 split.imagp[0] = 0.0; | |
80 | |
81 // multiply by 0.5 to get correct output (to do with Apple's FFT implementation) | |
82 for (i = 0; i <= fftSizeOver2; i++) | |
83 { | |
84 split.realp[i] *= 0.5; | |
85 split.imagp[i] *= 0.5; | |
86 } | |
87 | |
88 // set values above N/2+1 which are complex conjugate mirror image of those below | |
89 for (i = fftSizeOver2 - 1;i > 0;--i) | |
90 { | |
91 split.realp[2*fftSizeOver2 - i] = split.realp[i]; | |
92 split.imagp[2*fftSizeOver2 - i] = -1*split.imagp[i]; | |
93 | |
94 //cout << split_data.realp[2*fftSizeOver2 - i] << " " << split_data.imagp[2*fftSizeOver2 - i] << "i" << endl; | |
95 } | |
96 | |
97 for (i = 0;i < fftSize;i++) | |
98 { | |
99 real[i] = split.realp[i]; | |
100 imag[i] = split.imagp[i]; | |
101 } | |
102 } | |
103 | |
104 | |
105 | |
106 void accFFT :: forward_FFT_d(double *buffer,fft_complex *out) | |
107 { | |
108 //convert to split complex format with evens in real and odds in imag | |
109 vDSP_ctozD((DOUBLE_COMPLEX *) buffer, 2, &d_split, 1, fftSizeOver2); | |
110 | |
111 //calc fft | |
112 vDSP_fft_zripD(fftSetupD, &d_split, 1, log2n, FFT_FORWARD); | |
113 | |
114 // set Nyquist component to imaginary of 0 component | |
115 d_split.realp[fftSizeOver2] = d_split.imagp[0]; | |
116 d_split.imagp[fftSizeOver2] = 0.0; | |
117 | |
118 // set 0 component to zero | |
119 d_split.imagp[0] = 0.0; | |
120 | |
121 // multiply by 0.5 to get correct output (to do with Apple's FFT implementation) | |
122 for (i = 0; i <= fftSizeOver2; i++) | |
123 { | |
124 d_split.realp[i] *= 0.5; | |
125 d_split.imagp[i] *= 0.5; | |
126 } | |
127 | |
128 // set values above N/2+1 which are complex conjugate mirror image of those below | |
129 for (i = fftSizeOver2 - 1;i > 0;--i) | |
130 { | |
131 d_split.realp[2*fftSizeOver2 - i] = d_split.realp[i]; | |
132 d_split.imagp[2*fftSizeOver2 - i] = -1*d_split.imagp[i]; | |
133 } | |
134 | |
135 for (i = 0;i < fftSize;i++) | |
136 { | |
137 out[i][0] = d_split.realp[i]; | |
138 out[i][1] = d_split.imagp[i]; | |
139 } | |
140 } |