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