📄 fftintel.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 + -