📄 tool.cpp
字号:
#include "Common.h"
float Gauss_rand()
{
float random_num;
double u1,u2;
u1=((float)rand()+1.f)/32768.f;
u2=((float)rand()+1.f)/32768.f;
random_num=(float)(sqrt(-2.*log(u1))*cos(2*Pi*u2));
return random_num;
}
void Dec2Bin(int DecData,int BinLength,int *BinData)
{
int i,quot;
i=0;
quot=DecData;
for(i=0;i<BinLength;i++)
{
BinData[i]=quot%2;
quot=quot/2;
}
}
int Bin2Dec(int BinLength,int *BinData)
{
int i,weight;
int DecData = 0;
for(i=0;i<BinLength;i++)
{
weight=1<<i;
DecData+=BinData[i]*weight;
}
return(DecData);
}
int sign(float x)
{
int y;
if(x>=0)
y=1;
else
y=-1;
return y;
}
complex GenComplex(float Txpulse1,float Txpulse2)
{
complex temp;
temp.real=Txpulse1;
temp.imag=Txpulse2;
return temp;
}
complex ComplexMul(complex a,complex b)
{
complex temp;
temp.real = a.real*b.real-a.imag*b.imag;
temp.imag = a.real*b.imag+a.imag*b.real;
return temp;
}
complex ComplexMulR(complex a,float b)
{
complex temp;
temp.real = a.real*b;
temp.imag = a.imag*b;
return temp;
}
complex ComplexExp(float omega)
{
complex temp;
temp.real = (float)cos(omega);
temp.imag = (float)sin(omega);
return temp;
}
complex ComplexAdd(complex a,complex b)
{
complex temp;
temp.real=a.real+b.real;
temp.imag=a.imag+b.imag;
return temp;
}
complex ComplexSub(complex a,complex b)
{
complex temp;
temp.real=a.real-b.real;
temp.imag=a.imag-b.imag;
return temp;
}
complex ComplexConj(complex a)
{
complex temp;
temp=a;
temp.imag=-temp.imag;
return temp;
}
float ComplexPow(complex a)
{
return a.real*a.real+a.imag*a.imag;
}
float ComplexPhase(complex a)
{
float x,y,Phase;
x=a.real;
y=a.imag;
if(x==0)
{
Phase=(float)Pi/2;
}
else
{
Phase=(float)atan(y/x);
}
if(x<0&&y<=0)
Phase=Phase-(float)Pi;
else if(x<0&&y>0)
Phase=Phase+(float)Pi;
return Phase;
}
void ExChange_Complex(complex *A,complex *B)
{
complex temp = {0.f,0.f};
temp = *A;
*A = *B;
*B = temp;
}
complex ComplexDiv(complex a,complex b)
{
float c;
complex bconj,DivResult;
c=1.f/(float)ComplexPow(b);
bconj=ComplexConj(b);
DivResult=ComplexMulR(ComplexMul(a,bconj),c);
return DivResult;
}
complex ComplexDivR(complex a, float b)
{
complex c;
c.real = a.real/b;
c.imag = a.imag/b;
return c;
}
void ExChange_int(int *A, int *B)
{
int temp = 0;
temp = *A;
*A = *B;
*B = temp;
}
float GetPs(float *Signal, int Length)
{
int i;
float Ps=0.f;
for(i=0;i<Length;i++)
{
Ps+=Signal[i]*Signal[i];
}
Ps/=(float)Length;
return(Ps);
}
void FFT(complex *Signal,complex *FFTsignal,int flag,int FFTn)
{
//if flag == 1, FFT;
//if flag == -1, IFFT;
int FFTOrd = 0;
int i=0,j=0,k=0,l=0;
int le=0,le1=0,ip=0;
complex temp={0.f,0.f},u={0.f,0.f},w={0.f,0.f};
FFTOrd=0;
while(FFTn != (0x0001<<FFTOrd))
FFTOrd++;
memcpy(FFTsignal,Signal,FFTn*sizeof(complex));
for(i=0,j=0;i<FFTn-1;i++)
{
if(i<j)
{
temp=FFTsignal[j];
FFTsignal[j]=FFTsignal[i];
FFTsignal[i]=temp;
}
k=FFTn/2;
while(k<=j)
{
j-=k;
k/=2;
}
j+=k;
}
le=1;
for(l=0;l<FFTOrd;l++)
{
le*=2;
le1=le/2;
u.real=1.0f;
u.imag=0.0f;
w.real=(float)(cos(Pi/le1));
w.imag=(float)(-flag*sin(Pi/le1));
for(j=0;j<le1;j++)
{
for(i=j;i<FFTn;i+=le)
{
ip=i+le1;
temp=ComplexMul(FFTsignal[ip],u);
FFTsignal[ip]=ComplexSub(FFTsignal[i],temp);
FFTsignal[i]=ComplexAdd(FFTsignal[i],temp);
}
u=ComplexMul(u,w);
}
}
if(flag==-1)
{
for(i=0;i<FFTn;i++)
{
FFTsignal[i].real/=(float)(FFTn);
FFTsignal[i].imag/=(float)(FFTn);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -