changeset 10:960868d5f841 track

Vertical filtering
author Chris Cannam
date Tue, 26 Jun 2012 15:30:12 +0100
parents 0510372cb340
children 0c95dc49163a
files CepstrumPitchTracker.cpp CepstrumPitchTracker.h SimpleCepstrum.cpp SimpleCepstrum.h
diffstat 4 files changed, 55 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/CepstrumPitchTracker.cpp	Mon Jun 25 16:35:38 2012 +0100
+++ b/CepstrumPitchTracker.cpp	Tue Jun 26 15:30:12 2012 +0100
@@ -38,7 +38,8 @@
     m_blockSize(1024),
     m_fmin(50),
     m_fmax(1000),
-    m_histlen(3),
+    m_histlen(1),
+    m_vflen(3),
     m_binFrom(0),
     m_binTo(0),
     m_bins(0),
@@ -246,7 +247,17 @@
     }
 
     for (int i = 0; i < m_bins; ++i) {
-        m_history[hix][i] = cep[i + m_binFrom];
+        double v = 0;
+        int n = 0;
+        // average according to the vertical filter length
+        for (int j = -m_vflen/2; j <= m_vflen/2; ++j) {
+            int ix = i + m_binFrom + j;
+            if (ix >= 0 && ix < m_blockSize) {
+                v += cep[ix];
+                ++n;
+            }
+        }
+        m_history[hix][i] = v / n;
     }
 
     for (int i = 0; i < m_bins; ++i) {
--- a/CepstrumPitchTracker.h	Mon Jun 25 16:35:38 2012 +0100
+++ b/CepstrumPitchTracker.h	Tue Jun 26 15:30:12 2012 +0100
@@ -69,6 +69,7 @@
     float m_fmin;
     float m_fmax;
     int m_histlen;
+    int m_vflen;
 
     int m_binFrom;
     int m_binTo;
--- a/SimpleCepstrum.cpp	Mon Jun 25 16:35:38 2012 +0100
+++ b/SimpleCepstrum.cpp	Tue Jun 26 15:30:12 2012 +0100
@@ -38,7 +38,8 @@
     m_blockSize(1024),
     m_fmin(50),
     m_fmax(1000),
-    m_histlen(3),
+    m_histlen(1),
+    m_vflen(1),
     m_clamp(false),
     m_method(InverseSymmetric),
     m_binFrom(0),
@@ -159,11 +160,22 @@
     d.unit = "";
     d.minValue = 1;
     d.maxValue = 10;
-    d.defaultValue = 3;
+    d.defaultValue = 1;
     d.isQuantized = true;
     d.quantizeStep = 1;
     list.push_back(d);
 
+    d.identifier = "vflen";
+    d.name = "Vertical filter length";
+    d.description = "";
+    d.unit = "";
+    d.minValue = 1;
+    d.maxValue = 11;
+    d.defaultValue = 1;
+    d.isQuantized = true;
+    d.quantizeStep = 2;
+    list.push_back(d);
+
     d.identifier = "method";
     d.name = "Cepstrum transform method";
     d.unit = "";
@@ -179,6 +191,17 @@
     d.valueNames.push_back("Forward difference");
     list.push_back(d);
 
+    d.identifier = "clamp";
+    d.name = "Clamp negative values in cepstrum at zero";
+    d.unit = "";
+    d.minValue = 0;
+    d.maxValue = 1;
+    d.defaultValue = 0;
+    d.isQuantized = true;
+    d.quantizeStep = 1;
+    d.valueNames.clear();
+    list.push_back(d);
+
     return list;
 }
 
@@ -188,6 +211,8 @@
     if (identifier == "fmin") return m_fmin;
     else if (identifier == "fmax") return m_fmax;
     else if (identifier == "histlen") return m_histlen;
+    else if (identifier == "vflen") return m_vflen;
+    else if (identifier == "clamp") return (m_clamp ? 1 : 0);
     else if (identifier == "method") return (int)m_method;
     else return 0.f;
 }
@@ -198,6 +223,8 @@
     if (identifier == "fmin") m_fmin = value;
     else if (identifier == "fmax") m_fmax = value;
     else if (identifier == "histlen") m_histlen = value;
+    else if (identifier == "vflen") m_vflen = value;
+    else if (identifier == "clamp") m_clamp = (value > 0.5);
     else if (identifier == "method") m_method = Method(int(value + 0.5));
 }
 
@@ -389,7 +416,17 @@
     }
 
     for (int i = 0; i < m_bins; ++i) {
-        m_history[hix][i] = cep[i + m_binFrom];
+        double v = 0;
+        int n = 0;
+        // average according to the vertical filter length
+        for (int j = -m_vflen/2; j <= m_vflen/2; ++j) {
+            int ix = i + m_binFrom + j;
+            if (ix >= 0 && ix < m_blockSize) {
+                v += cep[ix];
+                ++n;
+            }
+        }
+        m_history[hix][i] = v / n;
     }
 
     for (int i = 0; i < m_bins; ++i) {
--- a/SimpleCepstrum.h	Mon Jun 25 16:35:38 2012 +0100
+++ b/SimpleCepstrum.h	Tue Jun 26 15:30:12 2012 +0100
@@ -69,6 +69,7 @@
     float m_fmin;
     float m_fmax;
     int m_histlen;
+    int m_vflen;
     bool m_clamp;
 
     enum Method {