📄 pn15serial.cpp
字号:
#include"PN15Serial.h"
#include<iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std;
void PN15Serial::Generate()
{
int b[15];
b[14]=1; b[13]=0; b[12]=0; b[11]=0; b[10]=0; b[9]=0; b[8]=1;
b[7]=0; b[6]=0; b[5]=0; b[4]=0; b[3]=0; b[2]=0; b[1]=1; b[0]=0;
int count = 0;
for(int i=0; i<32767; i++)
{
int temp=b[14];
b[14]=b[14]^b[0];
b[0]=b[1];
b[1]=b[2];
b[2]=b[3];
b[3]=b[4];
b[4]=b[5];
b[5]=b[6];
b[6]=b[7];
b[7]=b[8];
b[8]=b[9];
b[9]=b[10];
b[10]=b[11];
b[11]=b[12];
b[12]=b[13];
b[13]=temp;
this->Serial[i]=b[0]^b[1]^b[2]^b[3]^b[4]^b[5]^b[6]
^b[7]^b[8]^b[9]^b[10]^b[11]^b[12]^b[13]^b[14];
if(this->Serial[i] == 1 ) count++;
// cout<<this->Serial[i];
// if( (i+1)%100==0 ) cout<<endl;
}
cout<<"共有"<<count<<"个1"<<endl;
}
void PN15Serial::Disturb(int length,int d ,int start) //length表示待检测序列的长度
//d表示每d个码产生一个误码,故误码率位d^-1
{
srand( (unsigned)time( NULL ) );
// int start = rand() %32767;
// start = 410 ;
// cout<<"start="<<start<<endl;
this->TestSerial = new int[length];
int count = 0;
for(int i=0; i<length; i++)
{
this->TestSerial[i] = this->Serial[ (i+start)%32767 ];
// cout<<this->TestSerial[i]<<" ";
// if( (i+1) %50 == 0 ) cout<<endl;
if( this->TestSerial[i] ==1 ) count++;
}
// cout<<"共有"<<count<<"个1"<<endl;
for(i=0; i<length; i++) //加噪声
{
if( i % d == 0 )
{
int offset = rand() % (int)(d/3);
offset = rand() %2 ? offset : -1 * offset ;
int temp = (i+offset) % length;
temp = temp>=0 ? temp : -1*temp ;
this->TestSerial[temp] = this->TestSerial[temp]^1; //取反
}
}
}
double PN15Serial::FindErr()
{
//先在标准serial序列中定位TestSerial的起始位置,利用模式匹配的方法
//选取TestSerial的前200个作为pattern,在target中找到起始位置,当误码数<1认为匹配
bool flag=true;
int ErrNum;
for(int i=0; i<32767 && flag ; i++)
{
ErrNum = 0;
int j;
for( j=0; j<200; j++)
{
if( this->TestSerial[j] != this->Serial[ (i+j)%32767 ] )
ErrNum++;
}
if(ErrNum < 5 ) flag = false;
}
if( flag ) cout<<"匹配失败!"<<endl;
else cout<<"定位在i-1="<<i-1<<endl;
return 1.00;
}
int PN15Serial::RateErr(int length)
//length表示求相关函数时选取TestSerial的长度,length<32767时补零
{
//先对Serial求相关,结果存在长度位2*32767-1的向量中
int * result = new int[2*32767-1];
int MaxResult = 0;
int MaxIndex = -1;
for(int m=0; m< 32767; m++)
{
result[m]=0;
int n;
for(n=0; n<length && n+m<=32766; n++)
{
// result[m] += ( this->Serial[n+m] * this->TestSerial[n] );
result[m] += ( Serial[n+m]==TestSerial[n] ? 1 : -1);
}
// if( result[m] != 0)
// cout<<"移位"<<m<<" "<<result[m]<<" "<<endl;
if( result[m] > MaxResult )
{
MaxResult = result[m];
MaxIndex = m;
}
}
for( m=-1; m>-32767; m--)
{
result[32766-m] = 0;
int n;
for( n=0; n-m<length && n-m <= 32766 ; n++)
{
// result[32766-m] += (this->TestSerial[n-m] * this->Serial[n]);
result[32766-m] += ( TestSerial[n-m]==Serial[n]? 1 : -1 );
}
// if( result[32766-m] != 0)
// cout<<"移位"<<m<<" "<<result[32766-m]<<" "<<endl;
if( result[32766-m] > MaxResult )
{
MaxResult = result[32766-m];
MaxIndex = m;
}
}
int start = ( MaxIndex>=0 ? MaxIndex : MaxIndex+32767 );
// cout<<"定位在m+32766="<<start<<endl;
return start;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -