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

📄 n_lfm.c

📁 CCS环境下
💻 C
字号:
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<math.h>

#define N 1024
#define pi 3.14159265
#define D16  0.000015258
#define G16 0.0048

#define D32  0.000030518
#define G32 0.0047



#pragma DATA_SECTION(ns_I,"data_buff1")
#pragma DATA_SECTION(ns_Q,"data_buff1")
#pragma DATA_SECTION(OUT,"data_buff1")



struct  compx  {int real,imag;};
struct  compx  s[N+1] ;
struct  compx  out[N+1];
struct  compx  n_s[N+1];
struct  compx  match_f[N+1];

int  _sinx[N] , _cosx[N];
int  Re[N] , Im[N] ,  re1[N] , re2[N] , OUT[N] , s_I[N] , s_Q[N];
int Zs[N] , n_I[N] , n_Q[N] , ns_I[N] , ns_Q[N];

void FFT(struct compx *xin)
{
  int f,m,nv2,nm1,i,k,j=1,l;
  int le=2,lei,ip;
  struct compx temp;
  float v_real , v_imag , w_real , w_imag , t_real , t_imag;

  nv2=N/2;
  f=N;
  for(m=1;(f=f/2)!=1;m++){;}
  nm1=N-1;
  
  /*码位倒置*/
  for(i=1;i<=nm1;i++)
   {
     if(i<j){ temp=xin[j];xin[j]=xin[i];xin[i]=temp;}
      k=nv2;
      while(k<j){j=j-k;k=k/2;}
      j=j+k;  
       
   }
    
  /*FFT运算*/
    for(l=1;l<=m;l++)
       {
       
         lei=le/2;
         v_real=1.0; v_imag=0.0;
         w_real=cos(pi/lei);w_imag=-sin(pi/lei);
         for(j=1;j<=lei;j++)
           {
             for(i=j;i<=N;i=i+le)
                {
                  ip=i+lei;
                  
                  t_real=xin[ip].real*v_real-xin[ip].imag*v_imag;
                  t_imag=xin[ip].real*v_imag+xin[ip].imag*v_real; 
                                    
                  xin[ip].real=xin[i].real-t_real;
                  xin[ip].imag=xin[i].imag-t_imag;
                  
                  xin[i].real=xin[i].real+t_real;
                  xin[i].imag=xin[i].imag+t_imag;               
                }
                  
              v_real=v_real*w_real-v_imag*w_imag;
              v_imag=v_real*w_imag+v_imag*w_real;                                                           
           }       
 
          le=le*2;
       }
 
}


void main()
{
  int i;
  /*线性调频信号产生*/
  
  memset(Zs,0,N);   
  srand((unsigned)time(NULL));  
  for(i=1;i<=N;i++)
  { 
    _cosx[i]=63*cos(2*pi*i*i*D16);   /*7bit量化*/
    _sinx[i]=63*sin(2*pi*i*i*D16);
    
    s[i].real=_cosx[i];
    s[i].imag=_sinx[i];
       
    Zs[i]=rand()%300-150; 
    n_I[i]=_cosx[i]+Zs[i];
    n_Q[i]=_sinx[i]+Zs[i];
          
    n_s[i].real=n_I[i];          
    n_s[i].imag=n_Q[i];    
    
  } 
   
   FFT(s);
   FFT(n_s);
     
    /*生成匹配滤波器*/  
  for(i=1;i<=N;i++)
   { 
     ns_I[i]=n_s[i].real;
     ns_Q[i]=n_s[i].imag;
   
     match_f[i].real=s[i].real*G16;             /*为防止溢出,乘以归一化因子*/
     match_f[i].imag=-s[i].imag*G16;   
        
   } 
   
  /*频域相乘*/ 
   for(i=1;i<=N;i++)
   { 
     out[i].real=n_s[i].real*G32*match_f[i].real-n_s[i].imag*G32*match_f[i].imag;
     out[i].imag=n_s[i].real*G32*match_f[i].imag+n_s[i].imag*G32*match_f[i].real;

   }
   
       /*计算IFFT*/
   for(i=1;i<=N;i++)
   {
    out[i].real=out[i].real;
    out[i].imag=-out[i].imag;
   }
   
   FFT(out);
   
   for(i=1;i<=N;i++)
   {
     Re[i-1]=out[i].real/50; 
     Im[i-1]=-out[i].imag/50;    
   }
   
     /*执行ifftshift*/ 
    for(i=0;i<N/2;i++)
   {
     re1[i]=Re[N/2+i];
     re1[N/2+i]=Re[i];
     re2[i]=Im[N/2+i];
     re2[N/2+i]=Im[i];       
   }  
    
   for(i=0;i<N;i++)
    {
        OUT[i]=re1[i]*0.25*re1[i]*0.25+re2[i]*0.25*re2[i]*0.25;
        OUT[i]=4*sqrt(OUT[i]);      
    } 
   
}



⌨️ 快捷键说明

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