⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 complex.c

📁 一款工程FFT的计算
💻 C
字号:
/***
*Complex.c - The library function of complex operation.
*
*Purpose:
*	This file offer the complex library operation.
*	Add, Sub, Mul, Div, Expj, etc...
*
*Copyright:
*	Modified by Jianlan Liu
*	2006-01-08 18:02
*	All rights reserved.
*
*Environment:
*	Editor - SourceInsight 3.5
*	Edit font - Consolas - 12
*	Tab width - 4
*	Compiler - Turbo C 2.0
****/

#include <math.h>
#include "Common.h"
#include "Complex.h"

/***
* ...
* (a1+j*b1) + (a2+j*b2) = (a1+a2) + j*(b1+b2)
*******************************************************************************/
void Cplx_Add(COMPLEX *dst, COMPLEX *src)
{
	dst->real += src->real;
	dst->img += src->img;
}

/***
* ...
* (a1+j*b1) - (a2+j*b2) = (a1-a2) + j*(b1-b2)
*******************************************************************************/
void Cplx_Sud(COMPLEX *dst, COMPLEX *src)
{
	dst->real -= src->real;
	dst->img -= src->img;
}

/***
* ...
* (a1+j*b1) * (a2+j*b2) = (a1*a2-b1*b2) + j*(a1*b2+a2*b1)
*******************************************************************************/
void Cplx_Mul(COMPLEX *dst, COMPLEX *src)
{
	double real;
	double img;

	real = dst->real*src->real - dst->img*src->img;
	img = dst->real*src->img + src->real*dst->img;

	dst->real = real;
	dst->img = img;
}

/***
* ...
* (a1+j*b1) / (a2+j*b2) = [(a1*a2+b1*b2) + j*(a2*b1-a1*b2)] / (a2*a2-b2*b2)
*						= (a1*a2+b1*b2)/(a2*a2-b2*b2) + j*(a2*b1-a1*b2)/(a2*a2-b2*b2)
* 此处, 为了节省开辟堆栈的时间, 采用了全局变量, 为不可重入函数\
* 所以在调用的时候需保证不会有中断函数调用它
*******************************************************************************/
void Cplx_Div(COMPLEX *dst, COMPLEX *src)
{
	double sq_sub_ab;	/* a2*a2 - b2*b2 */
	double real;
	double img;

	sq_sub_ab = src->real*src->real - src->img*src->img;
	if (sq_sub_ab == 0.0L) {
		/* The illegal data, 采集到非法数据,忽略,当作除一数据1.0L */
	}
	else {
		real = (dst->real*src->real + dst->img*src->img) / sq_sub_ab;
		img = (src->real*dst->img - dst->real*src->img) / sq_sub_ab;

		dst->real = real;
		dst->img = img;
	}
}

/***
* ...
* (a1+j*b1) / a2 = (a1/a2) + j*(b1/a2)
* 此处, 为了节省开辟堆栈的时间, 采用了全局变量, 为不可重入函数\
* 所以在调用的时候需保证不会有中断函数调用它
*******************************************************************************/
void Cplx_Div2(COMPLEX *dst, double src_real)
{
	if (src_real == 0) {
		/* The illegal data, 采集到非法数据,忽略,当作除一数据1.0L */
	}
	else {
		dst->real /= src_real;
		dst->img /= src_real;
	}
}

/***
* ...
* e^(b*j) = cos(b) + j*sin(b)
*******************************************************************************/
void Cplx_Expj(COMPLEX *dst, double img_b)
{
	dst->real = cos(img_b);
	dst->img = sin(img_b);
}

/***
* ...
* |a+j*b| = sqrt(a*a + b*b)
*******************************************************************************/
double Cplx_Mod(COMPLEX *src)
{
	return sqrt(src->real*src->real + src->img*src->img);
}

/***
* ...
*******************************************************************************/
void Cplx_Eva(COMPLEX *dst, COMPLEX *src)
{
	dst->real = src->real;
	dst->img = src->img;
}

/***
* ...
*******************************************************************************/
void Cplx_Eva2(COMPLEX *dst, double real, double img)
{
	dst->real = real;
	dst->img = img;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -