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;iinput.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;jsum+=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;jsum+=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;i1for(j=0;j{h1[i1][j]=H1[i1+j*D];
Iz1[i1][j]=0.0;
Qz1[i1][j]=0.0;
}
for(i2=0;i2for(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;iinput.pData[i]=buffer[i];
real_mixer(&input,&Iout,&Qout);
intn=0;
for(i=0;iIDecmbuf2[n++]=filterD1(Iout.pData+i,Iz1,h1);
n=0;
for(i=0;iQDecmbuf2[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;ioutData2[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;
}