📄 qpskfunction.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 + -