2017-1-7
function1:
C语言如何实现一个复数加法,好像C语言里没有matlab的复数变量i,那么怎么办:
typedef struct _F_COMPLEX {
double real;
double img;
}F_COMPLEX;
然后在需要的地方调用:
void add(F_COMPLEX a,F_COMPLEX b,F_COMPLEX *c)
{
c->real = a.real + b.real;
c->img = a.img + b.img;
}
即可实现一个复数加法。->操作符适用于结构体指针。
function2:
经常看到需要求一些数学公式,能在math.h里找到的自然最好,找不到的就要自己查一下公式如何实现的。例如求反双曲余弦函数:
数学公式是这样的:


然后就可实现:
double arccosh(double x)//反双曲余弦,
{
return log(x+sqrt(pow(x,2)-1));
}
需要注意的是C语言里log是以e为底的。
function3:
复数的除法:这个好像是上大学那会线性代数还是复变函数里学的,基本上全忘完了,不说了,直接展代码:
void divi(F_COMPLEX a,F_COMPLEX b,F_COMPLEX *c)
{
c->real=( a.real * b.real + a.img * b.img ) / ( b.real * b.real + b.img * b.img);
c->img=( a.img * b.real - a.real * b.img) / (b.real * b.real + b.img * b.img);
}
function4:
一个在信号处理里比较常用的特征值,名曰峭度,数学上不过是归一化的4阶中心矩,没什么神奇的。
matlab 上有现成的函数:kurtosis函数,相应的skewness,歪度还是倾斜度
过程实现:
% qd2=0;
% for w=1:N
% qd2=qd2+(x(w)-mean(x)).^4;
% end
% qd2=qd2/N;
% qd2=qd2/(rms.^4);%qiaodu峭度是原信号的峭度
照着matlab验证完的去敲C代码是比较爽的:
double find_Kurtosis(double a[],int n) //峭度值ok
{
int i;
double qd2=0;
double qd[N]={0};
//double qd2[N]={0};
double mean=find_mean(a,n);
for (i=0;i<n;i++)
{
qd[i]=a[i]-mean;//除均值
}
for (i=0;i<n;i++)
{
qd[i]=pow(qd[i],4);
}
return sum(qd,n)/n/(pow(find_rms(a,n),4));
}
function5:
找一个数组里的最大值。太简单了,就是把数组遍历一遍,然后依次比较如果当前值大于现在的最大值则替换当前的最大值,肯定有遍历一遍还要好的算法,这个找最大值太弱了;
double find_max(double *a,int n)
{
double max_value=a[0];
int i;
for (i=1;i<n;i++)
{
if(a[i] > max_value)
{
//printf("最大值=%f----i=%d---a[i]=%f\n",max_value,i,a[i]);
max_value=a[i];
}
}
return max_value;
}
function6:
找一个数组的平均值:所有点加和除以点数即可;
double find_mean(double a[],int n)
{
double sum_a=sum(a,n);
return sum_a/n;
}
function7:
找一个数组里的最小值,与找最大值得过程一样,不过这样算法的效率也是很低的:
double find_min(double a[],int n)
{
double min_value=a[0];
int i;
for (i=1;i<n;i++)
{
if(a[i]<min_value)
min_value=a[i];
}
return min_value;
}
function8:
找峰峰值,严格意义上来说,应该是最大值减去最小值:
double find_Peak_to_Peak(double a[],int n)
{
return find_max(a,n)-find_min(a,n);
}
function9:
double find_rms(double a[],int n)
{
int i;
double mean;
double b[N]={0};
mean=find_mean(a,n);
for (i=0;i<n;i++)
{
b[i]=a[i]-mean;
}
for (i=0;i<n;i++)
{
b[i]=pow(b[i],2);
}
return sqrt(sum(b,n)/n);
}
function10:
matlab里的翻转函数,
%FLIPLR Flip matrix in left/right direction.
% FLIPLR(X) returns X with row preserved and columns flipped
% in the left/right direction.
%
% X = 1 2 3 becomes 3 2 1
% 4 5 6 6 5 4
matlab是比较强大的,不论你是数组还是矩阵,它都能翻转。
void fliplr(double *a,int len)//实现一维矩阵左右翻转,原始变量输入被修改
{
int i;
double temp;
if(len % 2 == 0){
for (i = 0; i < len / 2; i++) {
temp = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = temp;
}
}
else{
for( i = 0;i < (len-1) / 2;i++ ){
temp = a[i];
a[i] = a[len-i-1];
a[len-i-1] = temp;
}
}
}
function11:
C语言实现两个一维数组相乘;
void muiti_2_array(double *a,int length,double *b,double *c)
{
int i;
for (i=0;i<length;i++){
c[i]=a[i]*b[i];
}
}
function12:
//实现变量与数组相乘
void muiti_a_array(double a,int length,double *b,double *c)
{
int i;
for (i=0;i<length;i++){
c[i]=a*b[i];
}
}
function13:
复数的乘法,返回一个复数变量:
F_COMPLEX mul(F_COMPLEX a, F_COMPLEX b)
{
F_COMPLEX c;
c.real = a.real*b.real - a.img*b.img;
c.img = a.real*b.img + a.img*b.real;
return c;
}
function14:
void mul2(F_COMPLEX a,F_COMPLEX b,F_COMPLEX *c)
{
c->real = a.real*b.real - a.img*b.img;
c->img = a.real*b.img + a.img*b.real;
}
function15:
F_COMPLEX sub(F_COMPLEX a,F_COMPLEX b)
{
FFT_COMPLEX c;
c.real = a.real - b.real;
c.img = a.img -b.img;
return c;
}
function16:
地球人应该都能看懂:
double sum(double a[],int n)//ok
{
double sum=0.0;
int i;
for (i=0;i<n;i++)
{
sum=sum+a[i];
}
return sum;
}
function17:
写出一个运算结果到文件中,无奈基础太差,只能先记下来了;
void write_file(double *pf)
{
int i = 0;
FILE *pfwrite = NULL;
fopen_s(&pfwrite,"test.txt", "w+");
for (i = 0; i < 16384; i++) {
fprintf(pfwrite, "%.20f\n", pf[i]);
}
fclose(pfwrite);
}
fopen_s与fopen的区别,说是一个能编译,一个不能。后面有空再研究。