changeset 27:5435f00a4103

Almost finish normalising kernel and storing it sparsely
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 04 Nov 2013 18:17:26 +0000
parents a5f71b5c9f85
children cf772e2d3ab0
files cpp-qm-dsp/CQKernel.cpp yeti/cqtkernel.yeti
diffstat 2 files changed, 67 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/cpp-qm-dsp/CQKernel.cpp	Mon Nov 04 17:51:27 2013 +0000
+++ b/cpp-qm-dsp/CQKernel.cpp	Mon Nov 04 18:17:26 2013 +0000
@@ -119,7 +119,8 @@
                 if (sqrt(rout[j] * rout[j] + iout[j] * iout[j]) < thresh) {
                     row.push_back(C(0, 0));
                 } else {
-                    row.push_back(C(rout[j], iout[j]));
+                    row.push_back(C(rout[j] / m_p.fftSize,
+                                    iout[j] / m_p.fftSize));
                 }
             }
 
@@ -171,13 +172,71 @@
         }
     }
 
-    vector<vector<C> > square;
-    // conjugate transpose of subset * subset
-    for (int j = 0; j < subset[0].size(); ++j) {
+    int nrows = subset.size();
+    int ncols = subset[0].size();
+    vector<vector<C> > square(ncols); // conjugate transpose of subset * subset
 
+    for (int i = 0; i < nrows; ++i) {
+        assert(subset[i].size() == ncols);
+    }
 
+    for (int j = 0; j < ncols; ++j) {
+        for (int i = 0; i < ncols; ++i) {
+            C v(0, 0);
+            for (int k = 0; k < nrows; ++k) {
+                v += subset[k][i] * conj(subset[k][j]);
+            }
+            square[i].push_back(v);
+        }
     }
-        
+
+    vector<double> wK;
+    double q = 1; //!!! duplicated from constructor
+    for (int i = round(1.0/q); i < ncols - round(1.0/q) - 2; ++i) {
+        wK.push_back(abs(square[i][i]));
+    }
+
+    double weight = double(m_p.fftHop) / m_p.fftSize;
+    weight /= MathUtilities::mean(wK.data(), wK.size());
+    weight = sqrt(weight);
+    
+    cerr << "weight = " << weight << endl;
+
+    KernelMatrix sk;
+
+    for (int i = 0; i < m_kernel.data.size(); ++i) {
+
+        sk.origin.push_back(0);
+        sk.data.push_back(vector<C>());
+
+        int lastNZ = 0;
+        for (int j = m_kernel.data[i].size()-1; j >= 0; --j) {
+            if (abs(m_kernel.data[i][j]) != 0.0) {
+                lastNZ = j;
+                break;
+            }
+        }
+
+        bool haveNZ = false;
+        for (int j = 0; j <= lastNZ; ++j) {
+            if (haveNZ || abs(m_kernel.data[i][j]) != 0.0) {
+                if (!haveNZ) sk.origin[i] = j;
+                haveNZ = true;
+                sk.data[i].push_back(m_kernel.data[i][j] * weight);
+            }
+        }
+    }
+
+    // diagnostic
+    int nnz = 0;
+    for (int i = 0; i < sk.data.size(); ++i) {
+        for (int j = 0; j < sk.data[i].size(); ++j) {
+            assert(sk.data[i][j] == m_kernel.data[i][sk.origin[i] + j]);
+        }
+    }
+    cerr << "nnz = " << nnz << endl;
+
+    m_kernel = sk;
 }
 
 
--- a/yeti/cqtkernel.yeti	Mon Nov 04 17:51:27 2013 +0000
+++ b/yeti/cqtkernel.yeti	Mon Nov 04 18:17:26 2013 +0000
@@ -92,12 +92,13 @@
     
     wx1 = vec.maxindex (complex.magnitudes (cm.getRow 0 kmat));
     wx2 = vec.maxindex (complex.magnitudes (cm.getRow (cm.height kmat - 1) kmat));
-    
+
     subset = cm.columnSlice kmat wx1 (wx2+1);
     square = cm.product (cm.conjugateTransposed subset) subset;
+
     diag = complex.magnitudes (cm.getDiagonal 0 square);
     wK = vec.slice diag (round(1/q)) (vec.length diag - round(1/q) - 2);
-    
+
     weight = (fftHop / fftSize) / (vec.mean (vec.abs wK));
     weight = sqrt(weight);