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

📄 qpskfunction.h

📁 一个用于通信的QPSK调制解调程序
💻 H
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <malloc.h>


/*
//磁盘文件存储子函数
void save(const char * fileName,const char* mode,int *array_var,int size)
{
	FILE *fp;
	int i;
	fp = fopen(fileName,mode);
	for (i=0;i<size;i++)
	{
		fprintf(fp,"%d\n",array_var[i]);
	}
	fclose(fp);
}
void save2(const char * fileName,const char* mode,float *array_var,int size)
{
	FILE *fp;
	int i;
	fp = fopen(fileName,mode);
	for (i=0;i<size;i++)
	{
		fprintf(fp,"%6.6f\n",array_var[i]);
	}
	fclose(fp);
}
*/

/********产生随机信源函数 *************/
void randint(int* array_var,int bitNum,int Mary)
{
	int i;
	srand((unsigned int)time(0));
	for (i=0;i<bitNum;i++)
	{
		array_var[i] = rand()%Mary;
	}
}

//二进制转化十进制
void bi2de(int* infoDec,int* infoBit,int bitLen,int bits)
{
	int N,i,j;
	N = bitLen/bits;
	for (i=0;i<N;i++)
	{
		int temp = 0;
		for (j=0;j<bits;j++)
		{
			temp = (int)(temp + infoBit[bits*i+j] * pow(2.0,bits-j-1));
		}
		infoDec[i] = temp;
	}
}
//Qpsk调制
void QpskMod()
{
	int i,j,N;
	float t;
	N=(int)(fs*T);//N=12
	for (i=0;i<bitNum/2;i++)
	{
		//---------同向和正交分量---------------------------------
		for (j=0;j<N;j++)
		{
			t=(float)j/fs;
			iQpskSignal[i*N+j] = (float)((2*infoBit[2*i]-1)*cos(2*pi*fc*t));
			qQpskSignal[i*N+j] = (float)((2*infoBit[2*i+1]-1)*sin(2*pi*fc*t));
		}
	}

	for(i=0;i<N*bitNum/2;i++)
	{
		QpskSignal[i] = iQpskSignal[i] + qQpskSignal[i];
	}

}
//产生线性调频信号
void  chirp(float *Chirp,float fs,float freqLow,float Tlen,float freqHigh)
{
	
	float bandWidth = freqHigh - freqLow;
	float t = 0.0;
	int i;
	
	int len = (int) (fs * Tlen);
	for (i=0;i<len;i++)
	{
		t=(float)i/fs;
		Chirp[i]= (float)cos(2*pi*freqLow*t + pi*bandWidth*t*t/Tlen);
	}

}
//两数组左右相连--同步信号和Qpsk信号相连
void rightLink(float *Array,float *Array1,float *Array2,int Line,int Colum1,int Colum2)
{
	//
	int i,j,N;
	N = Colum1+Colum2;
	for (i=0;i<Line;i++)
	{
		for(j=0;j<N;j++)
		{
			if (j<Colum1)
				Array[i*N+j] = Array1[i*Colum1+j];
			else
				Array[i*N+j] = Array2[i*Colum2+j-Colum1];
		}
	}
}
//随机噪声
void randn(float *randNoise,int size)
{
	int i;
	int nMax = 100;
	srand((unsigned)time(NULL));
	for (i=0;i<size;i++)
	{
		randNoise[i] = (float)rand()/(float)nMax;
	}
	
	for (i=0;i<size;i++)
	{
		randNoise[i] = 2 * randNoise[i] - 1;
	}
}

//求均值
float mean(float *Array,int size)
{
	int i;
	float sum=0;
	for (i=0;i<size;i++)
	{
		sum += Array[i];
	}
	return sum = sum/size;
}
//求标准差
float std(float *Array,int size)
{
	int i;
	float sum=0,m;
	m = mean(Array,size);
	for (i=0;i<size;i++)
	{
		sum += (float) pow((Array[i]-m),2);
	}
	return sum = (float)sqrt(sum/(size-1));
}
//高斯信道
void channel(float *rxSignal,float *inSignal,int size,float snr)
{
	int i;
	float sigStd,noiseStd,snrInLine;
	float *noise;
	noise = (float*)malloc(size * sizeof(float));
	randn(noise,size);

	noiseStd = std(noise,size);
	sigStd = std(inSignal,size);

	snrInLine = (float)pow(10,snr/10);
	for(i=0;i<size;i++)
	{
		rxSignal[i] = snrInLine*inSignal[i]/sigStd + noise[i]/noiseStd;
	}
}

