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

📄 lbc.cpp

📁 (31,21) bch 码编解码程序 C++实现.
💻 CPP
字号:
// LBC.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "BCHCode.h"
#include<iostream>
#include <cmath>

/*产生(a,b)区间上均匀分布的随机数*/
double uniform(double a,double b,long int *seed)
{
        double t;

        *seed=2045*(*seed)+1;
        *seed=*seed-(*seed/1048576)*1048576;
        t=(*seed)/1048576.0;
        t=a+(b-a)*t;
        return(t);
}

/*产生高斯分布N(mean,sigma)的随机数*/
double gauss(double mean,double sigma,long int *s)
{
        int i;
        double x,y;
        for(x=0,i=0;i<12;i++){
                x+=uniform(0.0,1.0,s);
        }
        x=x-6.0;
        y=mean+x*sigma;
        return(y);
}


int main(int argc, char* argv[])
{
	

	BCH bch;

	
	double  A;// 信号幅度
	double  sigma;//白噪声方差

	long seed = 1000;

	int  err_cnt,uncode_err_cnt ;
	double SNR=0.0;
	double err_rate = 0.0;
	double uncode_err_rate = 0.0;

	vector<double> snr_vec;
	vector<double> err_vec;
	vector<double> uncode_err_vec;
	A = 4.0; 

	//5 :0.01: 16
	for (sigma = 1.0; sigma < 16.000001; sigma += 0.01)
	{
	
		err_cnt = 0;
		uncode_err_cnt = 0;

		//100组一次测试
		for (int i = 0; i < 100; i++)
		{
			//1.信源编码
			bvec test;		
			for (int m = 0; m < 21; m++)
			{
				//产生随机码元
				test.push_back(rand() % 2);
				//cout << test[m];
			}
			//cout << " | ";


			//2.BCH(31,21)编码
			bvec code;
			bch.SysEncode(test,code);



			//调制, 上信道, 解调
			vector<double>  modu;
			modu.resize(31);
			for (m = 0; m < 31; m++)
			{
				if (code[m] == 1)
					modu[m] = A;
				else
					modu[m] = -1 * A;

				//AWGN

				modu[m] += gauss(0, sigma, &seed);

				if (modu[m] >= 0.0)
				{
					if (code[m] != 1)
						uncode_err_cnt ++;
					code[m] = 1;
				}
				else
				{
					if (code[m] != 0)
						uncode_err_cnt ++;
					code[m] = 0;
				}
			}
			bvec dec;
			bch.Decode(code,dec);

			for ( m = 0; m < 21; m++)
			{			
			//	cout << dec[m];
				if (test[m] != dec[m])
				{
				//	cout <<"error!";
					err_cnt ++;
				}
			}
			

			

		//	cout<<endl;
		}

		err_rate = (double)((double)err_cnt / (double)2100);
		uncode_err_rate = (double)((double)uncode_err_cnt / (double)3100);
		

		SNR = 10 * log10(A*A/2/sigma);

		cout <<SNR<< "," <<err_rate << endl;

		snr_vec.push_back(SNR);
		err_vec.push_back(err_rate);
		uncode_err_vec.push_back(uncode_err_rate);

		
	}	

	FILE * fp = fopen("snr.txt", "w");
	for(int i = 0;i < snr_vec.size(); i++)
	{
		fprintf(fp, "%f,",snr_vec[i]);
		
	}
	fprintf(fp , "\r\n___________________________________\r\n");
	for( i = 0;i < snr_vec.size(); i++)
	{
		fprintf(fp, "%f,",err_vec[i]);
		
	}

	fprintf(fp , "\r\n___________________________________\r\n");
	for( i = 0;i < snr_vec.size(); i++)
	{
		fprintf(fp, "%f,",uncode_err_vec[i]);
		
	}

	fclose(fp);

	return 0;
}


/*
#include "Polynomial.h"
//计算出H矩阵
int main()
{

	int H[10][33] = {{1,0,0,1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0},
{1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0},
{1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0},
{1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,1,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0},
{1,1,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0},
{0,1,1,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,0},
{1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0},
{0,1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0},
{0,0,1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1}};
	
	FILE * fp = fopen("s.txt", "w");
	
	
	int i,j,k;
	for (j = 0;j < 31; j++)
	{
		fprintf(fp, "{");
		for(i = 0;i < 10;i++)
		{
			cout<<H[i][j]<<" ";
			fprintf(fp, "%d", H[i][j]);
			fprintf(fp,",");
		}
		fprintf(fp, "%d,%d", j,j);
		fprintf(fp, "},");
		
		fprintf(fp,"\r\n");
		cout<<endl;
	}

	cout<<"xxxx"<<endl;

	for ( j = 0;j < 30; j++)
		for(k=j+1; k<31; k++)
		{
			fprintf(fp, "{");
			for(i = 0;i < 10;i++)
			{
				if (H[i][j] == H[i][k])
				{
					fprintf(fp, "%d", 0);
					cout<<"0 ";
				}
				else
				{
					fprintf(fp, "%d", 1);
					cout<<"1 ";
				}
				
				fprintf(fp,",");

			}
			fprintf(fp, "%d,%d", j,k);
			cout <<":::"<< j << k<<endl;
			fprintf(fp, "},\r\n");
		}


		fclose(fp);

	return 0;
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -