1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
Complex2D FFTProgress2D(const Complex2D& src, int len, int flag) { Complex2D src1(src);
for (int i{ 0 }; i < len; i++) { src1[i] = FFTProgress1D(src[i], len, flag); }
Complex2D&& dst = Transform(src1);
for (int i{ 0 }; i < len; i++) { dst[i] = FFTProgress1D(dst[i], len, flag); }
dst = Transform(dst); return dst; }
Complex2D FFT2D(const Double2D& src) { int row = src.size(); int column = src[0].size(); int len = GetClosest2Power(row > column ? row : column); Complex2D src1(len);
for (int i{ 0 }; i < len; i++) { src1[i].resize(len); for (int j{ 0 }; j < len; j++) { src1[i][j].imag = 0; if (i < row && j < column) { src1[i][j].real = src[i][j]; } else { src1[i][j].real = 0; } } }
return FFTProgress2D(src1, len, -1); }
Double2D IFFT2D(const Complex2D& src, int len, int realRow, int realColumn) { int size = len * len; Complex2D&& src1 = FFTProgress2D(src, len, 1); Double2D dst(realRow); int min{ 255 }, max{ 0 }; for (int i{ 0 }; i < realRow; i++) { dst[i].resize(realColumn); for (int j{ 0 }; j < realColumn; j++) { dst[i][j] = Magnitude(src1[i][j]); min = dst[i][j] < min ? dst[i][j] : min; max = dst[i][j] > max ? dst[i][j] : max; } } double scale = 255.0 / (max - min); for (auto& items : dst) { for (auto& item : items) { item = (item - min) * scale; } } return dst; }
void Complex2Image(const Complex2D& src, uchar* image) { Complex2D src1(src); int len = src.size(); Shift(src1); int* tmp = new int[len * len]; for (int i{ 0 }; i < len; i++) { for (int j{ 0 }; j < len; j++) { int index = i * len + j; tmp[index] = (int)Magnitude(src1[i][j]); if (tmp[index] < 0) tmp[index] = 0; } } { for (int i{ len * len - 1 }; i >= 0; i--) { tmp[i] /= 500; image[i] = tmp[i] < 255 ? tmp[i] : 255; } } delete[] tmp; }
|