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

📄 fftintel.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		_A, ebx);
	__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, 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{
	__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 */
#define BFLY(_A, _B, _W)	\
__asm {						\
__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 */
#define BFLYDF(_A, _B, _W)	\
__asm {						\
__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 + -