#include #include #include #include #include #include #include #include #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr class marv { public: int reg_sig_len; float* reg_sig; int irreg_sig_len; float* irreg_sig; int* irreg_locs; int recon_sig_len; float* recon_sig; float* wt; int filt_len; float* filt; float* err; float max_err; int Done; int Fs; int Bw; int iter_num; int max_iter; float thresh; float relax; float total_time; marv(); void reset(float* rs, int rsl,float* is, int* il, int isl,double tsh,int mi,double bw,double fs); ~marv(); void fft(float data[], unsigned int nn, int isign); void SetParam(int mi,float tol,float rlx); void SetWeights(); void SetFilter( int* index); float* GetReconstSig(); float* GetErrorSig(); int* GetBW(float* data, int len,float frac); result next_iter(); void initialise(); friend ostream& operator << (ostream& os, marv& p); }; void marv::fft(float data[], unsigned int nn, int isign) { int n,mmax,m,j,istep,i; float wtemp,wr,wpr,wpi,wi,theta; float tempr,tempi; n=nn << 1; j=1; for (i=1;i i) { SWAP(data[j],data[i]); SWAP(data[j+1],data[i+1]); } m=n >> 1; while (m >= 2 && j > m) { j -= m; m >>= 1; } j += m; } mmax=2; while (n > mmax) { istep=mmax << 1; theta=isign*(6.28318530717959/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;mmax_iter) || (pct<.0001)) { cout << "Total no of Iter = " << iter_num << endl; Done=1; } if((max_err!=0.0) && (max_err=len/2;i--) { energy=energy+data[2*i]*data[2*i]; } temp=0.0; for(i=len-1;i>=len/2;i--) { temp=temp+data[2*i]*data[2*i]; if(frac<=(temp/energy)) break; } bw1[1]=i; return bw1; }; void marv::initialise() { int i,*index=new int[2]; float* data; data=new float[2*recon_sig_len]; for(i=0;iindex[0]) { index[0]=temp; index[1]=filt_len-temp; } cout << "filt index =" << index[0] << " " << index[1] << endl; SetFilter(index); for(i=0;i