nmpp
fft.h
1//***************************************************************************/
2//* RC Module Inc., Moscow, Russia */
3//* NeuroMatrix(r) NM6403 Software */
4//* */
5//* Fast Fourie Transform Library */
6//* (C-callable functions) */
7//* */
8//* $Workfile:: sFFT.h $*/
9//* Contents: Header file of FFT routines */
10//* */
11//* */
12//* Author: S.Mushkaev */
13//* */
14//* Version 1.0 */
15//* Start Date: 03.07.2001 */
16//* Release $Date: 2005/07/13 14:19:56 $ */
17//* */
18//* */
19//***************************************************************************/
20
21// LIBRARY nmfft.lib
22
23
24
25#ifndef _SFFT2_H_INCLUDED_
26#define _SFFT2_H_INCLUDED_
27
28
29#include "nmtype.h"
30
31//*****************************************************************************
32
33
34/*
35#ifndef _NMCMPLX_H_INCLUDED_
36 struct nm32sc
37 {
38 int re;//Real;
39 int im;//Imag;
40 nm32sc():
41 re(0),im(0){}; //Real(0),Imag(0){}
42 nm32sc(int _Real,int _Imag):
43 re(_Real),im(_Imag){};//Real(_Real),Imag(_Imag){}
44 };
45#endif //_NMCMPLX_H_INCLUDED_
46*/
47//#include "nmpp.h"
48
50// The functions listed below are forward and inversed FFT routines for
51// 256,512,1024 or 2048-point compex data, represented as arrays of nm32sc type.
52// Each complex number is stored in 64-bit word.
53// The lower 32-bits is real part of complex number.
54// The higher 32-bits is imaginary part of complex number;
55// The admissible input range of data depends on dimension of array,
56// mode of calculation accuracy and on/off mode of intermediate and final scaling down (shift normalization) of results.
57// This range guarantee against overflow during calculation process.
58// The table of ranges you may find in "FFT Library Programmer's manual"
59//
60// The mode of calculation accuracy tells how sine-cosine coeffecients are represented if fixed-point format.
61// When the 7-bit accuracy mode is used, output shape accuracy approaches of the maximum,
62// but output is reduced by around 2%.
63// If the 6-bit accuracy mode is used, then output range corresponds to result of Fourie transform
64// based on floating-point arithmetic, but output is less precise.
65// The mode of calulation accuracy may be set or switched by appropriate ***Set6bit() or ***Set7bit() function
66// NOTE: At least on time the accuracy setting function must be called before FFT routine executing.
67#include "malloc32.h"
68
69#ifdef __cplusplus
70 extern "C" {
71#endif
72//============================= Forward FFT 256 =====================================
73
74
75#include "time.h"
76#include "malloc32.h"
77
78
79
80 #define FFT_SPEC_NUM_BUFFERS 2
81 #define FFT_SPEC_NUM_TABLES 2
82 #define FFT_SPEC_NUM_SHIFTS 8
83 #define FFT_SPEC_NUM_AMPLITUDES 8
84 typedef struct {
85 int round;
86 int shift;
87
88 } RoundShift;
89 typedef struct {
90
91
92 nm32sc* buffer[FFT_SPEC_NUM_BUFFERS];
93 void* fftTable[FFT_SPEC_NUM_TABLES];
94 RoundShift norm[4];
95 int shift[FFT_SPEC_NUM_SHIFTS];
96 int amp[FFT_SPEC_NUM_AMPLITUDES];
97 int round[8];
98 //int amp;
99 //void* coreOut;
100
101 Free32Func* free;
102 //NmppsAllocation allocOrder;
103 } NmppsFFTSpec;
104
105
106
107
108// int nmppsFFT256FwdInitAlloc(Malloc32Func* allocate, Free32Func* free, NmppsFFTSpec* spec);
109// void nmppsFFT256Fwd(nm32sc* src, nm32sc* dst, NmppsFFTSpec* spec);
110// void nmppsFFTFree(NmppsFFTSpec* spec );
111//
112// int nmppsFFT256FwdInitCustomAlloc(Malloc32Func* allocate, Free32Func* free, NmppsFFTSpec* spec);
113// void nmppsFFT256FwdOptimize(void* src, void* dst, uint64* allocOrder);
114
115
116
117//#ifdef __NM__
118//#define sizeof32(t) sizeof(t)
119//#else
120//#define sizeof32(t) (sizeof(t)*4)
121//#endif
122
123 #define NMPP_OPTIMIZE_DISABLE 1
124 #define NMPP_NORMALIZE_DISABLE 2
125 #define NMPP_FFT_6BIT 4
126 #define NMPP_FFT_7BIT 0
127 #define NMPP_OK 0
128 #define NMPP_ERROR -1
129
130 void nmppsFFTFree(NmppsFFTSpec* spec );
131
132 #define nmppsFFT16HiFwd nmppsFFT16Fwd242
133 #define nmppsFFT16HiFwdRaw nmppsFFT16Fwd242Raw
134
135 int nmppsFFT16HiFwdInit(NmppsFFTSpec* spec, void* buffer0, void* buffer1, void* fftTable0, void* fftTable1);
136 int nmppsFFT16HiFwdInitAlloc(NmppsFFTSpec* spec, const void* src, const void* dst, int settings);
137 void nmppsFFT16HiFwd(const nm32sc* src, nm32sc* dst, NmppsFFTSpec* spec);
138 void nmppsFFT16HiFwdRaw(const nm32sc* src, nm32sc* dst, NmppsFFTSpec* spec);
139
140
141 void nmppsFFT32FwdRaw(const nm32sc* src, nm32sc* dst, NmppsFFTSpec* spec);
142 void nmppsFFT32Fwd (const nm32sc* src, nm32sc* dst, NmppsFFTSpec* spec);
143 int nmppsFFT32FwdInitAlloc( NmppsFFTSpec* spec, int settings);
144 void nmppsFFT32Free( NmppsFFTSpec* spec);
145 //void nmppsFFT32FwdRawRef2x16( nm32sc* src, nm32sc* dst);
146
147//#define nmppsFFT64FwdRaw8x8 nmppsFFT64Fwd
148 void nmppsFFT64Fwd8x8Raw(const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
149 void nmppsFFT64Fwd (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
150 void nmppsFFT64Fwd2x4x8 (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
151 int nmppsFFT64FwdInitAlloc( NmppsFFTSpec* spec, int settings);
152 void nmppsFFT64Free( NmppsFFTSpec* spec);
153 //void nmppsFFT64FwdRawRef2x4x8( nm32sc* src, nm32sc* dst);
154
155 void nmppsFFT256Fwd (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
156 int nmppsFFT256FwdOptimize(void* src, void* dst, fseq64* allocOrder) ;
157 int nmppsFFT256FwdInitAlloc( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
158 int nmppsFFT256FwdInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
159
160 void nmppsFFT256Inv(const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
161 int nmppsFFT256InvOptimize (const void* src, const void* dst, fseq64* allocOrder) ;
162 int nmppsFFT256InvInitAlloc (NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
163 int nmppsFFT256InvInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
164
165 void nmppsFFT512FwdRaw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
166 void nmppsFFT512Fwd (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
167 int nmppsFFT512FwdOptimize (const void* src, const void* dst, fseq64* allocOrder) ;
168 int nmppsFFT512FwdInitAlloc ( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
169 int nmppsFFT512FwdInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
170
171 void nmppsFFT512Inv (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
172 void nmppsFFT512InvRaw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
173 int nmppsFFT512InvOptimize (const void* src, const void* dst, fseq64* allocOrder) ;
174 int nmppsFFT512InvInitAlloc (NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
175 int nmppsFFT512InvInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
176
177 void nmppsFFT1024Fwd (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
178 int nmppsFFT1024FwdOptimize (const void* src, const void* dst, fseq64* allocOrder) ;
179 int nmppsFFT1024FwdInitAlloc ( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
180 int nmppsFFT1024FwdInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
181
182 void nmppsFFT1024Inv (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
183 int nmppsFFT1024InvOptimize (const void* src, const void* dst, fseq64* allocOrder) ;
184 int nmppsFFT1024InvInitAlloc (NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
185 int nmppsFFT1024InvInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
186
187 void nmppsFFT2048Fwd (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
188 void nmppsFFT2048FwdInit (NmppsFFTSpec* specFFT, void* datbuf0, void* datbuf1, void* tblbuf0, void* tblbuf1, int settings );
189 void nmppsFFT2048Fwd4888 (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
190 void nmppsFFT2048Fwd4888Raw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
191 void nmppsFFT2048FwdRaw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
192// int nmppsFFT2048Fwd4888_ (nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
193 int nmppsFFT2048FwdOptimize (const void* src, const void* dst, fseq64* allocOrder) ;
194 int nmppsFFT2048FwdInitAlloc (NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
195 int nmppsFFT2048FwdInitAlloc4888( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
196 int nmppsFFT2048FwdInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
197
198
199 void nmppsFFT2048Inv (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
200 void nmppsFFT2048InvRaw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
201 int nmppsFFT2048InvInit ( NmppsFFTSpec* spec, int settings, nm64s *buf0, nm64s* buf1, nm64s* tbl0, nm64s* tbl1);
202 int nmppsFFT2048InvInitAlloc ( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
203 int nmppsFFT2048InvInitSinCos ( NmppsFFTSpec* spec, int settings);
204
205 //int nmppsFFT2048Inv4888RawRef (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
206 //int nmppsDFT2048InvRef_f (const nm32sc* src, nm32sc* dst);
207 //int nmppsFFT2048Inv28888Ref_f (const nm32sc* src, nm32sc* dst);
208 //int nmppsDFT2048Inv_i (const nm32sc* src, nm32sc* dst, int bits); //int nmppsFFT2048InvInitAllocCustom( NmppsFFTSpec** specFFT, Malloc32Func* allocate, Free32Func* free, int settings);
209
210
211 #define nmppsFFT8192Fwd nmppsFFT8192Fwd28888
212 #define nmppsFFT8192FwdRaw nmppsFFT8192Fwd28888Raw
213 #define nmppsFFT8192FwdInit nmppsFFT8192Fwd28888Init
214 #define nmppsFFT8192FwdInitAlloc nmppsFFT8192Fwd28888InitAlloc
215
216 #define nmppsFFT8192Inv nmppsFFT8192Inv28888
217 #define nmppsFFT8192InvRaw nmppsFFT8192Inv28888Raw
218 #define nmppsFFT8192InvInit nmppsFFT8192Inv28888Init
219 #define nmppsFFT8192InvInitAlloc nmppsFFT8192Inv28888InitAlloc
220
221 #define FFT2048_TBL0_SIZE64 2048
222 #define FFT2048_TBL1_SIZE64 2048
223 #define FFT2048_TBL2_SIZE64 (4*4*2+4*8*8+32*8*8+256*8*8)/8
224 #define FFT2048_TBL3_SIZE64 (4*4*2+4*8*8+32*8*8+256*8*8)/8
225
226 #define FFT8192_TBL0_SIZE64 9344/8
227 #define FFT8192_TBL1_SIZE64 65536/8
228 #define FFT8192_TBL2_SIZE64 9344/8
229 #define FFT8192_TBL3_SIZE64 65536/8
230
231 //void nmppsFFT8192Fwd (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
232 int nmppsFFT8192Fwd28888 (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
233 int nmppsFFT8192Fwd28888Raw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
234 int nmppsFFT8192Fwd28888RawRef (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
235 int nmppsFFT8192Fwd28888Init ( NmppsFFTSpec* spec, int settings, nm64s *buf0, nm64s* buf1, nm64s* tbl0, nm64s* tbl1, nm64s* tbl2, nm64s* tbl3);
236 int nmppsFFT8192Fwd28888InitAlloc( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
237 int nmppsFFT8192Fwd28888InitSinCos( NmppsFFTSpec* spec, int settings);
238 int nmppsDFT8192FwdRef_f (const nm32sc* src, nm32sc* dst);
239 int nmppsFFT8192Fwd28888Ref_f (const nm32sc* src, nm32sc* dst);
240 int nmppsDFT8192Fwd_i (const nm32sc* src, nm32sc* dst, int bits);
241
242 int nmppsFFT8192Inv28888 (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
243 int nmppsFFT8192Inv28888Raw (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
244 int nmppsFFT8192Inv28888RawRef (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
245 int nmppsFFT8192Inv28888Init ( NmppsFFTSpec* spec, int settings, nm64s *buf0, nm64s* buf1, nm64s* tbl0, nm64s* tbl1, nm64s* tbl2, nm64s* tbl3);
246 int nmppsFFT8192Inv28888InitAlloc( NmppsFFTSpec** spec, const void* src, const void* dst, int settings);
247 int nmppsFFT8192Inv28888InitSinCos( NmppsFFTSpec* spec, int settings);
248 int nmppsDFT8192InvRef_f (const nm32sc* src, nm32sc* dst);
249 int nmppsFFT8192Inv28888Ref_f (const nm32sc* src, nm32sc* dst);
250 int nmppsDFT8192Inv_i (const nm32sc* src, nm32sc* dst, int bits);
251
252 void nmppsFFTResetSpec(NmppsFFTSpec* spec);
253
254
255//#include "nmtl/tcmplx.h"
256void nmppsFFT32FwdRef2x16 ( nm32sc* src, nm32sc* dst); // C++
257void nmppsFFT32FwdRef2x16_f( nm32sc* src, nm32sc* dst); // C++
258
259
260
261void nmppsFFT64FwdRef_f ( nm32sc* src, nm32sc* dst);
262void nmppsFFT64FwdRef2x32_f ( nm32sc* src, nm32sc* dst);
263void nmppsFFT64FwdRef2x4x8_f( nm32sc* src, nm32sc* dst);
264void nmppsFFT64FwdRef2x4x8 ( nm32sc* src, nm32sc* dst);
265void nmppsFFT64FwdRef4x4x4_f( nm32sc* src, nm32sc* dst);
266void nmppsFFT64FwdRef8x8_f ( nm32sc* src, nm32sc* dst);
267void nmppsFFT64FwdRef8x8 ( nm32sc* src, nm32sc* dst);
268
269void nmppsDFT512Fwd_RefFloat(const nm32sc* src, nm32sc* dst);
270void nmppsFFT512Fwd_RefFloat(const nm32sc* src, nm32sc* dst);
271void nmppsDFT512Inv_RefFloat(const nm32sc* src, nm32sc* dst);
272
273//id nmppsFFT2048Fwd_f (const nm32sc* src, nm32sc* dst, const NmppsFFTSpec* spec);
274void nmppsDFT2048Fwd_RefFloat(const nm32sc* src, nm32sc* dst);
275void nmppsDFT2048Inv_RefFloat(const nm32sc* src, nm32sc* dst);
276void nmppsFFT2048Fwd4888_RefFloat(const nm32sc* src, nm32sc* dst);
277void nmppsFFT2048Inv4888_RefFloat(const nm32sc* src, nm32sc* dst);
278void nmppsFFT2048Fwd4888_RefInt(const nm32sc* src, nm32sc* dst);
279void nmppsFFT2048Inv4888_RefInt(const nm32sc* src, nm32sc* dst);
280//void nmppsFFT2048Fwd4888(const nm32sc* src, nm32sc* dst);
281
282//void nmppsFFT64FwdRef2x2x16_f( nm32sc* src, nm32sc* dst);
283
284#ifdef __cplusplus
285 };
286#endif
287
288#define SKIP_SINCOS 4
289
290#endif
long long nm64s
Definition: nmtype.h:375
Definition: fft.h:89
Definition: fft.h:84
Definition: nmtype.h:1301