普通半带多相滤波器基于C++编程.docx

上传人:b****5 文档编号:3913651 上传时间:2022-11-26 格式:DOCX 页数:13 大小:17.33KB
下载 相关 举报
普通半带多相滤波器基于C++编程.docx_第1页
第1页 / 共13页
普通半带多相滤波器基于C++编程.docx_第2页
第2页 / 共13页
普通半带多相滤波器基于C++编程.docx_第3页
第3页 / 共13页
普通半带多相滤波器基于C++编程.docx_第4页
第4页 / 共13页
普通半带多相滤波器基于C++编程.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

普通半带多相滤波器基于C++编程.docx

《普通半带多相滤波器基于C++编程.docx》由会员分享,可在线阅读,更多相关《普通半带多相滤波器基于C++编程.docx(13页珍藏版)》请在冰豆网上搜索。

普通半带多相滤波器基于C++编程.docx

普通半带多相滤波器基于C++编程

普通:

#include

#ifdefWIN32

#include

#endif

#defineSAMPLEdouble/*definethetypeusedfordatasamples*/

/****************************************************************************/

/*clear:

zeroizeaFIRdelayline*/

/****************************************************************************/

voidclear(intntaps,SAMPLEz[])

{

intii;

for(ii=0;ii

z[ii]=0;

}

}

/****************************************************************************

*fir_basic:

DoesthebasicFIRalgorithm:

storeinputsample,calculate

*outputsample,shiftdelayline

*****************************************************************************/

SAMPLEfir_basic(SAMPLEinput,intntaps,constSAMPLEh[],SAMPLEz[])

{

intii;

SAMPLEaccum;

/*storeinputatthebeginningofthedelayline*/

z[0]=input;

/*calcFIR*/

accum=0;

for(ii=0;ii

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"

#include"CommBlockset.h"

#include"sigpro.h"

#include"Mixer.c"

#include"sigpro.c"

#include"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);

init_VectorReal(&Qout,DATABLOCKSIZE);

cordic_construct(50);

do

{

for(i=0;i

{

fscanf(fpin,"%d",buffer+i);

}

for(i=0;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;il

{

for(intjl=0;jl<2;jl++)

x[jl]=Qout.pData[il+jl];

QDecmbuf[m]=filterD2(x,z2Q,H,JS);

m++;

il+=D;

}

//********************************************

m=0;

for(il=0;il

{

for(intjl=0;jl<2;jl++)

x[jl]=IDecmbuf[il+jl];

IDecmbuf2[m]=filterD2(x,z3I,H2,JS2);

m++;

il+=2;

}

m=0;

for(il=0;il

{

for(intjl=0;jl<2;jl++)

x[jl]=QDecmbuf[il+jl];

QDecmbuf2[m]=filterD2(x,z3Q,H2,JS2);

m++;

il+=2;

}

//***********************鉴相************************

for(i=0;i

{

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;

for(il=0;il

{

for(intjl=0;jl<2;jl++)

x[jl]=outData2[il+jl];

outData3[m]=filterD2(x,z4,H3,JS3);

m++;

il+=2;

}

//***************************************

m=0;

for(il=0;il

{

for(intjl=0;jl<2;jl++)

x[jl]=outData3[il+jl];

outData4[m]=filterD2(x,z5,H4,JS4);

m++;

il+=2;

}

for(i=0;i

{

fprintf(fpout,"%f\n",outData4[i]);

}

}

while(!

feof(fpin));

fclose(fpin);fclose(fpout);

return0;

}

多相:

#include"stdio.h"

#include"math.h"

#include"CommBlockset.h"

#include"sigpro.h"

#include"FIR_algs.c"

#include"Mixer.c"

#include"sigpro.c"

#include"Cordic.C"

#defineDATABLOCKSIZE128

#defineD4

#definentaps128

#definentaps240

externvoidinit_VectorInt(VectorInt*pvec,intsize);

externvoidinit_VectorReal(VectorReal*vecin,intsize);

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])

{

doublesum=0.0;

for(inti=D-1;i>=0;i--)

{z[i][0]=x[D-1-i];

for(intj=0;j

sum+=h[i][j]*z[i][j];

}

for(i=D-1;i>=0;i--)

for(intj=ntaps1/D-1;j>0;j--)

z[i][j]=z[i][j-1];

returnsum;

}

doublefilterD2(double*x,doublez[D][ntaps2/D],doubleh[D][ntaps2/D])

{

doublesum=0.0;

for(inti=D-1;i>=0;i--)

{z[i][0]=x[D-1-i];

for(intj=0;j

sum+=h[i][j]*z[i][j];

}

for(i=D-1;i>=0;i--)

for(intj=ntaps2/D-1;j>0;j--)

z[i][j]=z[i][j-1];

returnsum;

}

intmain()

{inti1,i2,j;

doubleh1[D][ntaps1/D],h2[D][ntaps2/D];

for(i1=0;i1

for(j=0;j

{h1[i1][j]=H1[i1+j*D];

Iz1[i1][j]=0.0;

Qz1[i1][j]=0.0;

}

for(i2=0;i2

for(j=0;j

{h2[i2][j]=H2[i2+j*D];

z2[i2][j]=0.0;

}

doublep_mag[1],p_phase_rads[1];

VectorIntinput;inti;

VectorRealIout,Qout;

intbuffer[DATABLOCKSIZE];

doubleIDecmbuf2[DATABLOCKSIZE/D]={0},QDecmbuf2[DATABLOCKSIZE/D]={0};

doubleoutData[DATABLOCKSIZE/D],outData2[DATABLOCKSIZE/D/D];

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);

init_VectorReal(&Qout,DATABLOCKSIZE);

doubletemp=0.0;

cordic_construct(50);

//memset(I_Z,0,61*Sizeof(double));

//memset(Q_Z,0,61*Sizeof(double));

do

{

for(i=0;i

{fscanf(fpin,"%d",buffer+i);}

for(i=0;i

input.pData[i]=buffer[i];

real_mixer(&input,&Iout,&Qout);

intn=0;

for(i=0;i

IDecmbuf2[n++]=filterD1(Iout.pData+i,Iz1,h1);

n=0;

for(i=0;i

QDecmbuf2[n++]=filterD1(Qout.pData+i,Qz1,h1);

for(i=0;i

{

cordic_get_mag_phase(IDecmbuf2[i],QDecmbuf2[i],p_mag,p_phase_rads);

outData[i]=(p_phase_rads[0]-temp);

if(outData[i]>PI)

outData[i]-=2*PI;

elseif(outData[i]<-PI)

outData[i]+=2*PI;

temp=p_phase_rads[0];

}

n=0;

for(i=0;i

outData2[n++]=filterD2(outData+i,z2,h2);

//out

for(i=0;i

{

fprintf(fpout,"%f\n",outData2[i]);

}

}

while(!

feof(fpin));

fclose(fpin);fclose(fpout);

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1