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

📄 16qam.txt

📁 基于Matlab16QAM的调制解调仿真程序
💻 TXT
字号:
void FN16QAMModulation3(float NSymbol[SPLength],float FModulationOutput[2][SPLength])
{
  float FModulationSymbol_I[16]={QAM16_A,QAM16_A,QAM16_A,QAM16_A,-QAM16_A,-QAM16_A,-QAM16_A,-QAM16_A,QAM16_B,QAM16_B,QAM16_B,QAM16_B,-QAM16_B,-QAM16_B,-QAM16_B,-QAM16_B},
    FModulationSymbol_Q[16]={QAM16_A,-QAM16_A,QAM16_B,-QAM16_B,QAM16_A,-QAM16_A,QAM16_B,-QAM16_B,QAM16_A,-QAM16_A,QAM16_B,-QAM16_B,QAM16_A,-QAM16_A,QAM16_B,-QAM16_B};
  int Ni,Nj,NModulationSymbol_Input;
  for(Ni=0;Ni<SPLength/4;Ni++)
  {
    for(NModulationSymbol_Input=0,Nj=0;Nj<4;Nj++)
    {
      NModulationSymbol_Input<<=1;
      if(NSymbol[Ni*4+Nj])
        NModulationSymbol_Input^=1;
    }
    FModulationOutput[0][Ni]=FModulationSymbol_I[NModulationSymbol_Input];
    FModulationOutput[1][Ni]=FModulationSymbol_Q[NModulationSymbol_Input];
  }
}

void FN1Dimension_Harddecision3(float Finput,char NSymbol[2])
{  
  if(Finput>=2*QAM16_A)
  {
    NSymbol[0]=1;
    NSymbol[1]=-1;
  }
  else if(Finput<2*QAM16_A&&Finput>=0)
  {
    NSymbol[0]=-1;
    NSymbol[1]=-1;
  }
  else if(Finput>=-2*QAM16_A&&Finput<0)
  {
    NSymbol[0]=-1;
    NSymbol[1]=1;
  }
  else
  {
    NSymbol[0]=1;
    NSymbol[1]=1;
  }
}

void FN16QAMDemodu_SoftDecision3(float FDeModulatorIntput[2][SPLength],float NSymbol[SPLength],float FLc)
{
  float F1Demension[4]={QAM16_A,-QAM16_A,QAM16_B,-QAM16_B};
  int Ni,Nj,NHardDecision,NcandidateDecision[3];
  char NSymbolTemp[2];
  float FDistanceToBest[2],FDistanceToCandidate[2],ftemp;
ftemp=1;
  for(Ni=0;Ni<SPLength/4;Ni++)
  {
    FN1Dimension_Harddecision3(FDeModulatorIntput[0][Ni],NSymbolTemp);
    for(NHardDecision=0,Nj=0;Nj<2;Nj++)
    {
      NHardDecision<<=1;
      if(NSymbolTemp[Nj]>=0)
        NHardDecision^=1;
    }        
    for(Nj=0;Nj<2;Nj++)
    {
      NcandidateDecision[0]=NHardDecision^(1<<(1-Nj));
      NcandidateDecision[1]=NHardDecision^(1<<(Nj));
      NcandidateDecision[2]=NHardDecision^3;
      FDistanceToBest[0]=(float)pow((FDeModulatorIntput[0][Ni]-F1Demension[NHardDecision]),2);
      FDistanceToBest[1]=(float)pow((FDeModulatorIntput[0][Ni]-F1Demension[NcandidateDecision[0]]),2);
      FDistanceToCandidate[0]=(float)pow((FDeModulatorIntput[0][Ni]-F1Demension[NcandidateDecision[1]]),2);
      FDistanceToCandidate[1]=(float)pow((FDeModulatorIntput[0][Ni]-F1Demension[NcandidateDecision[2]]),2);
      NSymbol[4*Ni+1-Nj]=4*(float)log((exp(-FLc*FDistanceToBest[0]/4)+exp(-FLc*FDistanceToBest[1]/4))/(exp(-FLc*FDistanceToCandidate[0]/4)+exp(-FLc*FDistanceToCandidate[1]/4)))/FLc;
      NSymbol[4*Ni+1-Nj]*=(NSymbolTemp[1-Nj]/ftemp);
    }
    FN1Dimension_Harddecision3(FDeModulatorIntput[1][Ni],NSymbolTemp);
    for(NHardDecision=0,Nj=0;Nj<2;Nj++)
    {
      NHardDecision<<=1;
      if(NSymbolTemp[Nj]>=0)
        NHardDecision^=1;
    }        
    for(Nj=0;Nj<2;Nj++)
    {      
      NcandidateDecision[0]=NHardDecision^(1<<(1-Nj));
      NcandidateDecision[1]=NHardDecision^(1<<(Nj));
      NcandidateDecision[2]=NHardDecision^3;
      FDistanceToBest[0]=(float)pow((FDeModulatorIntput[1][Ni]-F1Demension[NHardDecision]),2);
      FDistanceToBest[1]=(float)pow((FDeModulatorIntput[1][Ni]-F1Demension[NcandidateDecision[0]]),2);
      FDistanceToCandidate[0]=(float)pow((FDeModulatorIntput[1][Ni]-F1Demension[NcandidateDecision[1]]),2);
      FDistanceToCandidate[1]=(float)pow((FDeModulatorIntput[1][Ni]-F1Demension[NcandidateDecision[2]]),2);
      NSymbol[4*Ni+3-Nj]=4*(float)log((exp(-FLc*FDistanceToBest[0]/4)+exp(-FLc*FDistanceToBest[1]/4))/(exp(-FLc*FDistanceToCandidate[0]/4)+exp(-FLc*FDistanceToCandidate[1]/4)))/FLc;
      NSymbol[4*Ni+3-Nj]*=(NSymbolTemp[1-Nj]/ftemp);
    }
  }    
} 

⌨️ 快捷键说明

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