summaryrefslogtreecommitdiff
path: root/gtk2_ardour/fft.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-06-04 14:41:50 +0200
committerRobin Gareus <robin@gareus.org>2019-06-04 14:41:50 +0200
commit69194df4d9a2f985423eca7d44c3d3292cc8baad (patch)
tree14c551972551e8ade0091d4fdfaf3ae21ee32d85 /gtk2_ardour/fft.cc
parentdba3ff5236b68dbe3503a6826a8c471dbc59baf0 (diff)
Transfer Fn: skip phase calculation for silence and small signal levels
This fixes some division by zero as well as rounding issues for signals < -160dBFS, resulting in garbage being displayed..
Diffstat (limited to 'gtk2_ardour/fft.cc')
-rw-r--r--gtk2_ardour/fft.cc15
1 files changed, 9 insertions, 6 deletions
diff --git a/gtk2_ardour/fft.cc b/gtk2_ardour/fft.cc
index 2d44328759..e07aed6c59 100644
--- a/gtk2_ardour/fft.cc
+++ b/gtk2_ardour/fft.cc
@@ -79,12 +79,15 @@ FFT::analyze(ARDOUR::Sample *input, WindowingType windowing_type)
for (uint32_t i = 1; i < _data_size - 1; ++i) {
power = (Re * Re) + (Im * Im);
- phase = atanf(Im / Re);
-
- if (Re < 0.0 && Im > 0.0) {
- phase += M_PI;
- } else if (Re < 0.0 && Im < 0.0) {
- phase -= M_PI;
+ if (power < 1e-16) {
+ phase = 0;
+ } else {
+ phase = atanf (Im / Re);
+ if (Re < 0.0 && Im > 0.0) {
+ phase += M_PI;
+ } else if (Re < 0.0 && Im < 0.0) {
+ phase -= M_PI;
+ }
}
_power_at_bin[i] += power;