27 #include "vtkCommonMathModule.h"
34 #include "vtk_kissfft.h"
36 #include VTK_KISSFFT_HEADER(kiss_fft.h)
37 #include VTK_KISSFFT_HEADER(tools/kiss_fftr.h)
43 #include <type_traits>
46 VTK_ABI_NAMESPACE_BEGIN
76 "vtkFFT::ComplexNumber definition is not valid");
125 static std::vector<ComplexNumber> Fft(
const std::vector<ScalarNumber>& in);
126 static void Fft(ScalarNumber* input, std::size_t
size, ComplexNumber* result);
127 static std::vector<ComplexNumber> Fft(
const std::vector<ComplexNumber>& in);
128 static void Fft(ComplexNumber* input, std::size_t
size, ComplexNumber* result);
141 static std::vector<ComplexNumber> RFft(
const std::vector<ScalarNumber>& in);
142 static void RFft(ScalarNumber* input, std::size_t
size, ComplexNumber* result);
158 static std::vector<ComplexNumber> IFft(
const std::vector<ComplexNumber>& in);
168 static std::vector<ScalarNumber> IRFft(
const std::vector<ComplexNumber>& in);
173 static inline ScalarNumber Abs(
const ComplexNumber& in);
178 static inline ScalarNumber SquaredAbs(
const ComplexNumber& in);
183 static inline ComplexNumber Conjugate(
const ComplexNumber& in);
188 static std::vector<ScalarNumber> FftFreq(
int windowLength,
double sampleSpacing);
194 static std::vector<ScalarNumber> RFftFreq(
int windowLength,
double sampleSpacing);
203 static std::array<double, 2> GetOctaveFrequencyRange(Octave octave,
204 OctaveSubdivision octaveSubdivision = OctaveSubdivision::Full,
bool baseTwo =
true);
228 static std::vector<ComplexNumber> OverlappingFft(
const std::vector<T>& signal,
229 const std::vector<TW>& window, std::size_t noverlap,
bool detrend,
bool onesided,
230 unsigned int* shape =
nullptr);
232 template <
typename TW>
234 const std::vector<TW>& window, std::size_t noverlap,
bool detrend,
bool onesided,
235 unsigned int* shape =
nullptr);
285 static std::vector<ComplexNumber> Spectrogram(
const std::vector<T>& signal,
286 const std::vector<TW>& window,
double sampleRate,
int noverlap,
bool detrend,
bool onesided,
288 bool transpose =
false);
290 template <
typename TW>
294 unsigned int* shape =
nullptr,
bool transpose =
false);
322 static std::vector<vtkFFT::ScalarNumber> Csd(
const std::vector<T>& signal,
323 const std::vector<TW>& window,
double sampleRate,
int noverlap,
bool detrend,
bool onesided,
326 template <
typename TW>
328 const std::vector<TW>& window,
double sampleRate,
int noverlap,
bool detrend,
bool onesided,
344 template <
typename T>
345 static void Transpose(T*
data,
unsigned int* shape);
360 static inline ScalarNumber HanningGenerator(std::size_t x, std::size_t
size);
361 static inline ScalarNumber BartlettGenerator(std::size_t x, std::size_t
size);
363 static inline ScalarNumber BlackmanGenerator(std::size_t x, std::size_t
size);
364 static inline ScalarNumber RectangularGenerator(std::size_t x, std::size_t
size);
371 template <
typename T>
372 static void GenerateKernel1D(T* kernel, std::size_t n,
WindowGenerator generator);
378 template <
typename T>
379 static void GenerateKernel2D(T* kernel, std::size_t n, std::size_t m,
WindowGenerator generator);
387 ~
vtkFFT()
override =
default;
392 template <
typename T>
393 constexpr
static T Zero();
400 template <
typename InputIt>
401 static typename std::iterator_traits<InputIt>::value_type ComputeScaling(
402 InputIt begin, InputIt end,
Scaling scaling,
double fs);
408 template <
typename T,
typename TW>
409 static void PreprocessAndDispatchFft(
const T* segment,
const std::vector<TW>& window,
425 template <
typename TW>
426 static void ScaleFft(
ComplexNumber* fft,
unsigned int shape[2],
const std::vector<TW>& window,
432 void operator=(
const vtkFFT&) =
delete;
446 template <
typename T>
449 return static_cast<T
>(0);
472 (lhs.r * rhs.i) + (lhs.i * rhs.r) };
482 const double divisor = rhs.r * rhs.r + rhs.i * rhs.i;
484 ((lhs.i * rhs.r) - (lhs.r * rhs.i)) / divisor };
495 return std::sqrt(in.r * in.r + in.i * in.i);
501 return in.r * in.r + in.i * in.i;
513 return 0.5 * (1.0 - std::cos(2.0 *
vtkMath::Pi() * x / (size - 1)));
519 return 2.0 * x / (size - 1);
531 const double cosin = std::cos((2.0 *
vtkMath::Pi() * x) / (size - 1));
532 return 0.42 - 0.5 * cosin + 0.08 * (2.0 * cosin * cosin - 1.0);
542 template <
typename T>
545 std::size_t half = (n / 2) + (n % 2);
546 for (std::size_t i = 0; i < half; ++i)
548 kernel[i] = kernel[n - 1 - i] = generator(i, n);
553 template <
typename T>
556 const std::size_t halfX = (n / 2) + (n % 2);
557 const std::size_t halfY = (m / 2) + (m % 2);
558 for (std::size_t i = 0; i < halfX; ++i)
560 for (std::size_t j = 0; j < halfY; ++j)
564 = kernel[n - 1 - i][j]
565 = kernel[i][m - 1 - j]
566 = kernel[n - 1 - i][m - 1 - j]
567 = generator(i, n) * generator(j, m);
573 VTK_ABI_NAMESPACE_END
575 #include "vtkFFT.txx"
static ScalarNumber SquaredAbs(const ComplexNumber &in)
Return the squared absolute value of the complex number.
static void GenerateKernel1D(T *kernel, std::size_t n, WindowGenerator generator)
Given a window generator function, create a symmetric 1D kernel.
kiss_fft_cpx ComplexNumber
Useful type definitions and utilities.
abstract base class for most VTK objects
OctaveSubdivision
Enum specifying which octave band we want to compute.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkFFT::ComplexNumber operator-(const vtkFFT::ComplexNumber &lhs, const vtkFFT::ComplexNumber &rhs)
static ScalarNumber HanningGenerator(std::size_t x, std::size_t size)
Window generator functions.
vtkFFT::ComplexNumber operator*(const vtkFFT::ComplexNumber &lhs, const vtkFFT::ComplexNumber &rhs)
static constexpr double Pi()
A mathematical constant.
static ScalarNumber BlackmanGenerator(std::size_t x, std::size_t size)
Window generator functions.
Hold a reference to a vtkObjectBase instance.
static ScalarNumber RectangularGenerator(std::size_t x, std::size_t size)
Window generator functions.
Octave
Enum containing octave band numbers, named upon their nominal midband frequency.
a simple class to control print indentation
Array-Of-Structs implementation of vtkGenericDataArray.
ScalarNumber(*)(std::size_t, std::size_t) WindowGenerator
Window generator functions.
vtkFFT::ComplexNumber operator/(const vtkFFT::ComplexNumber &lhs, const vtkFFT::ComplexNumber &rhs)
static constexpr T Zero()
Templated zero value, specialized for vtkFFT::ComplexNumber.
static ScalarNumber SineGenerator(std::size_t x, std::size_t size)
Window generator functions.
static ComplexNumber Conjugate(const ComplexNumber &in)
Return the conjugate of the given complex number.
perform Discrete Fourier Transforms
static void GenerateKernel2D(T *kernel, std::size_t n, std::size_t m, WindowGenerator generator)
Given a window generator function, create a symmetric 2D kernel.
vtkFFT::ComplexNumber operator+(const vtkFFT::ComplexNumber &lhs, const vtkFFT::ComplexNumber &rhs)
SpectralMode
Spectral modes for Spectrogram and Csd functions.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
static ScalarNumber Abs(const ComplexNumber &in)
Return the absolute value (also known as norm, modulus, or magnitude) of complex number.
static ScalarNumber BartlettGenerator(std::size_t x, std::size_t size)
Window generator functions.
kiss_fft_scalar ScalarNumber
Useful type definitions and utilities.
Scaling
Scaling modes for Spectrogram and Csd functions.
STL-compatible iterable ranges that provide access to vtkDataArray elements.