//数组左右反转
void fliplr(float *x,int len)
{
	int i;
	float temp; 
	for (i=0;i<=len/2;i++)
	{
		temp=x[i];
		x[i]=x[len-i-1];
		x[len-i-1] = temp;
	}

}

//求卷积
void conv(float *y,float *x,float *h,int n,int m,int Len)
{
	int i,k;
	float *temp1,*temp2;
	float sum;
	temp1 = (float*)malloc(Len * sizeof(float));
	temp2 = (float*)malloc(Len * sizeof(float));
	for (i=0;i<Len;i++)
	{
		if (i<m)
			temp2[i]=h[i];
		else
			temp2[i]=0;
	}   
	for (i=0;i<Len;i++)
	{
		if (i<n)
			temp1[i]=x[i];
		else
			temp1[i]=0;
	}   
	
	for(k=0;k<Len;k++)
	{
		sum=0.0;
		for(i=0;i<=k;i++)
			sum+=temp1[i]*temp2[k-i];
		y[k]=sum;
	}
	free(temp1);
	free(temp2);
}
//求相关
void xcorr(float *y,float *x,float *h,int n,int m,int Len)
{
	//与MATLAB输出结果相同	
	int i,k;
	float *temp1,*temp2;
	float sum;
	temp1 = (float*)malloc(Len * sizeof(float));
	temp2 = (float*)malloc(Len * sizeof(float));

	for (i=0;i<Len;i++)
	{
		if (i<n)
			temp1[i]=x[i];
		else
			temp1[i]=0;
	} 

	fliplr(h,m);
	for (i=0;i<Len;i++)
	{		
		if (i<m)
			temp2[i]=h[i];
		else
			temp2[i]=0;
	} 
	//初始化y[]
	for(k=0;k<Len;k++)
	{
		y[k]=0;
	}	
	
	for(k=0;k<Len-n+m;k++)
	{
		sum=0.0;
		for(i=0;i<=k;i++)
			sum+=temp1[i]*temp2[k-i];
		y[k+n-m]=sum;
	}	
	free(temp1);
	free(temp2);
	
	/*可用下面两函数代替
	fliplr(h,m);
	conv(y,x,h,n,m,Len);
	*/
}

//求数组最大值并返回最大值位置
int MAX(float *x,int len)
{
	float temp;
	int i,point;
	temp=x[0];
	point = 0;
	for (i=1;i<len;i++)
	{
		if (temp<=x[i])
		{
			temp=x[i];
			point = i;
		}		
	}
	return point;
}
//滤波器--得先有fir1滤波器系数h
void filter(float*outSig,float* inSig,float* h,int len1,int len2)
{
	int len,i;
	float *temp;
	len = len1+len2-1;
	temp=(float*)malloc(len * sizeof(float));
	conv(temp,inSig,h,len1,len2,len);
	for (i=0;i<len1;i++)
	{
		outSig[i] = temp[len2/2+i];
	}
	free(temp);
}

