[SCM] calf/master: + FFT: shorten initialization time by using symmetry + Bandlimiter: do not use static member variable for FFT object (it's unsafe), use a method + local static variable instead + Organ: do not generate useless harmonics

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:37:21 UTC 2013


The following commit has been merged in the master branch:
commit 7d37f008d11ae111d1eed6c2eaf20996429aedaf
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date:   Sat Jun 28 19:29:23 2008 +0000

    + FFT: shorten initialization time by using symmetry
    + Bandlimiter: do not use static member variable for FFT object (it's unsafe), use a method + local static variable instead
    + Organ: do not generate useless harmonics
    
    
    git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@216 78b06b96-2940-0410-b7fc-879d825d01d8

diff --git a/src/calf/fft.h b/src/calf/fft.h
index f8b79cf..7272f18 100644
--- a/src/calf/fft.h
+++ b/src/calf/fft.h
@@ -39,6 +39,7 @@ public:
     fft()
     {
         int N=1<<O;
+        assert(N >= 4);
         for (int i=0; i<N; i++)
         {
             int v=0;
@@ -46,7 +47,16 @@ public:
                 if (i&(1<<j))
                     v+=(N>>(j+1));
             scramble[i]=v;
-            sines[i]=complex(cos(2*PI*i/N),sin(2*PI*i/N));
+        }
+        int N90 = N >> 2;
+        T divN = 2 * PI / N;
+        // use symmetry
+        for (int i=0; i<N90; i++)
+        {
+            T angle = divN * i;
+            T c = cos(angle), s = sin(angle);
+            sines[i + 3 * N90] = -(sines[i + N90] = complex(-s, c));
+            sines[i + 2 * N90] = -(sines[i] = complex(c, s));
         }
     }
     void calculate(complex *input, complex *output, bool inverse)
diff --git a/src/calf/osc.h b/src/calf/osc.h
index d1740c3..7b79d2d 100644
--- a/src/calf/osc.h
+++ b/src/calf/osc.h
@@ -53,12 +53,17 @@ template<int SIZE_BITS>
 struct bandlimiter
 {
     enum { SIZE = 1 << SIZE_BITS };
-    static dsp::fft<float, SIZE_BITS> fft;
+    static dsp::fft<float, SIZE_BITS> &get_fft()
+    {
+        static dsp::fft<float, SIZE_BITS> fft;
+        return fft;
+    }
     
     std::complex<float> spectrum[SIZE];
     
     void compute_spectrum(float input[SIZE])
     {
+        dsp::fft<float, SIZE_BITS> &fft = get_fft();
         std::complex<float> *data = new complex<float>[SIZE];
         for (int i = 0; i < SIZE; i++)
             data[i] = input[i];
@@ -68,6 +73,7 @@ struct bandlimiter
     
     void compute_waveform(float output[SIZE])
     {
+        dsp::fft<float, SIZE_BITS> &fft = get_fft();
         std::complex<float> *data = new complex<float>[SIZE];
         fft.calculate(spectrum, data, true);
         for (int i = 0; i < SIZE; i++)
@@ -85,6 +91,7 @@ struct bandlimiter
     /// might need to be improved much in future!
     void make_waveform(float output[SIZE], int cutoff, bool foldover = false)
     {
+        dsp::fft<float, SIZE_BITS> &fft = get_fft();
         vector<std::complex<float> > new_spec, iffted;
         new_spec.resize(SIZE);
         iffted.resize(SIZE);
@@ -115,9 +122,6 @@ struct bandlimiter
     }
 };
 
-template<int SIZE_BITS>
-dsp::fft<float, SIZE_BITS> bandlimiter<SIZE_BITS>::fft;
-
 /// Set of bandlimited wavetables
 template<int SIZE_BITS>
 struct waveform_family: public map<uint32_t, float *>
diff --git a/src/organ.cpp b/src/organ.cpp
index 1cdc4de..18cc6c6 100644
--- a/src/organ.cpp
+++ b/src/organ.cpp
@@ -534,7 +534,7 @@ static void padsynth(bandlimiter<ORGAN_WAVE_BITS> blSrc, bandlimiter<ORGAN_BIG_W
     for (int i = 0; i <= ORGAN_BIG_WAVE_SIZE / 2; i++) {
         blDest.spectrum[i] = 0;
     }
-    for (int i = 1; i <= ORGAN_WAVE_SIZE / 2; i++) {
+    for (int i = 1; i <= ORGAN_WAVE_SIZE >> (1 + ORGAN_BIG_WAVE_SHIFT); i++) {
         float amp = abs(blSrc.spectrum[i]);
         int bw = 1 + 20 * i;
         float sum = 1;

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list