-
Notifications
You must be signed in to change notification settings - Fork 2
/
fft.h
99 lines (97 loc) · 4.2 KB
/
fft.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
* Переносимая реализация БПФ для процессоров стандартной архитектуры
* Версия: 0.2b
* Файл: "fft.h"
* Кодировка: UTF-8
* Авторы: Дмитрий Сусляков, Александр Гриньков
* Дата модификации: 2011.11.23
*/
#ifndef FFT_H
#define FFT_H
//----------------------------------------------------------------------------
// опция отладочной печати на stderr
#define FFT_DEBUG // FIXME
//----------------------------------------------------------------------------
#ifdef FFT_DEBUG
# include <stdio.h> // fprintf()
# ifdef FFT_WIN32
# define FFT_DBG(fmt, ...) fprintf(stderr, "RK: " fmt "\n", __VA_ARGS__)
# else
# define FFT_DBG(fmt, arg...) fprintf(stderr, "RK: " fmt "\n", ## arg)
# endif
#else
# ifdef FFT_WIN32
# define FFT_DBG(fmt, ...)
# else
# define FFT_DBG(fmt, arg...)
# endif
#endif // FFT_DEBUG
//---------------------------------------------------------------------------
// inline macro
#ifndef FFT_INLINE
# if __GNUC__
# define FFT_INLINE static inline
# else
# define FFT_INLINE inline
# endif
#endif // FFT_INLINE
//---------------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//----------------------------------------------------------------------------
// функция расчёта поворотных множителей для БПФ
void fft_make(
int p, // показатель двойки (например, для БПФ на 256 точек это 8)
float *c); // результирующий массив поворотных множителей c[1 << p]
//----------------------------------------------------------------------------
// функция расчёта поворотных множителей для ОБПФ
void fft_make_reverse(
int p, // показатель двойки (например, для ОБПФ на 256 точек это 8)
float *c); // результирующий массив поворотных множителей c[1 << p]
//----------------------------------------------------------------------------
// функция бинарной инверсии индекса
FFT_INLINE int fft_binary_inversion(
int p, // показатель двойки (например, для БПФ на 256 точек это 8)
int i) // исходный индекс [0, (1 << p) - 1]
{
int j = 0;
while (p-- > 0)
{
j <<= 1;
j |= i & 1;
i >>= 1;
}
return j;
}
//----------------------------------------------------------------------------
// функция прямого БПФ
void fft_calc(
int p, // показатель двойки (например, для БПФ на 256 точек это 8)
const float *c, // массив поворотных множителей БПФ
const float *in, // входной массив
float *out, // выходной массив
int norm); // признак нормировки
//----------------------------------------------------------------------------
// функция обратного БПФ
FFT_INLINE void fft_calc_reverse(
int p, // показатель двойки (например, для БПФ на 256 точек это 8)
const float *c, // массив поворотных множителей ОБПФ
const float *in, // входной массив
float *out, // выходной массив
int norm) // признак нормировки
{
fft_calc(p, c, in, out, !norm); // БПФ
}
//----------------------------------------------------------------------------
// функция перестановки отсчётов спектра (что бы "0" в центре)
void fft_shift(
int p, // показатель двойки (например, для БПФ на 256 точек это 8)
float *data); // массив после БПФ
//----------------------------------------------------------------------------
#ifdef __cplusplus
}
#endif // __cplusplus
//----------------------------------------------------------------------------
#endif // FFT_H
/*** end of "fft.h" file ***/