?? fft.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 + -