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

📄 pn15serial.cpp

📁 一个产生PN15伪随机序列并模拟噪声干扰和统计误码率的通讯系统仿真程序
💻 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 + -