Files
radio/ComplexVector.cpp
T
jens 290fd5f5e0 Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/radio@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-07-19 07:44:42 +00:00

446 lines
13 KiB
C++
Executable File

#include <windows.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "ComplexVector.hpp"
void ComplexDebug(char *fmtstr, ...)
{
char buf[1024];
va_list args;
va_start(args, fmtstr);
vsprintf(buf, fmtstr, args);
va_end(args);
OutputDebugString(buf);
}
// Class Methods
// Standard constructor
ComplexVector::ComplexVector(uint32_t size, radio_float_t *real, radio_float_t *imag)
: m_size(size)
, m_real(size, real)
, m_imag(size, imag)
{
}
// Constructor from RealVector
ComplexVector::ComplexVector(const RealVector &real, const RealVector &imag)
: m_size(real.getSize())
, m_real(real, real.m_unary_modifier)
, m_imag(imag, imag.m_unary_modifier)
{
// Check if real and imag have same length
}
// Constructor from RealVector pointer
ComplexVector::ComplexVector(RealVector *real, RealVector *imag)
: m_size(real->getSize())
, m_real(*real)
, m_imag(*imag)
{
// Check if real and imag have same length
}
// Scalar constructor
ComplexVector::ComplexVector(radio_float_t real, radio_float_t imag)
: m_size(1)
, m_real(real)
, m_imag(imag)
{
}
//
ComplexVector::ComplexVector(const _ComplexVector &src)
: m_size(src.m_size)
, m_real(src.m_real)
, m_imag(src.m_imag)
{
}
//
_ComplexVector::_ComplexVector(const ComplexVector &src)
: m_size(src.m_size)
, m_real(src.m_real)
, m_imag(src.m_imag)
{
}
_ComplexVector::_ComplexVector(const _RealVector &real, const _RealVector &imag)
: m_size(real.m_size)
, m_real(real)
, m_imag(imag)
{
}
ComplexVector::~ComplexVector(void)
{
}
_ComplexVector _ComplexVector::operator-() const
{
return _ComplexVector(-this->m_real, -this->m_imag);
}
_ComplexVector _ComplexVector::conj() const
{
return _ComplexVector(this->m_real, -this->m_imag);
}
uint32_t ComplexVector::getSize()
{
return m_size;
}
ComplexVector ComplexVector::at(uint32_t const &i)
{
return ComplexVector(*this, i, 1, i);
}
void ComplexVector::print(char *pPrefix)
{
uint32_t i;
ComplexDebug("%s:\n", pPrefix);
for (i=0; i < m_size; i++)
{
if (m_imag.at(i).getValue() < 0)
{
ComplexDebug("%d: %.6f - %.6fj\n", i, m_real.at(i).getValue(), -m_imag.at(i).getValue());
}
else
{
ComplexDebug("%d: %.6f + %.6fj\n", i, m_real.at(i).getValue(), m_imag.at(i).getValue());
}
}
}
ComplexVector ComplexVector::operator-() const
{
return ComplexVector(-this->m_real, -this->m_imag);
}
const ComplexVector& ComplexVector::operator+() const
{
return *this;
}
ComplexVector ComplexVector::conj() const
{
return ComplexVector(this->m_real, -this->m_imag);
}
// -------------------------------------------------
// Assignments
// -------------------------------------------------
// = ComplexVector
ComplexVector& ComplexVector::operator=(const ComplexVector &src)
{
this->m_real = src.m_real;
this->m_imag = src.m_imag;
return *this;
}
// += ComplexVector
ComplexVector& ComplexVector::operator+=(const ComplexVector &src)
{
this->m_real += src.m_real;
this->m_imag += src.m_imag;
return *this;
}
// -= ComplexVector
ComplexVector& ComplexVector::operator-=(const ComplexVector &src)
{
this->m_real -= src.m_real;
this->m_imag -= src.m_imag;
return *this;
}
// *= ComplexVector
ComplexVector& ComplexVector::operator*=(const ComplexVector &src)
{
this->m_real = (this->m_real*src.m_real - this->m_imag*src.m_imag);
this->m_imag = (this->m_real*src.m_imag + this->m_imag*src.m_real);
return *this;
}
// /= ComplexVector
ComplexVector& ComplexVector::operator/=(const ComplexVector &src)
{
// ToDo: Das ist falsch
this->m_real = (this->m_real*src.m_real - this->m_imag*src.m_imag);
this->m_imag = (this->m_real*src.m_imag + this->m_imag*src.m_real);
return *this;
}
// Binary operators
// = ComplexVector::OpBinaryAdd
ComplexVector& ComplexVector::operator=(OpBinary<ComplexVector::Add> src)
{
this->m_real = (src.a.m_real + src.b.m_real);
this->m_imag = (src.a.m_imag + src.b.m_imag);
return *this;
}
// = ComplexVector::OpBinaryAdd
ComplexVector& ComplexVector::operator+=(OpBinary<ComplexVector::Add> src)
{
this->m_real += (src.a.m_real + src.b.m_real);
this->m_imag += (src.a.m_imag + src.b.m_imag);
return *this;
}
// = ComplexVector::OpBinaryAdd
ComplexVector& ComplexVector::operator-=(OpBinary<ComplexVector::Add> src)
{
this->m_real -= (src.a.m_real + src.b.m_real);
this->m_imag -= (src.a.m_imag + src.b.m_imag);
return *this;
}
// = ComplexVector::OpBinaryAdd
ComplexVector& ComplexVector::operator*=(OpBinary<ComplexVector::Add> src)
{
// ToDo: this wird über schrieben
this->m_real = ((src.a.m_real + src.b.m_real)*this->m_real - (src.a.m_imag + src.b.m_imag)*this->m_imag);
this->m_imag = ((src.a.m_imag + src.b.m_imag)*this->m_real + (src.a.m_real + src.b.m_real)*this->m_imag);
return *this;
}
// = ComplexVector::OpBinaryAdd
ComplexVector& ComplexVector::operator/=(OpBinary<ComplexVector::Add> src)
{
// ToDo: this wird über schrieben
// ToDo: Das ist falsch
this->m_real = ((src.a.m_real + src.b.m_real)*this->m_real - (src.a.m_imag + src.b.m_imag)*this->m_imag);
this->m_imag = ((src.a.m_imag + src.b.m_imag)*this->m_real + (src.a.m_real + src.b.m_real)*this->m_imag);
return *this;
}
// = ComplexVector::OpBinarySub
ComplexVector& ComplexVector::operator=(OpBinary<ComplexVector::Sub> src)
{
this->m_real = (src.a.m_real - src.b.m_real);
this->m_imag = (src.a.m_imag - src.b.m_imag);
return *this;
}
// = ComplexVector::OpBinarySub
ComplexVector& ComplexVector::operator+=(OpBinary<ComplexVector::Sub> src)
{
this->m_real += (src.a.m_real - src.b.m_real);
this->m_imag += (src.a.m_imag - src.b.m_imag);
return *this;
}
// = ComplexVector::OpBinarySub
ComplexVector& ComplexVector::operator-=(OpBinary<ComplexVector::Sub> src)
{
this->m_real -= (src.a.m_real - src.b.m_real);
this->m_imag -= (src.a.m_imag - src.b.m_imag);
return *this;
}
// = ComplexVector::OpBinarySub
ComplexVector& ComplexVector::operator*=(OpBinary<ComplexVector::Sub> src)
{
// ToDo: this wird über schrieben
this->m_real = ((src.a.m_real - src.b.m_real)*this->m_real - (src.a.m_imag - src.b.m_imag)*this->m_imag);
this->m_imag = ((src.a.m_imag - src.b.m_imag)*this->m_real + (src.a.m_real - src.b.m_real)*this->m_imag);
return *this;
}
// = ComplexVector::OpBinarySub
ComplexVector& ComplexVector::operator/=(OpBinary<ComplexVector::Sub> src)
{
// ToDo: this wird über schrieben
// ToDo: Das ist falsch
this->m_real = ((src.a.m_real - src.b.m_real)*this->m_real - (src.a.m_imag - src.b.m_imag)*this->m_imag);
this->m_imag = ((src.a.m_imag - src.b.m_imag)*this->m_real + (src.a.m_real - src.b.m_real)*this->m_imag);
return *this;
}
// = ComplexVector::OpBinaryMul
ComplexVector& ComplexVector::operator=(OpBinary<ComplexVector::Mul> src)
{
if ((this != &reinterpret_cast<ComplexVector&>(src.a)) && (this != &reinterpret_cast<ComplexVector&>(src.b)))
{
this->m_real = (src.a.m_real * src.b.m_real);
this->m_real -= (src.a.m_imag * src.b.m_imag);
this->m_imag = (src.a.m_real * src.b.m_imag);
this->m_imag += (src.a.m_imag * src.b.m_real);
}
else
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = result;
}
return *this;
}
// += ComplexVector::OpBinaryMul
ComplexVector& ComplexVector::operator+=(OpBinary<ComplexVector::Mul> src)
{
if ((this != &reinterpret_cast<ComplexVector&>(src.a)) && (this != &reinterpret_cast<ComplexVector&>(src.b)))
{
this->m_real += (src.a.m_real * src.b.m_real);
this->m_real -= (src.a.m_imag * src.b.m_imag);
this->m_imag += (src.a.m_real * src.b.m_imag);
this->m_imag += (src.a.m_imag * src.b.m_real);
}
else
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this + result;
}
return *this;
}
// -= ComplexVector::OpBinaryMul
ComplexVector& ComplexVector::operator-=(OpBinary<ComplexVector::Mul> src)
{
if ((this != &reinterpret_cast<ComplexVector&>(src.a)) && (this != &reinterpret_cast<ComplexVector&>(src.b)))
{
this->m_real -= (src.a.m_real * src.b.m_real);
this->m_real += (src.a.m_imag * src.b.m_imag);
this->m_imag -= (src.a.m_real * src.b.m_imag);
this->m_imag -= (src.a.m_imag * src.b.m_real);
}
else
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this - result;
}
return *this;
}
// *= ComplexVector::OpBinaryMul
ComplexVector& ComplexVector::operator*=(OpBinary<ComplexVector::Mul> src)
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this * result;
return *this;
}
// /= ComplexVector::OpBinaryMul
ComplexVector& ComplexVector::operator/=(OpBinary<ComplexVector::Mul> src)
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this / result;
return *this;
}
// Div
// = ComplexVector::OpBinaryDiv
ComplexVector& ComplexVector::operator=(OpBinary<ComplexVector::Div> src)
{
if ((this != &reinterpret_cast<ComplexVector&>(src.a)) && (this != &reinterpret_cast<ComplexVector&>(src.b)))
{
this->m_real = (src.a.m_real * src.b.m_real);
this->m_real -= (src.a.m_imag * src.b.m_imag);
this->m_imag = (src.a.m_real * src.b.m_imag);
this->m_imag += (src.a.m_imag * src.b.m_real);
}
else
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = result;
}
return *this;
}
// += ComplexVector::OpBinaryDiv
ComplexVector& ComplexVector::operator+=(OpBinary<ComplexVector::Div> src)
{
if ((this != &reinterpret_cast<ComplexVector&>(src.a)) && (this != &reinterpret_cast<ComplexVector&>(src.b)))
{
this->m_real += (src.a.m_real * src.b.m_real);
this->m_real -= (src.a.m_imag * src.b.m_imag);
this->m_imag += (src.a.m_real * src.b.m_imag);
this->m_imag += (src.a.m_imag * src.b.m_real);
}
else
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this + result;
}
return *this;
}
// -= ComplexVector::OpBinaryDiv
ComplexVector& ComplexVector::operator-=(OpBinary<ComplexVector::Div> src)
{
if ((this != &reinterpret_cast<ComplexVector&>(src.a)) && (this != &reinterpret_cast<ComplexVector&>(src.b)))
{
this->m_real -= (src.a.m_real * src.b.m_real);
this->m_real += (src.a.m_imag * src.b.m_imag);
this->m_imag -= (src.a.m_real * src.b.m_imag);
this->m_imag -= (src.a.m_imag * src.b.m_real);
}
else
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this - result;
}
return *this;
}
// *= ComplexVector::OpBinaryDiv
ComplexVector& ComplexVector::operator*=(OpBinary<ComplexVector::Div> src)
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this * result;
return *this;
}
// /= ComplexVector::OpBinaryDiv
ComplexVector& ComplexVector::operator/=(OpBinary<ComplexVector::Div> src)
{
ComplexVector result((src.a.m_real * src.b.m_real) - (src.a.m_imag * src.b.m_imag), (src.a.m_real * src.b.m_imag) + (src.a.m_imag * src.b.m_real));
*this = *this / result;
return *this;
}
// -------------------------------------------------
// Binary Operators
// -------------------------------------------------
// Add
// ComplexVector + ComplexVector*
ComplexVector::OpBinary<ComplexVector::Add> operator+(const ComplexVector &a, const ComplexVector &b)
{
return ComplexVector::OpBinary<ComplexVector::Add> (a, b);
}
// Sub
// ComplexVector - ComplexVector*
ComplexVector::OpBinary<ComplexVector::Sub> operator-(const ComplexVector &a, const ComplexVector &b)
{
return ComplexVector::OpBinary<ComplexVector::Sub> (a, b);
}
// Mul
// ComplexVector * ComplexVector*
ComplexVector::OpBinary<ComplexVector::Mul> operator*(const ComplexVector &a, const ComplexVector &b)
{
return ComplexVector::OpBinary<ComplexVector::Mul> (a, b);
}
// Div
// ComplexVector / ComplexVector*
ComplexVector::OpBinary<ComplexVector::Div> operator/(const ComplexVector &a, const ComplexVector &b)
{
return ComplexVector::OpBinary<ComplexVector::Div> (a, b);
}