很多时候,信号处理算法的基础是复数运算,尤其在涉及频谱分析时复数运算十分常见,因此本文介绍常见的复数运算及C语言代码。
下面提到的函数,基于以下数据结构:
typedef struct xy
{
float re;
float im;
}comp;
- 复数加法
函数申明 :comp cadd(comp a,comp b);
函数体:
comp cadd(comp a,comp b){
comp c;
c.re = a.re + b.re;
c.im = a.im + b.re;
return c;
}
- 复数减法
函数申明 :comp csub(comp a,comp b);'
函数体:
comp csub(comp a,comp b){
comp c;
c.re = a.re - b.re;
c.im = a.im - b.re;
return c;
}
- 复数乘法
函数申明:comp cmul(comp a,comp b);
函数体 :
comp cmul(comp a,comp b){
comp c;
c.re = (a.re*b.re) - (a.im*b.im);
c.im = (a.re*b.im) + (b.re*a.im);
return c;
}
- 复数求模
函数申明:float cabs1(comp a);
函数体 :
float cabs1(comp a){
float c;
c =(float)sqrt(a.re*a.re + a.im*a.im);
return c;
}
- 复数求共轭
函数申明:comp conjg(comp a);
函数体 :
comp conjg(comp a){
comp c;
c.re = a.re;
c.im = -a.im;
return c;
}
- 函数的幂
函数申明:comp cpow(comp a,double n);
函数说明:这里幂次不是整数幂,不能使用for循环执行复数乘法,这里介绍另外一种方法。根据欧拉公式,任意一个复数可以表示成一个实数和三角函数相乘的形式:
Z n = ( ρ e j w ) n = ρ n e j w n = ρ n ( cos ( w n ) + j sin ( w n ) ) {{Z}^{n}}={{(\rho {{e}^{jw}})}^{n}}={{\rho }^{n}}{{e}^{jwn}}={{\rho }^{n}}(\cos (wn)+j\sin (wn)) Zn=(ρejw)n=ρnejwn=ρn(cos(wn)+jsin(wn))
comp cpow(comp a,double n){
comp c;
float cabs;
float cthe;
cabs = cabs1(a) ^ n; //先求(a的模的N次幂);
cthe = atan(a.im/a.re); // 再求相角 w
c.re = cabs*cos(cthe*n);
c.im = cabs*sin(cthe*n);
return c;
}