[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