aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/cosinetables.cpp24
-rw-r--r--common/cosinetables.h10
-rw-r--r--common/sinetables.cpp25
-rw-r--r--common/sinetables.h10
4 files changed, 52 insertions, 17 deletions
diff --git a/common/cosinetables.cpp b/common/cosinetables.cpp
index 589c7c78b4..92b1723c89 100644
--- a/common/cosinetables.cpp
+++ b/common/cosinetables.cpp
@@ -34,35 +34,45 @@ CosineTable::CosineTable(int nPoints) {
_nPoints = nPoints;
_radResolution = 2.0 * M_PI / _nPoints;
_refSize = _nPoints / 4;
- _table = new float[_nPoints / 2];
+ _tableEOS = new float[_nPoints / 2];
+ _table = new float[_nPoints];
+
+ for (int i = 0; i < _nPoints; i++)
+ _table[i] = cos(i * _radResolution);
// Table contains cos(2*pi*i/_nPoints) for 0<=i<=_nPoints/4,
// followed by 3_nPoints/4<=i<_nPoints
for (int i = 0; i <= _nPoints / 4; i++)
- _table[i] = cos(i * _radResolution);
+ _tableEOS[i] = cos(i * _radResolution);
for (int i = 1; i < _nPoints / 4; i++)
- _table[_nPoints / 2 - i] = _table[i];
+ _tableEOS[_nPoints / 2 - i] = _tableEOS[i];
}
float CosineTable::at(int index) const {
assert((index >= 0) && (index < _nPoints));
+ return _table[index];
+}
+
+float CosineTable::atLegacy(int index) const {
+ assert((index >= 0) && (index < _nPoints));
if (index < _refSize)
// [0,pi/2)
- return _table[index];
+ return _tableEOS[index];
if ((index > _refSize) && (index < 2 * _refSize))
// (pi/2,pi)
- return -_table[2 * _refSize - index];
+ return -_tableEOS[2 * _refSize - index];
if ((index >= 2 * _refSize) && (index < 3 * _refSize))
// [pi,3/2pi)
- return -_table[index - 2 * _refSize];
+ return -_tableEOS[index - 2 * _refSize];
if ((index > 3 * _refSize) && (index < _nPoints))
// (3/2pi,2pi)
- return _table[_nPoints - index];
+ return _tableEOS[_nPoints - index];
return 0.0f; // cos(pi/2) and cos(3pi/2) = 0
}
CosineTable::~CosineTable() {
+ delete[] _tableEOS;
delete[] _table;
}
diff --git a/common/cosinetables.h b/common/cosinetables.h
index ac0aef8f60..65cfc2e6b9 100644
--- a/common/cosinetables.h
+++ b/common/cosinetables.h
@@ -46,15 +46,23 @@ public:
* - Entries (excluding) nPoints/4 up to nPoints/2:
* (excluding) cos(3/2*pi) till (excluding) cos(2*pi)
*/
- const float *getTable() { return _table; }
+ const float *getTable() { return _tableEOS; }
/**
* Returns cos(2*pi * index / nPoints )
* Index must be in range [0, nPoints - 1]
+ * Faster than atLegacy
*/
float at(int index) const;
+ /**
+ * Returns cos(2*pi * index / nPoints )
+ * Index must be in range [0, nPoints - 1]
+ */
+ float atLegacy(int index) const;
+
private:
+ float *_tableEOS;
float *_table;
double _radResolution; // Smallest radian increment
int _refSize; // _nPoints / 4
diff --git a/common/sinetables.cpp b/common/sinetables.cpp
index 1dce529d7d..4c0ee626e3 100644
--- a/common/sinetables.cpp
+++ b/common/sinetables.cpp
@@ -34,39 +34,48 @@ SineTable::SineTable(int nPoints) {
_nPoints = nPoints;
_radResolution = 2.0 * M_PI / _nPoints;
_refSize = _nPoints / 4;
- _table = new float[_nPoints / 2];
+ _tableEOS = new float[_nPoints / 2];
+ _table = new float[_nPoints];
+
+ for (int i = 0; i < _nPoints; i++)
+ _table[i] = sin(i * _radResolution);
// Table contains sin(2*pi*i/_nPoints) for 0<=i<_nPoints/4,
// followed by _nPoints/2<=i<3_nPoints/4
for (int i = 0; i < _nPoints / 4; i++)
- _table[i] = sin(i * _radResolution);
+ _tableEOS[i] = sin(i * _radResolution);
for (int i = 0; i < _nPoints / 4; i++)
- _table[_nPoints / 4 + i] = -_table[i];
+ _tableEOS[_nPoints / 4 + i] = -_tableEOS[i];
+}
+float SineTable::at(int index) const {
+ assert((index >= 0) && (index < _nPoints));
+ return _table[index];
}
-float SineTable::at(int index) const {
+float SineTable::atLegacy(int index) const {
assert((index >= 0) && (index < _nPoints));
if (index < _refSize)
// [0,pi/2)
- return _table[index];
+ return _tableEOS[index];
if (index == _refSize)
// pi/2
return 1.0f; // sin(pi/2) = 1.0
if ((index > _refSize) && (index < 2 * _refSize))
// (pi/2,pi)
- return _table[2 * _refSize - index];
+ return _tableEOS[2 * _refSize - index];
if ((index >= 2 * _refSize) && (index < 3 * _refSize))
// [pi,3/2pi)
- return -_table[index - 2 * _refSize];
+ return -_tableEOS[index - 2 * _refSize];
if ((index > 3 * _refSize) && (index < _nPoints))
// (3/2pi,2pi)
- return -_table[_nPoints - index];
+ return -_tableEOS[_nPoints - index];
return -1.0f; // sin(3pi/2) = -1.0
}
SineTable::~SineTable() {
+ delete[] _tableEOS;
delete[] _table;
}
diff --git a/common/sinetables.h b/common/sinetables.h
index 5a5f246467..bd030ca833 100644
--- a/common/sinetables.h
+++ b/common/sinetables.h
@@ -46,15 +46,23 @@ public:
* - Entries 2_nPoints/4 up to nPoints/2:
* sin(pi) till (excluding) sin(3/2*pi)
*/
- const float *getTable() { return _table; }
+ const float *getTable() { return _tableEOS; }
/**
* Returns sin(2*pi * index / nPoints )
* Index must be in range [0, nPoints - 1]
+ * Faster than atLegacy
*/
float at(int index) const;
+ /**
+ * Returns sin(2*pi * index / nPoints )
+ * Index must be in range [0, nPoints - 1]
+ */
+ float atLegacy(int index) const;
+
private:
+ float *_tableEOS;
float *_table;
double _radResolution; // Smallest radian increment
int _refSize; // _nPoints / 4