X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudioscopes%2Fffttools.h;h=26cee848288bfcca5015de29da86389d50bc8182;hb=6ee97189c48f7e8271aa04fb34b650c1ae1037d2;hp=acc8e6ee2f65f9e4f70540b372b60fb442931813;hpb=d445699b4be47caffd2604c669088571696763b9;p=kdenlive diff --git a/src/audioscopes/ffttools.h b/src/audioscopes/ffttools.h index acc8e6ee..26cee848 100644 --- a/src/audioscopes/ffttools.h +++ b/src/audioscopes/ffttools.h @@ -12,11 +12,14 @@ #define FFTTOOLS_H #include +#include +#include "kiss_fft/tools/kiss_fftr.h" class FFTTools { public: FFTTools(); + ~FFTTools(); enum WindowType { Window_Rect, Window_Triangle, Window_Hamming }; @@ -33,7 +36,46 @@ public: default is 0) * Nothing for the Hamming window */ - static const QVector window(WindowType windowType, const int size, const float param); + static const QVector window(const WindowType windowType, const int size, const float param = 0); + + static const QString windowSignature(const WindowType windowType, const int size, const float param = 0); + + /** Returns a signature for a kiss_fft configuration + used as a hash in the cache */ + static const QString cfgSignature(const int size); + + /** Calculates the Fourier Tranformation of the input audio frame. + The resulting values will be given in relative dezibel: The maximum power is 0 dB, lower powers have + negative dB values. + * audioFrame: Interleaved format with #numChannels channels + * freqSpectrum: Array pointer to write the data into + * windowSize must be divisible by 2, + * freqSpectrum has to be of size windowSize/2 + For windowType and param see the FFTTools::window() function above. + */ + void fftNormalized(const QVector audioFrame, const uint channel, const uint numChannels, float *freqSpectrum, + const WindowType windowType, const uint windowSize, const float param = 0); + + + /** This is linear interpolation with the special property that it preserves peaks, which is required + for e.g. showing correct Decibel values (where the peak values are of interest because of clipping which + may occur for too strong frequencies; The lower values are smeared by the window function anyway). + Consider f = {0, 100, 0} + x = {0.5, 1.5}: With default linear interpolation x0 and x1 would both be mapped to 50. + This function maps x1 (the first position after the peak) to 100. + + @param in The source vector containing the data + @param targetSize Number of interpolation nodes between ... + @param left the left array index in the in-vector and ... + @param right the right array index (both inclusive). + @param fill If right lies outside of the array bounds (which is perfectly fine here) then this value + will be used for filling the missing information. + */ + static const QVector interpolatePeakPreserving(const QVector in, const uint targetSize, uint left = 0, uint right = 0, float fill = 0.0); + +private: + QHash m_fftCfgs; // FFT cfg cache + QHash > m_windowFunctions; // Window function cache };