51 lines
1.3 KiB
JavaScript
51 lines
1.3 KiB
JavaScript
/*
|
|
basic complex number arithmetic from
|
|
http://rosettacode.org/wiki/Fast_Fourier_transform#Scala
|
|
*/
|
|
function Complex(re, im)
|
|
{
|
|
this.re = re;
|
|
this.im = im || 0.0;
|
|
}
|
|
Complex.prototype.add = function(other, dst)
|
|
{
|
|
dst.re = this.re + other.re;
|
|
dst.im = this.im + other.im;
|
|
return dst;
|
|
}
|
|
Complex.prototype.sub = function(other, dst)
|
|
{
|
|
dst.re = this.re - other.re;
|
|
dst.im = this.im - other.im;
|
|
return dst;
|
|
}
|
|
Complex.prototype.mul = function(other, dst)
|
|
{
|
|
//cache re in case dst === this
|
|
var r = this.re * other.re - this.im * other.im;
|
|
dst.im = this.re * other.im + this.im * other.re;
|
|
dst.re = r;
|
|
return dst;
|
|
}
|
|
Complex.prototype.cexp = function(dst)
|
|
{
|
|
var er = Math.exp(this.re);
|
|
dst.re = er * Math.cos(this.im);
|
|
dst.im = er * Math.sin(this.im);
|
|
return dst;
|
|
}
|
|
Complex.prototype.log = function()
|
|
{
|
|
/*
|
|
although 'It's just a matter of separating out the real and imaginary parts of jw.' is not a helpful quote
|
|
the actual formula I found here and the rest was just fiddling / testing and comparing with correct results.
|
|
http://cboard.cprogramming.com/c-programming/89116-how-implement-complex-exponential-functions-c.html#post637921
|
|
*/
|
|
if( !this.re )
|
|
console.log(this.im.toString()+'j');
|
|
else if( this.im < 0 )
|
|
console.log(this.re.toString()+this.im.toString()+'j');
|
|
else
|
|
console.log(this.re.toString()+'+'+this.im.toString()+'j');
|
|
}
|