#include "IGHM.h"
static float GHMPR0[]={0.26517,0.88388,0,0};
static float GHMPR1[]={0.26517,0,1,0};
static float GHMPO0[]={0,1,0,-0.3};
static float GHMPO1[]={0,0,1.1314,-0.3};
static float GHML0[]={0.42426,0.8,-0.05,-0.21213};
static float GHML1[]={0.42426,0,0.45,0.70711};
static float GHML2[]={0,0,0.45,-0.21213};
static float GHML3[]={0,0,-0.05,0};
static float GHMH0[]={-0.05,-0.21213,0.070711,0.3};
static float GHMH1[]={0.45,-0.70711,-0.6364,0};
static float GHMH2[]={0.45,-0.21213,0.6364,-0.3};
static float GHMH3[]={-0.05,0,-0.070711,0};
float *IGHM_trans(float *fp,int num,int flag,int times){
int i,j;
float *temp=(float *) calloc (2*num,sizeof(float));
float *trans=(float *) calloc (2*num,sizeof(float));
flag=2;
num=(flag==1)?num:num/2;
for(i=0,j=0;i<num;i+=2,j++){
if(i==0){
temp[i]=GHML0[0]*fp[0]+GHML0[2]*fp[num]+GHML2[0]*fp[num/2-1]+GHML2[2]*fp[num/2-1+num]+GHMH0[0]*fp[num/2]+GHMH0[2]*fp[num/2+num]+GHMH2[0]*fp[num-1]+GHMH2[2]*fp[num-1+num];
temp[i+num]=GHML0[1]*fp[0]+GHML0[3]*fp[num]+GHML2[1]*fp[num/2-1]+GHML2[3]*fp[num/2-1+num]+GHMH0[1]*fp[num/2]+GHMH0[3]*fp[num/2+num]+GHMH2[1]*fp[num-1]+GHMH2[3]*fp[num-1+num];
temp[i+1]=GHML1[0]*fp[0]+GHML1[2]*fp[num]+GHML3[0]*fp[num/2-1]+GHML3[2]*fp[num/2-1+num]+GHMH1[0]*fp[num/2]+GHMH1[2]*fp[num/2+num]+GHMH3[0]*fp[num-1]+GHMH3[2]*fp[num-1+num];
temp[i+1+num]=GHML1[1]*fp[0]+GHML1[3]*fp[num]+GHML3[1]*fp[num/2-1]+GHML3[3]*fp[num/2-1+num]+GHMH1[1]*fp[num/2]+GHMH1[3]*fp[num/2+num]+GHMH3[1]*fp[num-1]+GHMH3[3]*fp[num-1+num];
}
else{
temp[i]=GHML0[0]*fp[j]+GHML0[2]*fp[j+num]+GHML2[0]*fp[j-1]+GHML2[2]*fp[j-1+num]+GHMH0[0]*fp[j+num/2]+GHMH0[2]*fp[j+num/2+num]+GHMH2[0]*fp[j-1+num/2]+GHMH2[2]*fp[j-1+num/2+num];
temp[i+num]=GHML0[1]*fp[j]+GHML0[3]*fp[j+num]+GHML2[1]*fp[j-1]+GHML2[3]*fp[j-1+num]+GHMH0[1]*fp[j+num/2]+GHMH0[3]*fp[j+num/2+num]+GHMH2[1]*fp[j-1+num/2]+GHMH2[3]*fp[j-1+num/2+num];
temp[i+1]=GHML1[0]*fp[j]+GHML1[2]*fp[j+num]+GHML3[0]*fp[j-1]+GHML3[2]*fp[j-1+num]+GHMH1[0]*fp[j+num/2]+GHMH1[2]*fp[j+num/2+num]+GHMH3[0]*fp[j-1+num/2]+GHMH3[2]*fp[j-1+num/2+num];
temp[i+1+num]=GHML1[1]*fp[j]+GHML1[3]*fp[j+num]+GHML3[1]*fp[j-1]+GHML3[3]*fp[j-1+num]+GHMH1[1]*fp[j+num/2]+GHMH1[3]*fp[j+num/2+num]+GHMH3[1]*fp[j-1+num/2]+GHMH3[3]*fp[j-1+num/2+num];
}
}
//后处理
if(times==1){
switch(flag){
case 1:
trans = IGHM_rr(temp,num);
break;
case 2:
trans =IGHM_ghmap(temp,num*2);
break;
default:
printf("please choose pre-process way...");
exit(0);
}
}
else
{
for(i=0;i<num*2;i++)
{
trans[i]=temp[i];
}
}
free(temp);
return trans;
}
float *IGHM_rr(float *arrange,int num){
int i;
float *temp =(float *) calloc (num,sizeof(float));
for(i=0;i<num;i++){
temp[i]=arrange[i];
}
return temp;
}
float *IGHM_ghmap(float *arrange,int num){
int i,j;
float *temp=(float *) calloc (num,sizeof(float));
for(i=0,j=0;i<num;i+=2,j++){
if(i==0){
temp[i]=GHMPO0[0]*arrange[num/2-1]+GHMPO0[1]*arrange[num-1]+GHMPO1[0]*arrange[0]+GHMPO1[1]*arrange[num/2];
temp[i+1]=GHMPO0[2]*arrange[num/2-1]+GHMPO0[3]*arrange[num-1]+GHMPO1[2]*arrange[0]+GHMPO1[3]*arrange[num/2];
}
else{
temp[i]=GHMPO0[0]*arrange[j-1]+GHMPO0[1]*arrange[j-1+num/2]+GHMPO1[0]*arrange[j]+GHMPO1[1]*arrange[j+num/2];
temp[i+1]=GHMPO0[2]*arrange[j-1]+GHMPO0[3]*arrange[j-1+num/2]+GHMPO1[2]*arrange[j]+GHMPO1[3]*arrange[j+num/2];
}
}
return temp;
}
评论0