20 std::complex<double>* _hilbertBuffer;
21 std::complex<T>* _iqComplex;
22 std::complex<double>* _iqSpectrum;
24 void FFT(std::valarray<std::complex<double>>& x)
26 const size_t N = x.size();
30 std::valarray<std::complex<double>> even = x[std::slice(0, N/2, 2)];
31 std::valarray<std::complex<double>> odd = x[std::slice(1, N/2, 2)];
38 for (
size_t k = 0; k < N/2; ++k)
40 std::complex<double> t = std::polar(1.0, -2 * M_PI * k / N) * odd[k];
42 x[k+N/2] = even[k] - t;
60 if( _window !=
nullptr ) {
65 _fftBuffer =
new T[_size];
68 _hilbertBuffer =
new std::complex<double>[_size];
71 _iqComplex =
new std::complex<T>[_size];
72 _iqSpectrum =
new std::complex<double>[_size];
77 delete _hilbertBuffer;
88 void FFT(std::complex<T>* src, std::complex<double>* result) {
91 std::valarray<std::complex<double>> x(_size);
92 for(
int i = 0; i < _size ; i++ )
94 x[i] = std::complex<double>(src[i].real(), src[i].imag());
101 for(
int i = 0; i < _size; i++ )
113 void FFT(T* src, std::complex<double>* result,
bool window =
true) {
116 if( window && _window !=
nullptr ) {
117 _window->
Apply(src, _fftBuffer, _size);
119 memcpy((
void*) _fftBuffer, (
void*) src, _size *
sizeof(T));
123 std::valarray<std::complex<double>> x(_size);
124 for(
int i = 0; i < _size ; i++ )
126 x[i] = std::complex<double>(_fftBuffer[i], 0);
133 for(
int i = 0; i < _size; i++ )
145 void FFT(T* src,
double* spectrum,
double* phase =
nullptr) {
148 std::complex<double>* result =
new std::complex<double>[_size];
154 for(
int i = 0; i < _size / 2; i++ )
157 spectrum[i] = std::abs(result[i]);
159 if( phase !=
nullptr )
161 phase[i] = std::arg(result[i]);
175 void IFFT(std::complex<double>* src, T* result) {
178 std::valarray<std::complex<double>> x(_size);
179 for(
int i = 0; i < _size ; i++ )
189 double factor = 1.0 / _size;
191 for(
int i = 0; i < _size; i++ )
193 result[i] = x[i].real() * factor;
199 FFT(src, _hilbertBuffer,
false);
201 for(
int i = _size / 2; i < _size; i++ ) {
202 _hilbertBuffer[i] = 0;
205 IFFT(_hilbertBuffer, dest);
218 void SPECTRUM(T* response,
int length, std::complex<double>* spectrum) {
221 if( length > _size / 2 ) {
226 T* buffer =
new T[_size];
227 memset((
void*) buffer, 0,
sizeof(T) * _size);
230 memcpy((
void*) buffer, (
void*) response,
sizeof(T) * length);
233 FFT(buffer, spectrum);
247 for(
int i = 0; i < _size * 2; i += 2 ) {
248 _iqComplex[i / 2] = {multiplexed[i], multiplexed[i + 1]};
259 FFT(iq, _iqSpectrum);
262 for(
int i = _size / 2; i < _size; i++ ) {
267 IFFT(_iqSpectrum, real);