Home
JAQForum Ver 20.06
Log In or Join  
Active Topics
Local Time 04:26 30 Apr 2024 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : MM2(+): Complex numbers

Author Message
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 8584
Posted: 05:11am 12 Jan 2016
Copy link to clipboard 
Print this post

Please find attached a set of CFunctions that do all the basic arithmetical functions on complex numbers including conversion to polar coordinates

Complex numbers are represented as a two element floating point array with the real part in element 0 and the imaginary part in element 1.

There is of course nothing that can't be done in Basic but the CFunctions overcome a huge overhead in parsing and are therefore much quicker.

Note the "cphase" calculation is actually identical to ATAN2 and uses the algorithm TassyJim posted here

Arrays of complex numbers can be represented DIM a!(1,N). Individual numbers can then be used in the calls as follows:

cadd( a!(0,N1), a!(0,N2), c!() )

This adds the N1 and N2 numbers in array a! and puts the answer in c!


option explicit
option default none
'
' Routines to manipulate complex numbers
' Numbers are stored as two element floating point arrays
' The real component is stored in element 0
' The imaginary component is stored in element 1
'
' NB cphase is actually a CFunction implementation of ATAN2(y,x) where y is the imaginary component and x is the real component
'
' cadd: parameters
' x,y,z : result z=x+y
' formula: (a+bi) + (c+di) = (a+c) + (b+d)i
'
' cminus: parameters
' x,y,z : result z=x-y
' formula: (a+bi) - (c+di) = (a-c) + (b-d)i

'
' cmul: parameters
' x,y,z : result z=x*y
' formula: (a+bi) (c+di) = (ac-bd) + (bc+ad)i
'
' cdiv: parameters
' x,y,z : result z=x/y
' formula: (a + bi)/(c + di) = ((ac + bd) / (c^2 + d^2) + ((bc - ad) / (c^2 + d^2)i.
'
' cinv: parameters
' x,z : result z=inv(x)
' formula: (a+bi) = a / (a^2 + b^2) + (- b / (a ^ 2 + b ^ 2))i
'
' cneg: parameters
' x,z : result z=neg(x)
' formula: (a+bi) = -a + (-b)i
'
' cmag: parameters
' x,z : result z=magnitude(x)
' formula: a = ((a ^ 2) + (b ^ 2))^0.5
'
' cconj: parameters
' x,y : result x=conj(y)
' formula: (a+bi) = a + (-b)i
'
' cphase: parameters
' x,z : result z=phase angle(x)
' formula: a = atan2(b/a)
'
' cexp: parameters
' x,z : result z=e^x
' formula: (a+bi)= (e^a * cos(b)) + (e^a * sin(b))i
'

dim a!(1,1)=(1,1,2,2)
DIM b!(1)=(pi,1.2)
Dim c!(1)

cadd a!(0,0),a!(0,1),c!()
print "Add: Real=",c!(0)," Imaginary=",c!(1)
'
cminus a!(0,0),a!(0,1),c!()
print "Subtract: Real=",c!(0)," Imaginary=",c!(1)
'
cmul a!(0,0),a!(0,1),c!()
print "Multiply: Real=",c!(0)," Imaginary=",c!(1)
'
cDiv a!(0,0),a!(0,1),c!()
print "Divide: Real=",c!(0)," Imaginary=",c!(1)
'
cneg a!(),c!()
print "Negate: Real=",c!(0)," Imaginary=",c!(1)
'
cinv a!(),c!()
print "Inverse: Real=",c!(0)," Imaginary=",c!(1)
'
cconj a!(),c!()
print "Conjugate: Real=",c!(0)," Imaginary=",c!(1)
'
cmag a!(),c!()
print "Magnitude: Real=",c!(0)
'
cphase a!(),c!()
print "Phase: Real=",deg(c!(0))
'
cexp a!(),c!()
print "Exponentiate: Real=",c!(0)," Imaginary=",c!(1)

end

