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

📄 fft.h

📁 这是本人编写的软件接收机
💻 H
字号:
#ifndef FFT_H
#define FFT_H


//32 bit complex interleaved data format
typedef struct CPX
{
	short r;
	short i;

} CPX;

//Class Defenition
typedef class FFT
{


	private:

		__int64 *W;					//Twiddle lookup array for FFT
		__int64 *iW;				//Twiddle lookup array for iFFT
		int *BR;					//Re-order index array
		CPX *BRX;					//Re-order temp array

		int N;						//Power
		int L;						//Length = 2^N

		void initW();				//Initialize twiddles
		void initBR();				//Initialize re-order array
		void doShuffle(CPX * _x);	//Do bit-reverse shuffling

	public:

		FFT();								//Initialize FFT
		FFT(int _N);						//Initialize FFT for 2^N
		~FFT();								//Destructor
		void doFFT(CPX *_x, bool _shuf);	//Forward FFT, decimate in time
		void doiFFT(CPX *_x, bool _shuf);	//Inverse FFT, decimate in time
		void doFFTdf(CPX *_x, bool _shuf);	//Forward FFT, decimate in frequency
		void doiFFTdf(CPX *_x, bool _shuf);	//Inverse FFT, decimate in frequency

} FFT;


/* Decimation in Time Butterfly */
static void bfly(void *_A, void *_B, void *_W)
{
	__asm__ ("mov		%0, %%ebx" :  : "g"(_A));
	__asm__ ("mov		%%edi, %0" : "=g"(_B));
	__asm__ ("mov		esi, _W");

	__asm__ ("movd		mm0, ebx");	/*move 32 bits from A to bottom 32 bits of mm0*/
	__asm__ ("movd		mm1, [edi]");	/*move 32 bits from B to bottom 32 bits of mm1*/
	__asm__ ("movq		mm2, [esi]");	/*move 64 bits from W to mm2*/
	__asm__ ("psraw		mm0, 1");
	__asm__ ("psraw		mm1, 1");
	__asm__ ("movq		mm3, mm0");	/*copy A to mm3*/
	__asm__ ("punpckldq	mm1, mm1");	/*copy bottom 32 bits of B data into high 32 bits*/
	__asm__ ("pmaddwd		mm1, mm2");   /*complex multiply, real now 0..31 of mm1, imag 32..63 of mm1*/
	__asm__ ("psrad		mm1, 0xf");	/*right shift 0..31 by 16, 32..63 by 16*/
	__asm__ ("packssdw	mm1, mm1");	/*pack bits 0..31 to 0..16, bits 32..63 to  16..31*/
	__asm__ ("paddw		mm0, mm1");
	__asm__ ("psubw		mm3, mm1");
	__asm__ ("movd		[ebx], mm0");
	__asm__ ("movd		[edi], mm3");

	__asm__ ("EMMS");

}


/* Decimation in Frequency Butterfly */
static void bflydf(void *_A, void *_B, void *_W)
{
	__asm__ ("mov		ebx, _A");
	__asm__ ("mov		edi, _B");
	__asm__ ("mov		esi, _W");

	__asm__ ("movd		mm0, [ebx]");	/*move 32 bits from A to bottom 32 bits of mm0*/
	__asm__ ("movd		mm1, [edi]");	/*move 32 bits from B to bottom 32 bits of mm1*/
	__asm__ ("movq		mm2, [esi]");	/*move 64 bits from W to mm2*/
	__asm__ ("psraw		mm0, 0x1");
	__asm__ ("psraw		mm1, 0x1");
	__asm__ ("movq		mm3, mm0");	/*copy A to mm3*/
	__asm__ ("paddw		mm0, mm1");	/*A+B*/
	__asm__ ("psubw		mm3, mm1");	/*A-B*/
	__asm__ ("punpckldq	mm3, mm3");	/*copy bottom 32 bits of B data into high 32 bits*/
	__asm__ ("pmaddwd		mm3, mm2");   /*complex multiply, real now 0..31 of mm1, imag 32..63 of mm1*/
	__asm__ ("psrad		mm3, 0xf");	/*right shift 0..31 by 16, 32..63 by 16*/
	__asm__ ("packssdw	mm3, mm3");	/*pack bits 0..31 to 0..16, bits 32..63 to  16..31*/
	__asm__ ("movd		[ebx], mm0");
	__asm__ ("movd		[edi], mm3");

	__asm__ ("EMMS");

};


/* Inline Decimation in Time Butterfly */
inline void BFLY(void *_A, void *_B, void *_W)
{

__asm__ ("mov		ebx, _A");
__asm__ ("mov		edi, _B");
__asm__ ("mov		esi, _W");
__asm__ ("movd		mm0, [ebx]");
__asm__ ("movd		mm1, [edi]");
__asm__ ("movq		mm2, [esi]");
__asm__ ("psraw		mm0, (0x1)");
__asm__ ("psraw		mm1, (0x1)");
__asm__ ("movq		mm3, mm0");
__asm__ ("punpckldq	mm1, mm1");
__asm__ ("pmaddwd	mm1, mm2");
__asm__ ("psrad		mm1, (0xf)");
__asm__ ("packssdw	mm1, mm1");
__asm__ ("paddw		mm0, mm1");
__asm__ ("psubw		mm3, mm1");
__asm__ ("movd		[ebx], mm0");
__asm__ ("movd		[edi], mm3");
__asm__ ("EMMS");
};

/* Inline Decimation in Frequency Butterfly */
inline void  BFLYDF(void *_A, void *_B, void *_W)
{
__asm__ ("mov		ebx, _A");
__asm__ ("mov		edi, _B");
__asm__ ("mov		esi, _W");
__asm__ ("movd		mm0, [ebx]");
__asm__ ("movd		mm1, [edi]");
__asm__ ("movq		mm2, [esi]");
__asm__ ("psraw		mm0, (0x1)");
__asm__ ("psraw		mm1, (0x1)");
__asm__ ("movq		mm3, mm0");
__asm__ ("paddw		mm0, mm1");
__asm__ ("psubw		mm3, mm1");
__asm__ ("punpckldq	mm3, mm3");
__asm__ ("pmaddwd	mm3, mm2");
__asm__ ("psrad		mm3, (0xf)");
__asm__ ("packssdw	mm3, mm3");
__asm__ ("movd		[ebx], mm0");
__asm__ ("movd		[edi], mm3");
__asm__ ("EMMS");
}


#endif

⌨️ 快捷键说明

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