普通半带多相滤波器基于C++编程.docx
- 文档编号:3913651
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:17.33KB
普通半带多相滤波器基于C++编程.docx
《普通半带多相滤波器基于C++编程.docx》由会员分享,可在线阅读,更多相关《普通半带多相滤波器基于C++编程.docx(13页珍藏版)》请在冰豆网上搜索。
普通半带多相滤波器基于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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 普通 多相 滤波器 基于 C+ 编程