很多时候,信号处理算法的基础是复数操作,尤其是在频谱分析中。因此,本文介绍了常见的复数操作和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;
}