CSUB cadd
00000000
27BDFFD8 AFB2001C 3C129D00 AFB10018 AFB00014 00808821 00A08021 8C840000
8CA50000 8E42005C AFBF0024 AFB30020 0040F809 00C09821 AE620000 8E240004
8E42005C 0040F809 8E050004 8FBF0024 AE620004 8FB2001C 8FB30020 8FB10018
8FB00014 03E00008 27BD0028
End CSUB
'
CSUB cminus
00000000
27BDFFD8 AFB2001C 3C129D00 AFB10018 AFB00014 00808821 00A08021 8C840000
8CA50000 8E420060 AFBF0024 AFB30020 0040F809 00C09821 AE620000 8E240004
8E420060 0040F809 8E050004 8FBF0024 AE620004 8FB2001C 8FB30020 8FB10018
8FB00014 03E00008 27BD0028
End CSUB
'
CSUB cmul
00000000
27BDFFD0 AFB00014 3C109D00 AFB2001C AFB10018 00809021 00A08821 8C840000
8CA50000 8E020058 AFBF002C AFB50028 AFB40024 AFB30020 8E140060 0040F809
00C09821 0040A821 8E440004 8E020058 0040F809 8E250004 00402821 0280F809
02A02021 AE620000 8E440000 8E250004 8E020058 0040F809 8E14005C 0040A821
8E440004 8E020058 0040F809 8E250000 00402821 0280F809 02A02021 8FBF002C
AE620004 8FB50028 8FB40024 8FB30020 8FB2001C 8FB10018 8FB00014 03E00008
27BD0030
End CSUB
'
CSUB cdiv
00000000
27BDFFC8 AFB00014 3C109D00 AFB2001C AFB10018 00809021 00A08821 8C840000
8CA50000 8E020058 AFBF0034 AFB70030 AFB6002C AFB50028 AFB40024 AFB30020
8E140064 00C09821 0040F809 8E15005C 0040B021 8E440004 8E020058 0040F809
8E250004 00402821 02A0F809 02C02021 8E240000 0040A821 8E020058 00802821
0040F809 8E16005C 8E240004 0040B821 8E020058 0040F809 00802821 00402821
02C0F809 02E02021 00402821 0280F809 02A02021 AE620000 8E440004 8E250000
8E020058 8E140064 0040F809 8E150060 0040B021 8E440000 8E020058 0040F809
8E250004 00402821 02A0F809 02C02021 8E240000 00409021 8E020058 00802821
0040F809 8E15005C 8E240004 0040B021 8E020058 0040F809 00802821 00402821
02A0F809 02C02021 00402821 0280F809 02402021 8FBF0034 AE620004 8FB70030
8FB6002C 8FB50028 8FB40024 8FB30020 8FB2001C 8FB10018 8FB00014 03E00008
27BD0038
End CSUB
'
CSUB cinv
00000000
27BDFFD8 AFB10014 AFB00010 00808821 3C109D00 8C840000 8E020058 AFBF0024
AFB40020 AFB3001C AFB20018 00A09021 00802821 0040F809 8E13005C 8E240004
0040A021 8E020058 0040F809 00802821 00402821 0260F809 02802021 00409821
8E240000 8E020064 0040F809 02602821 8E03009C 8E140058 3C04BF80 0060F809
AE420000 00402821 0280F809 02602021 8E030064 8E240004 0060F809 00402821
8FBF0024 AE420004 8FB40020 8FB3001C 8FB20018 8FB10014 8FB00010 03E00008
27BD0028
End CSUB
'
CSUB cneg
00000000
27BDFFD8 AFB00010 3C109D00 8E02009C AFBF0024 AFB40020 AFB3001C 8C940000
AFB20018 AFB10014 00809021 3C04BF80 00A08821 0040F809 8E130058 00402821
0260F809 02802021 AE220000 8E02009C 8E520004 3C04BF80 0040F809 8E100058
00402821 0200F809 02402021 8FBF0024 AE220004 8FB40020 8FB3001C 8FB20018
8FB10014 8FB00010 03E00008 27BD0028
End CSUB
'
'
CSUB cconj
00000000
8C820000 27BDFFE0 3C039D00 AFBF001C AFB20018 AFB10014 AFB00010 ACA20000
8C62009C 8C920004 3C04BF80 00A08021 0040F809 8C710058 00402821 0220F809
02402021 8FBF001C AE020004 8FB20018 8FB10014 8FB00010 03E00008 27BD0020
End CSUB
'
CSUB cmag
00000000
27BDFFD0 AFB10018 AFB00014 00808821 3C109D00 8C840000 8E020058 AFBF002C
AFB50028 AFB40024 AFB30020 AFB2001C 00A09021 00802821 8E130074 0040F809
8E14005C 8E240004 0040A821 8E020058 0040F809 00802821 00402821 0280F809
02A02021 00408821 8E02009C 0040F809 3C043F00 00402821 0260F809 02202021
8FBF002C AE420000 8FB50028 8FB40024 8FB30020 8FB2001C 8FB10018 8FB00014
03E00008 27BD0030
End CSUB
'
CSUB cphase
00000000
27BDFFD0 AFB10018 AFB00014 3C119D00 8C900000 8E220068 00801821 AFB40024
AFB2001C AFBF002C AFB50028 AFB30020 00A0A021 02002021 00002821 0040F809
8C720004 2403FFFF 50430070 8E22009C 0200A821 3C119D00 8E22009C 3C0433D6
3484BF95 0040F809 8E330068 00402821 0260F809 02A02021 2403FFFF 1043003C
02002821 8E220064 02402021 0040F809 8E310078 0220F809 00402021 3C119D00
0040A821 8E220068 02002021 0040F809 00002821 24030001 10430038 8FBF002C
8E220068 02402021 0040F809 00002821 2413FFFF 10530006 02002021 8E220068
0040F809 00002821 50530050 8E22009C 3C119D00 8E220068 02402021 0040F809
00002821 00409821 2402FFFF 5262002C 8E220068 3C119D00 8E220068 02402021
0040F809 00002821 24030001 5043002C 8E220068 3C029D00 8C42009C 3C04BFC9
0040F809 24840FDA AE820000 8FBF002C 8FB50028 8FB40024 8FB30020 8FB2001C
8FB10018 8FB00014 03E00008 27BD0030 0000A821 3C119D00 02A08021 8E220068
02002021 0040F809 00002821 24030001 5443FFCC 8E220068 8FBF002C AE950000
8FB30020 8FB50028 8FB40024 8FB2001C 8FB10018 8FB00014 03E00008 27BD0030
02002021 0040F809 00002821 5453FFD2 3C119D00 8E22009C 10000015 8E300060
02002021 0040F809 00002821 1440FFD2 3C029D00 8E22009C 3C043FC9 0040F809
24840FDA 1000FFD1 AE820000 3C04BF80 0040F809 8E310058 00402821 0220F809
02002021 1000FF8B 0040A821 8E30005C 3C044049 0040F809 24840FDA 00402821
0200F809 02A02021 1000FFC0 AE820000
End CSUB

CSUB cexp
00000000
27BDFFD0 AFB00010 3C109D00 00801821 AFB40020 8E02009C 8C940000 3C04402D
AFBF002C AFB60028 AFB50024 AFB3001C AFB20018 AFB10014 3484F854 8C730004
00A08821 0040F809 8E120074 00402021 0240F809 02802821 00409021 3C043FC9
8E02009C 24840FDB 8E160060 8E140058 0040F809 8E15006C 00402021 02C0F809
02602821 02A0F809 00402021 00402821 0280F809 02402021 8E03006C 02602021
8E100058 0060F809 AE220000 00402821 0200F809 02402021 8FBF002C AE220004
8FB60028 8FB50024 8FB40020 8FB3001C 8FB20018 8FB10014 8FB00010 03E00008
27BD0030
End CSUB


Edited by matherp 2016-01-13
 
PicFan
Senior Member

Joined: 18/03/2014
Location: Austria
Posts: 133
Posted: 09:48am 12 Jan 2016
Copy link to clipboard 
Print this post

Thank you, i will try in the next time.
 
Print this page


To reply to this topic, you need to log in.

© JAQ Software 2024