?? rereiver.cpp
字號:
#include <iostream>
using namespace std;
#include <complex>
#include "receiver.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include<math.h>
#include<fstream>
#define PI 3.1415926535
#define sqr(x) ((x)*(x))
#define x1 100
void receiver::StartFdomainreceive ( )
{
//int a[1000],b[1000]={0},ab[100][100],c[1000]={0},d[1000]={0},cd[100][100],z[100]={0},i,j,k,N2x;
//FILE *fp;
int i,j,k,N=10,n=3;
double n1,**a;
complex<double> *TD=new complex<double>[1280];
complex<double> *FD=new complex<double>[1280];
//double e[1000],f[10000],g[1000]={0},md[10][1000],de[10][1000],ee[10][100]={0},sp[10][100],I[10][100],Q[10][100],rI[10][1000],rQ[10][1000];
// double dic[4],min,fI[10][1000],fQ[10][1000],finde[10][1000]={0},n;
n1=log(Fspreadfactor)/log(2);
//////////////////////////////////////////////////////
/*cout<<"\n";
cout<<"接收real"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
cout<<FFTRealIn[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
cout<<"接收imag"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
cout<<FFTImagIn[i][j]<<" ";
cout<<"\n";
}
*/
FFTRealOut=Allocate2DArray(x1,1000); //動態2維數組分配內存
FFTImagOut=Allocate2DArray(x1,1000); //動態2維數組分配內存
//cout<<"\n";
//cout<<"--------------FFT變換-------------------";
//cout<<"\n";
for(i=0;i<numberofuserbit/2+numberofuserbit%2;i++)
{for( k=0;k<Fspreadfactor;k++)
TD[k]=complex<double>(FFTRealIn[k][i], FFTImagIn[k][i]);
/*for( k=0;k<8;k++)
cout<<TD[k].real()<<"+"<<TD[k].imag()<<"i ";
cout<<"\n"<<"-----------------------";*/
FFT(TD,FD,int(n1+0.5),1);
/*for( k=0;k<8;k++)
cout<<FD[k].real()<<"+J"<<FD[k].imag()<<" ";
cout<<"\n";*/
for( k=0;k<Fspreadfactor;k++)
{FFTRealOut[k][i]=FD[k].real();
FFTImagOut[k][i]=FD[k].imag();
}
}
DeAllocate2DArray(FFTRealIn,x1); //釋放內存
DeAllocate2DArray(FFTImagIn,x1); //釋放內存
/* cout<<"I支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
cout<<FFTRealOut[i][j]<<" ";
cout<<"\n";
}
cout<<"Q支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
cout<<FFTImagOut[i][j]<<" ";
cout<<"\n";
} */
/////////////////////////////
Mseq=new int[10000];
M_seq(n);
/*cout<<"M序列"<<"\n";
for(i=0; i<100; i++)
cout<<Mseq[i] <<" ";
cout<<"\n";*/
////////////////////////////
Despreadout=Allocate2DArray(x1,1000);
a=Allocate2DArray(x1,1000);
DespreadRealout=Allocate2DArray(x1,1000);
DespreadImagout=Allocate2DArray(x1,1000);
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
{a[i][j]=FFTRealOut[i][j];
// cout<<a[i][j]<<" ";
}
}
FdomainDespread(Fspreadfactor,a);
for(i=0;i<Fspreadfactor;i++)
for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
DespreadRealout[i][j]=Despreadout[i][j];
DespreadImagout=Allocate2DArray(x1,1000);
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
{a[i][j]=FFTImagOut[i][j];
// cout<<a[i][j]<<" ";
}
}
FdomainDespread(Fspreadfactor,a);
for(i=0;i<Fspreadfactor;i++)
for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
DespreadImagout[i][j]=Despreadout[i][j];
//cout<<"\n";
DeAllocate2DArray(Despreadout,x1); //釋放內存
DeAllocate2DArray(a,x1); //釋放內存
/*cout<<"解擴I支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
cout<<DespreadRealout[i][j]<<" ";
cout<<"\n";
}
cout<<"解擴Q支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++)
cout<<DespreadImagout[i][j]<<" ";
cout<<"\n";
}*/
delete Mseq;
DeAllocate2DArray(FFTRealOut,x1); //釋放內存
DeAllocate2DArray(FFTImagOut,x1); //釋放內存
//cout<<"\n";
//////////////////////////////
Demodulation=intAllocate2DArray(x1,1000); //動態2維數組分配內存
DEQPSK(Fspreadfactor);
DeAllocate2DArray(DespreadImagout,x1); //釋放內存
DeAllocate2DArray(DespreadRealout,x1); //釋放內存
/*cout<<"解調合并"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit;j++)
cout<<Demodulation[i][j]<<" ";
cout<<"\n";
}*/
/////////////////////////////////////////////////
/*Mseq=new int[10000];
M_seq(n);
/*cout<<"M序列"<<"\n";
for(i=0; i<100; i++)
cout<<Mseq[i] <<" ";
cout<<"\n";*/
////////////////////////////
/* Despreadout=new int[10000];
Despreadout[0]=0;
FdomainDespread(Fspreadfactor);
delete Mseq;*/
/* cout<<"\n";
cout<<"最終信號"<<"\n";
for(i=0;i<numberofuserbit;i++)
cout<<Demodulation[0][i]<<" ";
cout<<"\n";*/
FinalOut=new int[10000];
for(i=0;i<numberofuserbit;i++)
FinalOut[i]=Demodulation[0][i];
//delete Despreadout;
//cout<<"最終信號"<<"\n";
// for(i=0;i<numberofuserbit;i++)
// cout<<FinalOut[i]<<" ";
//cout<<"\n";
}
/////////////////////////////////////////////////////////
// ///
/// FFT變換 /////
//////////////////////////////////////////////////////////
void receiver::FFT(complex<double> * TimeDomain, complex<double> * FreqDomain, int ex,int sign)
{
long Nfft; //進行傅立葉變換的數據個數
int i,j,k; //定義循環變量
int Block; //劃分子塊的大小
int OffSet; //計算偏移量
double Angle; //相位角度
complex<double> *Wn,*Temp1,*Temp2,*Temp; //定義數據指針
Nfft = 1 << ex; // 計算付立葉變換點數
// 分配運算所需存儲器
Wn = new complex<double>[Nfft / 2];
Temp1 = new complex<double>[Nfft];
Temp2 = new complex<double>[Nfft];
for(i = 0; i < Nfft / 2; i++) //計算加權系數Wn
{
Angle = -i * PI * 2 / Nfft; //計算相應的角度
Wn[i] = complex<double> (cos(Angle), sin(Angle)); //計算對應的復數
}
for(j = 0; j < Nfft; j++) //重新排列傅立葉變換結果的次序
{
OffSet = 0; //初始化原來的數據處理后的新位置
for(i = 0; i < ex; i++) //對位置序號的二進制進行倒序反轉
{
if (j&(1<<i)) //提取二進制的位信息
{
OffSet+=1<<(ex-i-1); //反轉二進制位序
}
}
if(sign==1) Temp1[j]=TimeDomain[OffSet];
else {
Temp1[j]=FreqDomain[OffSet];
// -imag (Temp1[j])->imag (Temp1[j]);
Temp1[j]= complex<double> (real(Temp1[j]), -imag(Temp1[j])) ; //按照新位序將結果重排
}
}
// 采用時間抽取的蝶形算法進行快速傅立葉變換
for(k = 0; k < ex; k++) //迭代次數
{
for(j = 0; j < 1 << (ex-k-1); j++) //每次迭代分塊
{
Block = 1 << (k+1); //塊內數據量
for(i = 0; i < Block / 2; i++) //塊內進行蝶形計算
{
OffSet = j * Block; //計算偏移量
Temp2[i + OffSet] = Temp1[i + OffSet] + Temp1[i + OffSet + Block / 2] * Wn[i * (1<<(ex-k-1))]; // A=a+b*Wn
Temp2[i + OffSet + Block / 2] = Temp1[i + OffSet] - Temp1[i + OffSet + Block / 2] * Wn[i * (1<<(ex-k-1))]; //B=a-b*Wn
}
}
Temp = Temp1; Temp1 = Temp2; Temp2 = Temp; //交換操作和結果數據的指針
}
for(j = 0; j < Nfft; j++) //將結果賦給頻域數組
{
if(sign==1) FreqDomain[j]=Temp1[j];
else {
// real(TimeDomain)=real(Temp1[j])/Nfft;
// imag(TimeDomain)=-imag(Temp1[j])/Nfft;
TimeDomain[j]=complex<double> (real(Temp1[j])/Nfft, -imag(Temp1[j])/Nfft);
}
}
//釋放內存
delete Wn;
delete Temp1;
delete Temp2;
}
/////////////////////////////////////////////////////////
// ///
/// 進行qpsk解調 /////
//// //////
//// 計算每個點到每個星座點的最短距離 ///
///// ///////
//////////////////////////////////////////////////////////
void receiver::DEQPSK(int factor)
{
int i,j,k;
double min,dic[4],**fI,**fQ;
fI=Allocate2DArray(x1,1000); //動態2維數組分配內存
fQ=Allocate2DArray(x1,1000); //動態2維數組分配內存
for(k=0;k<factor;k++)
{ for(i=0;i<numberofuserbit/2+numberofuserbit%2;i++)
{
dic[0]=sqrt(sqr(DespreadRealout[k][i]-1*sqrt(2)/2)+sqr(DespreadImagout[k][i]-1*sqrt(2)/2));///0,0///
dic[1]=sqrt(sqr(DespreadRealout[k][i]+1*sqrt(2)/2)+sqr(DespreadImagout[k][i]-1*sqrt(2)/2));///0,1///
dic[2]=sqrt(sqr(DespreadRealout[k][i]-1*sqrt(2)/2)+sqr(DespreadImagout[k][i]+1*sqrt(2)/2));///1,0//
dic[3]=sqrt(sqr(DespreadRealout[k][i]+1*sqrt(2)/2)+sqr(DespreadImagout[k][i]+1*sqrt(2)/2));///1,1//
// cout<<dic[0]<<" ";
min=dic[0];
for(j=0;j<4;j++)
{
if(dic[j]<min)
min= dic[j];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -