复数的常规运算与C代码实现

很多时候,信号处理算法的基础是复数运算,尤其在涉及频谱分析时复数运算十分常见,因此本文介绍常见的复数运算及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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷达爆破手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值