101 lines
2.5 KiB
C++
101 lines
2.5 KiB
C++
//
|
|
// C++ Interface: complex
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Author: Mrazik <mraz@seznam.cz>, (C) 2009
|
|
//
|
|
// Copyright: See COPYING file that comes with this distribution
|
|
//
|
|
//
|
|
#ifndef COMPLEX_H
|
|
#define COMPLEX_H
|
|
|
|
#include <math.h>
|
|
typedef short real;
|
|
typedef int dreal; // 2. násobná šířka
|
|
|
|
static constexpr unsigned HSHIFT = 8u * sizeof(real) - 1u;
|
|
|
|
/**
|
|
\class Complex
|
|
|
|
\author Mrazik <mrazik@volny.cz>
|
|
|
|
\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
|