// // C++ Interface: complex // // Description: // // // Author: Mrazik , (C) 2009 // // Copyright: See COPYING file that comes with this distribution // // #ifndef COMPLEX_H #define COMPLEX_H #include typedef short real; typedef int dreal; // 2. násobná šířka static constexpr unsigned HSHIFT = 8u * sizeof(real) - 1u; /** \class Complex \author Mrazik \brief Komplexní číslo a práce s ním Zkrácená verze pracující s 16-bitovými integer. Pouze nutné metody pro FFT. Je to základní datová položka filtru. Všechny metody jsou jednoduché, takže je možné použít inline funkce. */ class complex { private: real re; //!< reálná část real im; //!< imaginární část public: /** * Konstruktor * @param x reálná část * @param y imaginární část */ explicit constexpr complex (const real x, const real y) noexcept : re(x), im(y) {} /** * Default konstruktor (nastaví re=0.0,im=0.0) */ explicit constexpr complex () noexcept : re(0.0), im(0.0) {} // constexpr complex (const complex & o) noexcept : re(o.re), im(o.im) {} /** * Sčítání * @param a odkaz na sčítanec * @param b odkaz na sčítanec */ void add (const complex & a, const complex & b) { re = a.re + b.re; im = a.im + b.im; } /** * Odčítání * @param a odkaz na číslo, od něhož se odčítá * @param b odkaz na číslo, jež se odčítá */ void sub (const complex & a, const complex & b) { re = a.re - b.re; im = a.im - b.im; } /** * Násobení - integer verze výsledek zmenší 2^16-krát. Čili 16.bit*16.bit=32.bit * a vezme se jen horní 16.bitová část, zbytek se zahodí. * @param a odkaz na násobenec * @param b odkaz na násobitel */ void operator*= (const complex & a) { real rt; const dreal ar(a.re), br(re), ai(a.im), bi(im); rt = (ar * br - ai * bi) >> HSHIFT; im = (ar * bi + ai * br) >> HSHIFT; re = rt; } void operator>>= (const real i) { re >>= i; im >>= i; } void setc (const real x, const real y) { re = x; im = y; } real getr (void) const { return re; } real geti (void) const { return im; } void conj (void) { im = -im; } dreal norm () const { const dreal a = re, b = im; return a*a + b*b; } }; #endif