1 /*file ComplexCalculation.c2 *author Vincent Cui3 *e-mail whcui1987@163.com4 *version 0.15 *data 20-Oct-20146 *brief 用于复数运算的一些函数7 */
8
9
10 #include "ComplexCalculation.h"
11 #include "math.h"
12 #include "stdio.h"
13
14
15 /*函数名:complexAdd16 *说明:复数加法17 *输入:a,b两个复数18 *输出:19 *返回:a + b20 *调用:21 *其它:22 */
23 complexType complexAdd(complexType a, complexType b)24 {25 complexType result;26
27 result.Real = a.Real +b.Real;28 result.Imag = a.Imag +b.Imag;29
30 returnresult;31 }32
33 /*函数名:complexSubtract34 *说明:复数减法35 *输入:minuend被减数,subtrahend减数36 *输出:37 *返回:a - b38 *调用:39 *其它:40 */
41 complexType complexSubtract(complexType minuend, complexType subtrahend)42 {43 complexType result;44
45 result.Real = minuend.Real -subtrahend.Real;46 result.Imag = minuend.Imag -subtrahend.Imag;47
48 returnresult;49 }50
51 /*函数名:complexMultiply52 *说明:复数乘法53 *输入:a,b两个复数54 *输出:55 *返回:a * b56 *调用:57 *其它:58 */
59 complexType complexMultiply(complexType a, complexType b)60 {61 complexType result;62
63 result.Real = a.Real * b.Real - a.Imag *b.Imag;64 result.Imag = a.Imag * b.Real + a.Real *b.Imag;65
66 returnresult;67 }68
69
70 /*函数名:complexDivision71 *说明:复数除法72 *输入:dividend被除数,divisor除数73 *输出:74 *返回:a / b75 *调用:76 *其它:divisor的实部和虚部不能同时为077 */
78 complexType complexDivision(complexType dividend, complexType divisor)79 {80 complexType result;81
82 /*断言,被除数的实部和虚部不能同时为零*/
83 assert_param(IS_COMPLEX_DIVISOR_CORRENT(divisor.Real, divisor.Imag));84
85 result.Real = (mathDouble)(dividend.Real * divisor.Real + dividend.Imag * divisor.Imag) /\86 (divisor.Real * divisor.Real + divisor.Imag *divisor.Imag);87 result.Imag = (mathDouble)(dividend.Imag * divisor.Real - dividend.Real * divisor.Imag) /\88 (divisor.Real * divisor.Real + divisor.Imag *divisor.Imag);89 returnresult;90 }91
92 /*函数名:complexAbs93 *说明:复数取模94 *输入:a复数95 *输出:96 *返回:复数的模97 *调用:98 *其它:99 */
100 mathDouble complexAbs(complexType a)101 {102 return (sqrt( pow(a.Real,2) + pow(a.Imag,2) ));103 }104
105
106 /*函数名:complexAngle107 *说明:复数取相角108 *输入:a复数109 *输出:110 *返回:复数的相角111 *调用:112 *其它:113 */
114 mathDouble complexAngle(complexType a)115 {116 /*是atan2而非atan,(-PI,PI]*/
117 return(atan2(a.Imag, a.Real));118 }119
120 /*函数名:complexByAbsAngle121 *说明:通过模和相角合成复数122 *输入:r 模, theta 相角123 *输出:124 *返回:复数125 *调用:126 *其它:127 */
128 complexType complexByAbsAngle(mathDouble r, mathDouble theta)129 {130 complexType tmp_1,tmp_2;131
132 tmp_1.Real = 0;133 tmp_1.Imag =theta;134 tmp_2 =complexExp(tmp_1);135 tmp_2.Real *=r;136 tmp_2.Imag *=r;137
138 returntmp_2;139 }140
141 /*函数名:complexExp142 *说明:复指数运算143 *输入:a 复指数144 *输出:145 *返回:e的a次方146 *调用:147 *其它:使用欧拉公式 e^(jw) = cos(w) + j * sin(w)148 */
149 complexType complexExp(complexType a)150 {151 complexType result;152
153 result.Real = exp(a.Real) *cos(a.Imag);154 result.Imag = exp(a.Real) *sin(a.Imag);155
156 returnresult;157 }158
159
160 #if ASSERT_ENABLE
161 /*函数名:assert_failed162 *说明:断言函数163 *输入:164 *输出:打印出错的位置165 *返回:166 *调用:167 *其它:168 */
169 void assert_failed(mathUint_8*file, mathUint_32 line)170 {171 printf("Assert Error in File: %s \r\nLine: %d \r\n",file,line);172 }173
174 #endif