RISC-V/V203F6P6/disco/complex.h
2025-02-11 14:22:40 +01:00

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