31 static void doFFT(std::complex<double> *sig,
int n,
bool direct)
34 double logsize = log2(n);
35 if (logsize != ceil(logsize))
42 for (
int i = 0; i < n-1 ; i++)
56 std::complex<double> c(-1.0, 0.0);
58 for (
int l = 0; l < m; l++)
62 std::complex<double> u(1.0, 0.0);
63 for (j = 0; j < l1; j++)
65 for (
int i = j; i < n; i += l2)
68 std::complex<double> t1 = u * sig[i1];
69 sig[i1] = sig[i] - t1;
76 double ima = sqrt((1.0 - c.real()) / 2.0);
79 c = std::complex<double>(sqrt((1.0 + c.real()) / 2.0), ima);
85 for (
int i = 0; i < n; i++)
98 void crn::FFT(std::vector<std::complex<double> > &sig,
bool direct)
100 doFFT(sig.data(), int(sig.size()), direct);
111 double logr = log2(
int(newr));
112 while (logr != ceil(logr))
115 logr = log2(
int(newr));
119 double logc = log2(
int(newc));
120 while (logc != ceil(logc))
123 logc = log2(
int(newc));
128 newc = newr =
Max(newr, newc);
131 datatype newdata(newr * newc, fill_value);
132 for (
size_t r = 0; r <
rows; ++r)
133 std::copy(
data.begin() + r *
cols,
data.begin() + (r + 1) * cols, newdata.begin() + r * newc);
135 std::swap(rows, newr);
136 std::swap(cols, newc);
144 for (
size_t r = 0; r <
rows; ++r)
145 for (
size_t c = 0; c <
cols; ++c)
146 m[r][c] = std::abs(
At(r, c));
166 for (
size_t r = 0; r <
rows; ++r)
167 doFFT(
data.data() + r *
cols, int(cols), direct);
172 for (
size_t r = 0; r <
rows; ++r)
173 doFFT(
data.data() + r *
cols, int(cols), direct);
195 double logs = log2(
int(w));
196 while (logs != ceil(logs))
203 while (logs != ceil(logs))
211 for (
size_t r = 0; r <
GetRows(); ++r)
212 for (
size_t c = 0; c <
GetCols(); ++c)
215 UMatrixComplex c2(std::make_unique<MatrixComplex>(h, w, fill2));
216 for (
size_t r = 0; r < other.
GetRows(); ++r)
217 for (
size_t c = 0; c < other.
GetCols(); ++c)
218 (*c2)[r][c] = other[r][c];
220 for (
size_t r = 0; r < h; ++r)
221 for (
size_t c = 0; c < w; ++c)
222 c1[r][c] *= std::conj((*c2)[r][c]);
228 for (
size_t r = 0; r < h; ++r)
229 for (
size_t c = 0; c < w; ++c)
231 double corr = std::norm(c1[r][c]);
242 p.
X = (p.
X % hw) - hw;
244 p.
Y = (p.
Y % hh) - hh;
245 return std::make_pair(p, maxc);
size_t GetRows() const noexcept
Returns the number of rows.
size_t GetCols() const noexcept
Returns the number of columns.
void FFT(std::vector< std::complex< double > > &sig, bool direct)
Fast Fourier transform.
virtual Matrix & Transpose()
Inplace transposition.
MatrixDouble MakeModule() const
Returns a matrix containing the modules of the inner values.
const T & Max(const T &a, const T &b)
Returns the max of two values.
#define CRN_END_CLASS_CONSTRUCTOR(classname)
Defines a class constructor.
std::vector< std::complex< double > > datatype
std::pair< Point2DInt, double > CrossCorrelation(const MatrixComplex &other, const std::complex< double > &fill1=std::complex< double >(0, 0), const std::complex< double > &fill2=std::complex< double >(0, 0))
Cross correlation.
const std::complex< double > & At(size_t pos) const noexcept
void GrowToPowerOf2(bool make_square, const std::complex< double > &fill_value=std::complex< double >(0, 0))
Grows the matrix to power of 2 sizes (for FFT)
void FFT(bool direct)
Inplace fast Fourier transform.
#define CRN_BEGIN_CLASS_CONSTRUCTOR(classname)
Defines a class constructor.