4 // static int getEntireRes(int number, int divisor, int *entire, int *res)
6 // *entire = number / divisor;
7 // *res = number % divisor;
11 static int getMultipliers(int n, int *n1, int *n2)
18 return FFT_ERROR; // n = 1
21 for (i = multiplier; i >= 2; i--)
27 return FFT_OK; // n = n1 * n2
32 return FFT_ERROR; // n - prime number
39 // int fft(float *x_in, float *x_out, int n, int shift);
41 // x_in - input signal
42 // n - number of elements for searching Fourier image
43 // shift - shift between input elements
45 // x_out - output signal (contains 2n elements in order
46 Re(x_in[0]), Im(x_in[0]), Re(x_in[1]), Im(x_in[1]) and etc.)
50 int fft(float *x_in, float *x_out, int n, int shift)
52 int n1, n2, res, k1, k2, m1, m2, index, idx;
53 float alpha, beta, gamma, angle, cosAngle, sinAngle;
54 float tmpGamma, tmpAlpha, tmpBeta;
55 float tmpRe, tmpIm, phaseRe, phaseIm;
56 res = getMultipliers(n, &n1, &n2);
59 fft(x_in, x_out, n1, shift);
60 fft(x_in, x_out, n2, shift);
62 alpha = (float)(2.0 * PI / ((float)n));
63 beta = (float)(2.0 * PI / ((float)n1));
64 gamma = (float)(2.0 * PI / ((float)n2));
65 for (k1 = 0; k1 < n1; k1++)
68 for (k2 = 0; k2 < n2; k2++)
70 idx = shift * (n2 * k1 + k2);
73 tmpGamma = gamma * k2;
74 tmpAlpha = alpha * k2;
75 for (m1 = 0; m1 < n1; m1++)
79 for (m2 = 0; m2 < n2; m2++)
81 angle = tmpGamma * m2;
82 index = shift * (n1 * m2 + m1);
83 cosAngle = cosf(angle);
84 sinAngle = sinf(angle);
85 tmpRe += x_in[index] * cosAngle + x_in[index + 1] * sinAngle;
86 tmpIm += x_in[index + 1] * cosAngle - x_in[index] * sinAngle;
88 angle = tmpAlpha * m1;
89 cosAngle = cosf(angle);
90 sinAngle = sinf(angle);
91 phaseRe = cosAngle * tmpRe + sinAngle * tmpIm;
92 phaseIm = cosAngle * tmpIm - sinAngle * tmpRe;
94 cosAngle = cosf(angle);
95 sinAngle = sinf(angle);
96 x_out[idx] += (cosAngle * phaseRe + sinAngle * phaseIm);
97 x_out[idx + 1] += (cosAngle * phaseIm - sinAngle * phaseRe);
105 // Inverse 1-dimensional FFT
108 // int fftInverse(float *x_in, float *x_out, int n, int shift);
110 // x_in - Fourier image of 1d input signal(contains 2n elements
111 in order Re(x_in[0]), Im(x_in[0]),
112 Re(x_in[1]), Im(x_in[1]) and etc.)
113 // n - number of elements for searching counter FFT image
114 // shift - shift between input elements
116 // x_in - input signal (contains n elements)
120 int fftInverse(float *x_in, float *x_out, int n, int shift)
122 int n1, n2, res, k1, k2, m1, m2, index, idx;
123 float alpha, beta, gamma, angle, cosAngle, sinAngle;
124 float tmpRe, tmpIm, phaseRe, phaseIm;
125 res = getMultipliers(n, &n1, &n2);
128 fftInverse(x_in, x_out, n1, shift);
129 fftInverse(x_in, x_out, n2, shift);
131 alpha = (float)(2.0f * PI / ((float)n));
132 beta = (float)(2.0f * PI / ((float)n1));
133 gamma = (float)(2.0f * PI / ((float)n2));
134 for (m1 = 0; m1 < n1; m1++)
136 for (m2 = 0; m2 < n2; m2++)
138 idx = (n1 * m2 + m1) * shift;
140 x_out[idx + 1] = 0.0;
141 for (k2 = 0; k2 < n2; k2++)
145 for (k1 = 0; k1 < n1; k1++)
147 angle = beta * k1 * m1;
148 index = shift *(n2 * k1 + k2);
149 sinAngle = sinf(angle);
150 cosAngle = cosf(angle);
151 tmpRe += x_in[index] * cosAngle - x_in[index + 1] * sinAngle;
152 tmpIm += x_in[index] * sinAngle + x_in[index + 1] * cosAngle;
154 angle = alpha * m1 * k2;
155 sinAngle = sinf(angle);
156 cosAngle = cosf(angle);
157 phaseRe = cosAngle * tmpRe - sinAngle * tmpIm;
158 phaseIm = cosAngle * tmpIm + sinAngle * tmpRe;
159 angle = gamma * k2 * m2;
160 sinAngle = sinf(angle);
161 cosAngle = cosf(angle);
162 x_out[idx] += cosAngle * phaseRe - sinAngle * phaseIm;
163 x_out[idx + 1] += cosAngle * phaseIm + sinAngle * phaseRe;
176 // int fft2d(float *x_in, float *x_out, int numRows, int numColls);
178 // x_in - input signal (matrix, launched by rows)
179 // numRows - number of rows
180 // numColls - number of collumns
182 // x_out - output signal (contains (2 * numRows * numColls) elements
183 in order Re(x_in[0][0]), Im(x_in[0][0]),
184 Re(x_in[0][1]), Im(x_in[0][1]) and etc.)
188 int fft2d(float *x_in, float *x_out, int numRows, int numColls)
192 size = numRows * numColls;
193 x_outTmp = (float *)malloc(sizeof(float) * (2 * size));
194 for (i = 0; i < numRows; i++)
196 fft(x_in + i * 2 * numColls,
197 x_outTmp + i * 2 * numColls,
200 for (i = 0; i < numColls; i++)
202 fft(x_outTmp + 2 * i,
204 numRows, 2 * numColls);
211 // Inverse 2-dimensional FFT
214 // int fftInverse2d(float *x_in, float *x_out, int numRows, int numColls);
216 // x_in - Fourier image of matrix (contains (2 * numRows * numColls)
217 elements in order Re(x_in[0][0]), Im(x_in[0][0]),
218 Re(x_in[0][1]), Im(x_in[0][1]) and etc.)
219 // numRows - number of rows
220 // numColls - number of collumns
222 // x_out - initial signal (matrix, launched by rows)
226 int fftInverse2d(float *x_in, float *x_out, int numRows, int numColls)
230 size = numRows * numColls;
231 x_outTmp = (float *)malloc(sizeof(float) * (2 * size));
232 for (i = 0; i < numRows; i++)
234 fftInverse(x_in + i * 2 * numColls,
235 x_outTmp + i * 2 * numColls,
238 for (i = 0; i < numColls; i++)
240 fftInverse(x_outTmp + 2 * i,
242 numRows, 2 * numColls);