]> git.sesse.net Git - kdenlive/commitdiff
Audio scopes: Caching window functions for better performance
authorSimon A. Eugster <simon.eu@gmail.com>
Mon, 6 Dec 2010 16:56:27 +0000 (16:56 +0000)
committerSimon A. Eugster <simon.eu@gmail.com>
Mon, 6 Dec 2010 16:56:27 +0000 (16:56 +0000)
svn path=/trunk/kdenlive/; revision=5140

src/audioscopes/audiospectrum.cpp
src/audioscopes/ffttools.cpp
src/audioscopes/ffttools.h

index ffaff8442679d5102dac0c09881f32a72ab88642..2475094cb42facb808d018f9d767a3a58b76244d 100644 (file)
@@ -24,6 +24,7 @@
 //#define DEBUG_AUDIOSPEC
 #ifdef DEBUG_AUDIOSPEC
 #include <fstream>
+#include <QDebug>
 bool fileWritten = false;
 #endif
 
@@ -66,8 +67,6 @@ AudioSpectrum::AudioSpectrum(QWidget *parent) :
 
 
     m_cfg = kiss_fftr_alloc(ui->windowSize->itemData(ui->windowSize->currentIndex()).toInt(), 0,0,0);
-    //m_windowFunctions.insert("tri512", FFTTools::window(FFTTools::Window_Hamming, 8, 0));
-    // TODO Window function cache
 
 
     bool b = true;
@@ -179,9 +178,20 @@ QImage AudioSpectrum::renderAudioScope(uint, const QVector<int16_t> audioFrame,
         QVector<float> window;
         float windowScaleFactor = 1;
         if (windowType != FFTTools::Window_Rect) {
-            window = FFTTools::window(windowType, fftWindow, 0);
+            const QString signature = FFTTools::windowSignature(windowType, fftWindow, 0);
+            if (m_windowFunctions.contains(signature)) {
+#ifdef DEBUG_AUDIOSPEC
+                qDebug() << "Re-using window function with signature " << signature;
+#endif
+                window = m_windowFunctions.value(signature);
+            } else {
+#ifdef DEBUG_AUDIOSPEC
+                qDebug() << "Building new window function with signature " << signature;
+#endif
+                window = FFTTools::window(windowType, fftWindow, 0);
+                m_windowFunctions.insert(signature, window);
+            }
             windowScaleFactor = 1.0/window[fftWindow];
-            qDebug() << "Using a window scaling factor of " << windowScaleFactor;
         }
 
         // Normalize signals to [0,1] to get correct dB values later on
index 160dc59d389810d33977576a971a042abd9c1f12..fe7f240744f8279671ef1e1625f59ee247e00f0b 100644 (file)
@@ -10,6 +10,8 @@
 
 #include <math.h>
 
+#include <QString>
+
 #include "ffttools.h"
 
 //#define DEBUG_FFTTOOLS
@@ -21,8 +23,13 @@ FFTTools::FFTTools()
 {
 }
 
+const QString FFTTools::windowSignature(const WindowType windowType, const int size, const float param)
+{
+    return QString("s%1_t%2_p%3").arg(size).arg(windowType).arg(param, 0, 'f', 3);
+}
+
 // http://cplusplus.syntaxerrors.info/index.php?title=Cannot_declare_member_function_%E2%80%98static_int_Foo::bar%28%29%E2%80%99_to_have_static_linkage
-const QVector<float> FFTTools::window(WindowType windowType, const int size, const float param)
+const QVector<float> FFTTools::window(const WindowType windowType, const int size, const float param)
 {
     // Deliberately avoid converting size to a float
     // to keep mid an integer.
index acc8e6ee2f65f9e4f70540b372b60fb442931813..ef7fe0f9e12bdbfefafca07019983823ece0a2d6 100644 (file)
@@ -33,7 +33,9 @@ public:
           default is 0)
         * Nothing for the Hamming window
     */
-    static const QVector<float> window(WindowType windowType, const int size, const float param);
+    static const QVector<float> window(const WindowType windowType, const int size, const float param);
+
+    static const QString windowSignature(const WindowType windowType, const int size, const float param);
 
 };