⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft_fix.h

📁 用systemC制作的快速付立叶变换
💻 H
字号:
// fft_fix.h// Pierre Bomel - LESTER/UBS - janvier 2005//    Formation chez France Telecom R&D#include <systemc.h>#include <math.h>template <int wl, int iwl, int n, int log2n, bool inv, bool trace_me>// wl for sc_fixed<wl ...>// iwl for sc_fixed<wl, iwl ...>// n = number of points// log2n = log2(n)// inverse = inverse FFT ON/OFF// trace_me = trace ON/OFFSC_MODULE (fft_fix){	// channels	sc_in   <sc_fixed<wl, iwl> > sreals[n], simags[n];	sc_inout<sc_fixed<wl, iwl> > freals[n], fimags[n];	// trace	ofstream coutr;	ofstream couti;	// data to process	sc_fixed<wl, iwl> coeffreals[n], coeffreal, treals[n], topreal, botreal; // real parts	sc_fixed<wl, iwl> coeffimags[n], coeffimag, timags[n], topimag, botimag; // imaginary parts	// FFT indexes	int Kn, Bp, Np, P, Np2, BaseT, b, BaseB, k;	void init_coeffs(){		double sign = inv ? 1.0 : -1.0;		double delta = (M_PI * 2.0) / double(n);		double angle = 0;		for(int i = 0; i < n; i++){			coeffreals[i] = cos(angle);			//cout << i << " cos " << coeffreals[i] << endl;			coeffimags[i] = sign * sin(angle);			//cout << i << " sin " << coeffimags[i] << endl;			angle += delta;		}		Kn = n;	}	sc_fixed<wl, iwl> Tr(int np, int i) {return coeffreals[i * Kn/np];}	sc_fixed<wl, iwl> Ti(int np, int i) {return coeffimags[i * Kn/np];}	int bit_reverse(int index)	{		int inverse = 0;		for(int i = 0; i < log2n; i++){			inverse <<= 1;			inverse |= index & 0x1;			index >>= 1;		}		return inverse;	}	void fft(){		// copy input channels values into array in bit reverse order		for(int i = 0; i < n; i++){			sc_fixed<wl, iwl> val;			int br = bit_reverse(i);			val = sreals[i].read();			//cout << i << " real " << val << endl;			treals[br] = val;			//cout << i << "(" << br << ") " << treals[br] << endl;			val = simags[i].read();			//cout << i << " imag " << val << endl;			timags[br] = val;			//cout << i << "(" << br << ") " << timags[br] << endl;		}		// run DIT radix2 FFT		Bp = 1 << (log2n-1);		Np = 2;		for(P = 0; P < log2n; P++){			Np2 = Np >> 1;			BaseT = 0;			for(b = 0; b < Bp; b++){				BaseB = BaseT + Np2;				for(k = 0; k < Np2; k++){					int l1 = BaseT+k;					int l2 = BaseB+k;					topreal = treals[l1];					//cout << "topreal " << topreal << endl;					topimag = timags[l1];					//cout << "topimag " << topimag << endl;					coeffreal = Tr(Np, k);					//cout << "coeffreal " << coeffreal << endl;					coeffimag = Ti(Np, k);					//cout << "coeffimag " << coeffimag << endl;					botreal = treals[l2]*coeffreal - timags[l2]*coeffimag;					//cout << treals[l2] << "*" << coeffreal << " - " << timags[l2] << "*" << coeffimag << endl;					//cout << "botreal " << botreal << endl;					botimag = treals[l2]*coeffimag + timags[l2]*coeffreal;					//cout << treals[l2] << "*" << coeffimag << " - " << timags[l2] << "*" << coeffreal << endl;					//cout << "botimag " << botimag << endl;					treals[l1] = topreal + botreal;					//cout << topreal << "+" << botreal << endl;					//cout << l1 << " " << treals[l1] << endl;					timags[l1] = topimag + botimag;					//cout << topimag << "+" << botimag << endl;					//cout << l1 << " " << timags[l1] << endl;					treals[l2] = topreal - botreal;					//cout << topreal << "-" << botreal << endl;					//cout << l2 << " " << treals[l2] << endl;					timags[l2] = topimag - botimag;					//cout << topimag << "-" << botimag << endl;					//cout << l2 << " " << timags[l2] << endl;				}				BaseT = BaseT + Np;			}			Bp = Bp >> 1;			Np = Np << 1;		}				// scaling only for reverse FFT (like MATLAB does)		if (inv){			for(int i = 0; i < n; i++){				treals[i] /= n;				timags[i] /= n;			}		}		// trace		if (trace_me) {			for(int i = 0; i < n; i++){				coutr << i << " " << treals[i] << endl;				couti << i << " " << timags[i] << endl;			}		}		// copy array into output channels values		for(int i = 0; i < n; i++){			freals[i].write(treals[i]);			fimags[i].write(timags[i]);		}	}	SC_CTOR(fft_fix){		char filename[100];		if (trace_me) {			sprintf(filename, "%sfft_fix_real", inv ? "i" : "");			coutr.open(filename, ios::out);			sprintf(filename, "%sfft_fix_imag", inv ? "i" : "");			couti.open(filename, ios::out);		}		init_coeffs();		SC_METHOD(fft);		for(int i = 0; i < n; i++){			sensitive << sreals[i] << simags[i];		}		dont_initialize();	}};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -