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 }