普通半带多相滤波器基于C++编程Word文档格式.docx

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

普通半带多相滤波器基于C++编程Word文档格式.docx

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

普通半带多相滤波器基于C++编程Word文档格式.docx

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;

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

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

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

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