//Qpsk解调
void QpskDemod()
{
	int i,j;
	float sum1,sum2,t;
	float *temp;
    float h_LPF[129];
// 	float h_LPF[129]={-0.000000,
// -0.000156,
// -0.000299,
// -0.000410,
// -0.000472,
// -0.000468,
// -0.000388,
// -0.000229,
// 0.000000,
// 0.000275,
// 0.000561,
// 0.000808,
// 0.000966,
// 0.000985,
// 0.000832,
// 0.000496,
// -0.000000,
// -0.000600,
// -0.001217,
// -0.001741,
// -0.002061,
// -0.002080,
// -0.001735,
// -0.001022,
// 0.000000,
// 0.001205,
// 0.002412,
// 0.003410,
// 0.003988,
// 0.003977,
// 0.003282,
// 0.001913,
// -0.000000,
// -0.002215,
// -0.004398,
// -0.006172,
// -0.007172,
// -0.007112,
// -0.005841,
// -0.003392,
// 0.000000,
// 0.003909,
// 0.007757,
// 0.010894,
// 0.012685,
// 0.012622,
// 0.010420,
// 0.006094,
// -0.000000,
// -0.007166,
// -0.014425,
// -0.020611,
// -0.024514,
// -0.025030,
// -0.021324,
// -0.012960,
// 0.000000,
// 0.016965,
// 0.036837,
// 0.058111,
// 0.079017,
// 0.097716,
// 0.112494,
// 0.121965,
// 0.125227,
// 0.121965,
// 0.112494,
// 0.097716,
// 0.079017,
// 0.058111,
// 0.036837,
// 0.016965,
// 0.000000,
// -0.012960,
// -0.021324,
// -0.025030,
// -0.024514,
// -0.020611,
// -0.014425,
// -0.007166,
// -0.000000,
// 0.006094,
// 0.010420,
// 0.012622,
// 0.012685,
// 0.010894,
// 0.007757,
// 0.003909,
// 0.000000,
// -0.003392,
// -0.005841,
// -0.007112,
// -0.007172,
// -0.006172,
// -0.004398,
// -0.002215,
// -0.000000,
// 0.001913,
// 0.003282,
// 0.003977,
// 0.003988,
// 0.003410,
// 0.002412,
// 0.001205,
// 0.000000,
// -0.001022,
// -0.001735,
// -0.002080,
// -0.002061,
// -0.001741,
// -0.001217,
// -0.000600,
// -0.000000,
// 0.000496,
// 0.000832,
// 0.000985,
// 0.000966,
// 0.000808,
// 0.000561,
// 0.000275,
// 0.000000,
// -0.000229,
// -0.000388,
// -0.000468,
// -0.000472,
// -0.000410,
// -0.000299,
// -0.000156,
// -0.000000,
// };//129为滤波器长度,数据来自MATLAB,即128阶滤波器
	FILE *fp;
	temp=(float*)malloc(QpskLen * sizeof(float));

	fp=fopen("h_LPF.txt","r");

	for (i=0;i<129;i++)
	{
		fscanf(fp,"%f\n",&h_LPF[i]);
	}
	fclose(fp);

	for(i=0;i<QpskLen;i++)
	{
		t=(float)i/fs;
		irxQpskSig[i]=(float)(rxQpskSig[i]*cos(2*pi*fc*t));//去载波
		qrxQpskSig[i]=(float)(rxQpskSig[i]*sin(2*pi*fc*t));
	}

	//save2("irxQpskSig1.txt","w+",irxQpskSig,480);

	filter(irxQpskSig,irxQpskSig,h_LPF,QpskLen,129);
	filter(qrxQpskSig,qrxQpskSig,h_LPF,QpskLen,129);

	//save2("irxQpskSig2.txt","w+",irxQpskSig,480);

	for(i=0;i<bitNum/2;i++)
	{
		sum1=0;
		sum2=0;
		//---------同向解调----------------------------------
		for (j=0;j<pskLen;j++)
		{
			t=(float)j/fs;			
			sum1 += (float)(irxQpskSig[i*pskLen+j]);
		}
		if (sum1>0)
			infoDeBit[2*i]=1;
		else 
			infoDeBit[2*i]=0;

		//---------正交解调----------------------------------
		for (j=0;j<pskLen;j++)
		{
			t=(float)j/fs;			
			sum2 +=(float) (qrxQpskSig[i*pskLen+j]);
		}
		if (sum2>0)
			infoDeBit[2*i+1]=1;
		else 
			infoDeBit[2*i+1]=0;
	}

}
//误码率计算
void biterr()
{
	int i;
	for (i=0;i<bitNum;i++)
	{
		if (infoDeBit[i] != infoBit[i])
			berNum ++;
	}
	ber = berNum/(float)bitNum;

}

⌨️ 快捷键说明

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