📄 gold.cpp
字号:
#include <math.h>
#include <complex>
using namespace std;
#ifndef PI
#define PI 3.1415926535897932
#define PPII 3.14159
#endif
/******************************************************************************
Function: int gcd(int count1,int count2);
Purpose:
Resolve the great common division of two positive integers
Paramters:
count1: the first number
count2: the second number
Function returns:
the great common division of two positive integers
******************************************************************************/
int gcd(int a,int b)
{
int quotient,remainder,c;
if (a<b)
{
c=a;
a=b;
b=c;
}
remainder=1;
while (remainder!=0)
{
quotient=a/b;
remainder=a%b;
a=b;
b=remainder;
}
return a;
}
/******************************************************************************
Function: int coprime(int count1,int a[])
Purpose: to resolve the integers that coprime to the appointed integer
and lower than the appointed integer
Paramters:
count1: the appointed integer
count2: the array to store the resolved integers
Function returns:
the number that coprime to m between 1~(m-1)
******************************************************************************/
int coprime(int m,int a[])
{
int i,sum;
sum=0;
for (i=1;i<m;i++)
if (gcd(m,i)==1)
{
a[sum]=i;
sum++;
}
return sum;
}
void Gold(int q, int sequence[],long lNumber,long lLength)
{
int *um_sequence,*v_sequence,*regist;
int tn,ms_length,num,m;
int i,j,t,x,shift;
int *temp,*temp1,*GoldTemp;
int array[101][101];
for (i=1;i<101;i++)
{
for (j=1;j<101;j++)
array[i][j]=0;
}
for (i=1;i<101;i++)
{
array[i][0]=1;
array[i][i]=1;
}
array[2][1]=1;
array[3][1]=1;
array[4][1]=1;
array[5][2]=1;
array[6][1]=1;
array[7][1]=1;
array[8][1]=1; array[8][5]=1; array[8][6]=1;
array[9][4]=1;
array[10][3]=1;
array[11][2]=1;
array[12][3]=1; array[12][4]=1; array[12][7]=1;
array[13][1]=1; array[13][3]=1; array[13][4]=1;
array[14][1]=1; array[14][11]=1; array[14][12]=1;
array[15][1]=1;
array[16][2]=1; array[16][3]=1; array[16][5]=1;
array[17][3]=1;
array[18][7]=1;
array[19][1]=1; array[19][5]=1; array[19][6]=1;
array[20][3]=1;
array[21][2]=1;
array[22][1]=1;
array[23][5]=1;
array[24][1]=1; array[24][3]=1; array[24][4]=1;
array[25][3]=1;
array[26][1]=1; array[26][7]=1; array[26][8]=1;
array[27][1]=1; array[27][7]=1; array[27][8]=1;
array[28][3]=1;
array[29][2]=1;
array[30][1]=1; array[30][15]=1; array[30][16]=1;
array[31][3]=1;
array[32][1]=1; array[32][27]=1; array[32][28]=1;
array[33][13]=1;
array[34][1]=1; array[34][14]=1; array[34][15]=1;
array[35][2]=1;
array[36][11]=1;
array[37][2]=1; array[37][10]=1; array[37][12]=1;
array[38][1]=1; array[38][5]=1; array[38][6]=1;
array[39][4]=1;
array[40][2]=1; array[40][19]=1; array[40][21]=1;
array[41][3]=1;
array[42][1]=1; array[42][2]=1; array[42][3]=1; array[42][4]=1; array[42][5]=1;
array[43][3]=1; array[43][4]=1; array[43][6]=1;
array[44][2]=1; array[44][5]=1; array[44][6]=1;
array[45][1]=1; array[45][3]=1; array[45][4]=1;
array[46][1]=1; array[46][2]=1; array[46][3]=1; array[46][5]=1; array[46][8]=1;
array[47][5]=1;
array[48][1]=1; array[48][2]=1; array[48][4]=1; array[48][5]=1; array[48][7]=1;
array[49][4]=1; array[49][5]=1; array[49][6]=1;
array[50][2]=1; array[50][3]=1; array[50][4]=1;
array[51][1]=1; array[51][3]=1; array[51][6]=1;
array[52][3]=1;
array[53][1]=1; array[53][2]=1; array[53][6]=1;
array[54][2]=1; array[54][3]=1; array[54][4]=1; array[54][5]=1; array[54][6]=1;
array[55][1]=1; array[55][2]=1; array[55][6]=1;
array[56][2]=1; array[56][4]=1; array[56][7]=1;
array[57][2]=1; array[57][3]=1; array[57][5]=1;
array[58][1]=1; array[58][5]=1; array[58][6]=1;
array[59][1]=1; array[59][3]=1; array[59][4]=1; array[59][5]=1; array[59][6]=1;
array[60][1]=1;
array[61][1]=1; array[61][2]=1; array[61][5]=1;
array[62][3]=1; array[62][5]=1; array[62][6]=1;
array[63][1]=1;
array[64][1]=1; array[64][3]=1; array[64][4]=1;
array[65][1]=1; array[65][3]=1; array[65][4]=1;
array[66][2]=1; array[66][3]=1; array[66][5]=1; array[66][6]=1; array[66][8]=1;
array[67][1]=1; array[67][2]=1; array[67][5]=1;
array[68][1]=1; array[68][5]=1; array[68][7]=1;
array[69][2]=1; array[69][5]=1; array[69][6]=1;
array[70][1]=1; array[70][3]=1; array[70][5]=1;
array[71][1]=1; array[71][3]=1; array[71][5]=1;
array[72][1]=1; array[72][2]=1; array[72][3]=1; array[72][4]=1; array[72][6]=1;
array[73][2]=1; array[73][3]=1; array[73][4]=1;
array[74][3]=1; array[74][4]=1; array[74][7]=1;
array[75][1]=1; array[75][3]=1; array[75][6]=1;
array[76][2]=1; array[76][4]=1; array[76][5]=1;
array[77][2]=1; array[77][5]=1; array[77][6]=1;
array[78][1]=1; array[78][2]=1; array[78][7]=1;
array[79][2]=1; array[79][3]=1; array[79][4]=1;
array[80][1]=1; array[80][2]=1; array[80][3]=1; array[80][5]=1; array[80][7]=1;
array[81][4]=1;
array[82][1]=1; array[82][4]=1; array[82][6]=1; array[82][7]=1; array[82][8]=1;
array[83][2]=1; array[83][4]=1; array[83][7]=1;
array[84][1]=1; array[84][3]=1; array[84][5]=1; array[84][7]=1; array[84][8]=1;
array[85][1]=1; array[85][2]=1; array[85][8]=1;
array[86][2]=1; array[86][5]=1; array[86][6]=1;
array[87][1]=1; array[87][5]=1; array[87][7]=1;
array[88][1]=1; array[88][3]=1; array[88][4]=1; array[88][5]=1; array[88][8]=1;
array[89][3]=1; array[89][5]=1; array[89][6]=1;
array[90][2]=1; array[90][3]=1; array[90][5]=1;
array[91][2]=1; array[91][3]=1; array[91][5]=1; array[91][6]=1; array[91][7]=1;
array[92][2]=1; array[92][5]=1; array[92][6]=1;
array[93][2]=1;
array[94][1]=1; array[94][5]=1; array[94][6]=1;
array[95][1]=1; array[95][2]=1; array[95][4]=1; array[95][5]=1; array[95][6]=1;
array[96][2]=1; array[96][3]=1; array[96][4]=1; array[96][6]=1; array[96][7]=1;
array[97][6]=1;
array[98][1]=1; array[98][2]=1; array[98][3]=1; array[98][4]=1; array[98][7]=1;
array[99][4]=1; array[99][5]=1; array[99][7]=1;
array[100][2]=1; array[100][7]=1; array[100][8]=1;
//initialize primitive polynomials
m=q;
ms_length=1;
for (i=1;i<=q;i++)
{
ms_length=ms_length*2;
}
ms_length=ms_length-1;
//compute the length of m sequence
num=(int)pow((float)2,m)+1;
//sequence=new float[num*ms_length];
regist=new int[m];
//allocate the memory of regist
regist[0]=0;
for(i=1;i<m;i++)
{
regist[i]=1;
}
tn=1;
for (i=1;i<=((m+2)/2);i++)
tn=tn*2;
tn=tn+1;
um_sequence=new int[ms_length];
v_sequence=new int[ms_length];
temp1=new int[ms_length];
for (i=0;i<ms_length;i++)
{
um_sequence[i]=0;
for (j=0;j<m;j++)
{
um_sequence[i]=um_sequence[i]-regist[j]*array[m][j];
um_sequence[i]=um_sequence[i]%2;
if (um_sequence[i]<0)
um_sequence[i]=um_sequence[i]+2;
}
for (j=0;j<m-1;j++)
regist[j]=regist[j+1];
regist[m-1]=um_sequence[i];
}
for (i=0;i<ms_length;i++)
{
temp1[i]=um_sequence[(i+1)%ms_length];
}
for (i=0;i<ms_length;i++)
{
um_sequence[i]=temp1[i];
}
for (i=0;i<ms_length;i++)
{
v_sequence[i]=um_sequence[(i*tn)%ms_length];
}
temp=new int[ms_length];
GoldTemp=new int[ms_length];
for (i=0;i<ms_length;i++)
{
sequence[i]=um_sequence[i];
}
for (i=ms_length;i<ms_length*2;i++)
{
sequence[i]=v_sequence[i-ms_length];
}
for (i=ms_length*2;i<ms_length*3;i++)
{
sequence[i]=v_sequence[i-2*ms_length]^um_sequence[(i-2*ms_length)];
}
//compute the first three sequense of gold sequence set:u,v and u exor v;
for(i=0;i<ms_length;i++)
{
temp[i]=v_sequence[i];
}
for (j=3;j<num;j++)
{
shift=temp[0];
for (x=0;x<ms_length-1;x++)
temp[x]=temp[x+1];
temp[ms_length-1]=shift;
for (t=0;t<ms_length;t++)
{
GoldTemp[t]=um_sequence[t]^temp[t];
}
for (i=ms_length*j;i<ms_length*(j+1);i++)
{
sequence[i]=GoldTemp[i-ms_length*j];
}
}
}
double PeriodAutoCorrelation(int sequence[],int length,int t)
{
int i;
double x;
x=0;
for (i=0;i<length;i++)
{
x=x+sequence[i]*sequence[(i+t)%length];
}
x=x/length;
return x;
}
double AperiodAutoCorrelation(int sequence[],int length,int t)
{
int i;
double x;
x=0;
for (i=0;i<length-t;i++)
{
x=x+sequence[i]*sequence[i+t];
}
x=x/length;
return x;
}
complex<double> PeriodAutoCorrelation(complex<double> sequence[],int length,int t)
{
int i;
complex<double> x,length1;
x=complex<double>(0.0,0.0);
for (i=0;i<length;i++)
{
x=x+sequence[i]*conj(sequence[(i+t)%length]);
}
length1=complex<double>(length,0);
x=x/length1;
return x;
}
complex<double> AperiodAutoCorrelation(complex<double> sequence[],int length,int t)
{
int i;
complex<double> x,length1;
x=complex<double>(0.0,0.0);
for (i=0;i<length-t;i++)
{
x=x+sequence[i]*conj(sequence[i+t]);
}
length1=complex<double>(length,0);
x=x/length1;
return x;
}
double distance(complex<double> x,complex<double> y)
{
double a,b,c;
a=x.real()-y.real();
b=x.imag()-y.imag();
c=sqrt(a*a+b*b);
return c;
}
complex<double> map(int x)
{
complex<double> y;
if (x==0) y=complex<double> (0.0,0.0);
if (x==1) y=complex<double> (1.0,0.0);
if ((x==2)||(x==3)) y=complex<double> (polar(1.0,2*PI*(x-1)/3));
return y;
}
int InverseMap(complex<double> c)
{
int x;
if (c==complex<double> (0.0,0.0)) x=0;
if (c==complex<double> (1.0,0.0)) x=1;
if (c==complex<double> (polar(1.0,2*PI/3))) x=2;
if (c==complex<double> (polar(1.0,4*PI/3))) x=3;
return x;
}
int convert(int a)
{
int b;
switch (a)
{
case 5: b=0;
break;
case 7: b=1;
break;
case 11: b=2;
break;
case 13: b=3;
break;
case 17: b=4;
break;
case 19: b=5;
break;
case 23: b=6;
break;
case 29: b=7;
break;
case 31: b=8;
break;
default : b=0;
}
return b;
}
//float* CompACF(int CodeNumber, float *m_Floatsequence, int m_SeqLength, int m_SeqNumber, float *CompACF_)
//{
// int a,b,w;
// float *midACF_=new float[2*m_SeqNumber-1];
// for(a=0;a<m_SeqNumber;a++){
// for(w=0;w<2*m_SeqNumber-1;w++)
// midACF_[w]=0;
// midACF_ = SXDACF(CodeNumber*m_SeqNumber+a,m_Floatsequence, m_SeqNumber,m_SeqNumber, midACF_);
// for(b=0;b<2*m_SeqNumber-1;b++)
// CompACF_[b]+=midACF_[b];
// }
// delete midACF_;
// return CompACF_;
//}
//
//float* SXDACF(int CodeNumber, float *m_Floatsequence, int m_SeqLength, int m_SeqNumber, float *SXDACF_)
//{
// for(int c=0;c<m_SeqLength;c++)
// for(int d=m_SeqLength*CodeNumber;d<(m_SeqLength*(CodeNumber+1));d++){
// if(m_Floatsequence[d]==m_Floatsequence[(d+c)%m_SeqLength+CodeNumber*m_SeqLength])
// SXDACF_[c]++;
// else
// SXDACF_[c]--;
// }
// return SXDACF_;
//}
void ACF(long PACF_Code,long lLength,long lNumber,int sequence[],long SeqPhase,float fPacf[] )
{
int i,j;
//float *fPacf;
//fPacf=new float[lLength];
for(i=0;i<lLength;i++)
fPacf[i]=0;
float *fTempSeqArray=new float[lLength*lNumber];
long lValue;
for (i=0;i<lLength*lNumber;i++)
{
lValue = (long)sequence[i];
fTempSeqArray[i] = lValue;
}
for(i=0;i<lLength;i++)
{
for(j=lLength*(PACF_Code-1);j<lLength*PACF_Code;j++)
if(fTempSeqArray[j]==fTempSeqArray[(j+i)%lLength+lLength*(PACF_Code-1)])
fPacf[i]++;
else fPacf[i]--;
}
}
void CCF(long PCCF_Code1,long PCCF_Code2,long lLength,long lNumber,int sequence[],long SeqPhase,float fPccf[] )
{
int i,j,k;
//float *fPacf;
//fPacf=new float[lLength];
for(i=0;i<lLength;i++)
fPccf[i]=0;
float *fTempSeqArray=new float[lLength*lNumber];
long lValue;
for (i=0;i<lLength*lNumber;i++)
{
lValue = (long)sequence[i];
fTempSeqArray[i] = lValue;
}
for(i=0;i<lLength;i++)
for(j=lLength*(PCCF_Code1-1),k=lLength*(PCCF_Code2-1);j<lLength*PCCF_Code1;j++,k++){
if(fTempSeqArray[j]==fTempSeqArray[(k+i)%lLength+lLength*(PCCF_Code2-1)])
fPccf[i]++;
else fPccf[i]--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -