普通半带多相滤波器基于C++编程Word文档格式.docx
《普通半带多相滤波器基于C++编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《普通半带多相滤波器基于C++编程Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
SAMPLEaccum;
/*storeinputatthebeginningofthedelayline*/
z[0]=input;
/*calcFIR*/
accum=0;
accum+=h[ii]*z[ii];
/*shiftdelayline*/
for(ii=ntaps-2;
ii>
=0;
ii--){
z[ii+1]=z[ii];
returnaccum;
半带:
#include"
stdio.h"
#include"
math.h"
CommBlockset.h"
sigpro.h"
Mixer.c"
sigpro.c"
CORDIC.C"
#defineD2
#defineJS7
#defineJS211
#defineJS37
#defineJS415
#definepi3.14159265358979323846
#defineDATABLOCKSIZE128
//staticdoubleI_Z[JS];
//staticdoubleQ_Z[JS];
externvoidinit_VectorInt(VectorInt*pvec,intsize);
externvoidinit_VectorReal(VectorReal*vecin,intsize);
constdoubleH[JS]={-0.04173992102517,0,0.2898469769544,0.5,0.2898469769544,0,-0.04173992102517};
constdoubleH2[JS2]={0.0477713151347,0,-0.08937867671894,0,0.3124344534422,0.5,0.3124344534422,
0,-0.08937867671894,0,0.0477713151347};
constdoubleH3[JS3]={-0.04348967365368,0,0.2909916440201,0.5,
0.2909916440201,0,-0.04348967365368};
constdoubleH4[JS4]={-0.03595079960366,0,0.04830608563714,0,
-0.09630011736658,0,0.3149368549022,0.5,
0.3149368549022,0,-0.09630011736658,0,
0.04830608563714,0,-0.03595079960366};
doublez2I[JS]={0};
doublez2Q[JS]={0};
doublez3I[JS2]={0};
doublez3Q[JS2]={0};
doublez4[JS3]={0};
doublez5[JS4]={0};
//***********decimateD=2*****************************
doublefilterD2(double*x,double*z,constdouble*h,intN)
for(intj=N-1;
j>
=D;
j--)
{
z[j]=z[j-D];
for(intk=D-1;
k>
=0;
k--)
z[k]=x[D-1-k];
doublesum=0.0;
for(intm=0;
m<
(N-1)/2;
m+=2)
sum+=(z[m]+z[N-1-m])*h[m];
m--;
sum+=z[m]*h[m];
returnsum;
//***********************main函数***************
intmain()
{
doubletemp=0.0;
doublep_mag[1],p_phase_rads[1];
VectorIntinput;
inti;
VectorRealIout,Qout;
intbuffer[DATABLOCKSIZE];
doubleIDecmbuf[DATABLOCKSIZE],QDecmbuf[DATABLOCKSIZE],x[2],outData2[DATABLOCKSIZE/2],outData3[DATABLOCKSIZE/4],outData4[DATABLOCKSIZE/8];
doubleIDecmbuf2[DATABLOCKSIZE/2],QDecmbuf2[DATABLOCKSIZE/2];
FILE*fpin,*fpout=NULL;
fpin=fopen("
fm_sample.txt"
"
r"
);
fpout=fopen("
e:
//out.txt"
"
wt"
Mixer_Init();
init_VectorInt(&
input,DATABLOCKSIZE);
init_VectorReal(&
Iout,DATABLOCKSIZE);
Qout,DATABLOCKSIZE);
cordic_construct(50);
do
for(i=0;
i<
DATABLOCKSIZE;
i++)
{
fscanf(fpin,"
%d"
buffer+i);
}
input.pData[i]=buffer[i];
real_mixer(&
input,&
Iout,&
Qout);
//**********************************************
intm=0;
for(intil=0;
il<
)
{
for(intjl=0;
jl<
2;
jl++)
x[jl]=Iout.pData[il+jl];
IDecmbuf[m]=filterD2(x,z2I,H,JS);
m++;
il+=D;
}
m=0;
for(il=0;
x[jl]=Qout.pData[il+jl];
QDecmbuf[m]=filterD2(x,z2Q,H,JS);
//********************************************
DATABLOCKSIZE/2;
x[jl]=IDecmbuf[il+jl];
IDecmbuf2[m]=filterD2(x,z3I,H2,JS2);
il+=2;
x[jl]=QDecmbuf[il+jl];
QDecmbuf2[m]=filterD2(x,z3Q,H2,JS2);
//***********************鉴相************************
for(i=0;
DATABLOCKSIZE/4;
cordic_get_mag_phase(IDecmbuf2[i],QDecmbuf2[i],p_mag,p_phase_rads);
outData2[i]=p_phase_rads[0]-temp;
while(outData2[i]>
pi)
outData2[i]-=2*pi;
while(outData2[i]<
-pi)
outData2[i]+=2*pi;
temp=p_phase_rads[0];
//**********************************
m=0;
x[jl]=outData2[il+jl];
outData3[m]=filterD2(x,z4,H3,JS3);
//***************************************
DATABLOCKSIZE/8;
x[jl]=outData3[il+jl];
outData4[m]=filterD2(x,z5,H4,JS4);
DATABLOCKSIZE/16;
{
fprintf(fpout,"
%f\n"
outData4[i]);
while(!
feof(fpin));
fclose(fpin);
fclose(fpout);
return0;
多相:
FIR_algs.c"
Cordic.C"
#defineD4
#definentaps128
#definentaps240
doubleIz1[D][ntaps1/D]={0},Qz1[D][ntaps1/D]={0},z2[D][ntaps2/D];
constdoubleH1[ntaps1]={
0.0001218180168559,-0.002199857526975,-0.00570653624278,-0.0007566590783525,
0.01085855499358,0.004404029029849,-0.02040178365567,-0.01261631182845,
0.03591119168583,0.02969784664732,-0.06486628997204,-0.07305596078534,
0.1565797527218,0.437942779079,0.437942779079,0.1565797527218,
-0.07305596078534,-0.06486628997204,0.02969784664732,0.03591119168583,
-0.01261631182845,-0.02040178365567,0.004404029029849,0.01085855499358,
-0.0007566590783525,-0.00570653624278,-0.002199857526975,0.0001218180168559
};
constdoubleH2[ntaps2]={
-0.01710994328325,-0.02449741831565,-0.03378564441896,-0.03737977083078,
-0.03206575889179,-0.01736499143025,0.003518296927924,0.02416023738508,
0.03696382902976,0.03613713929276,0.02052345514521,-0.004946075607976,
-0.03006194182572,-0.04243367846578,-0.03191974412245,0.005204670842473,
0.06398534633161,0.1314912918245,0.190472950864,0.2248069903693,
0.2248069903693,0.190472950864,0.1314912918245,0.06398534633161,
0.005204670842473,-0.03191974412245,-0.04243367846578,-0.03006194182572,
-0.004946075607976,0.02052345514521,0.03613713929276,0.03696382902976,
0.02416023738508,0.003518296927924,-0.01736499143025,-0.03206575889179,
.0373********
doublefilterD1(double*x,doublez[D][ntaps1/D],doubleh[D][ntaps1/D])
for(inti=D-1;
i>
i--)
{z[i][0]=x[D-1-i];
for(intj=0;
j<
ntaps1/D;
j++)
sum+=h[i][j]*z[i][j];
for(i=D-1;
for(intj=ntaps1/D-1;
0;
z[i][j]=z[i][j-1];
doublefilterD2(double*x,doublez[D][ntaps2/D],doubleh[D][ntaps2/D])
for(intj=ntaps2/D-1;
{inti1,i2,j;
doubleh1[D][ntaps1/D],h2[D][ntaps2/D];
for(i1=0;
i1<
D;
i1++)
for(j=0;
{h1[i1][j]=H1[i1+j*D];
Iz1[i1][j]=0.0;
Qz1[i1][j]=0.0;
for(i2=0;
i2<
i2++)
ntaps2/D;
{h2[i2][j]=H2[i2+j*D];
z2[i2][j]=0.0;
doubleIDecmbuf2[DATABLOCKSIZE/D]={0},QDecmbuf2[DATABLOCKSIZE/D]={0};
doubleoutData[DATABLOCKSIZE/D],outData2[DATABLOCKSIZE/D/D];
//memset(I_Z,0,61*Sizeof(double));
//memset(Q_Z,0,61*Sizeof(double));
{fscanf(fpin,"
input.pData[i]=buffer[i];
real_mixer(&
intn=0;
for(i=0;
i<
DATABLOCKSIZE;
i+=D)
IDecmbuf2[n++]=filterD1(Iout.pData+i,Iz1,h1);
n=0;
QDecmbuf2[n++]=filterD1(Qout.pData+i,Qz1,h1);
DATABLOCKSIZE/D;
outData[i]=(p_phase_rads[0]-temp);
if(outData[i]>
PI)
outData[i]-=2*PI;
elseif(outData[i]<
-PI)
outData[i]+=2*PI;
DATABLOCKSIZE/D;
outData2[n++]=filterD2(outData+i,z2,h2);
//out
DATABLOCKSIZE/D/D;
outData2[i]);
return0;