autoCrossCorrelationTables CrossCorrelationTables_and_Diagonalizer_diagonalize (CrossCorrelationTables me, Diagonalizer thee) { try { autoCrossCorrelationTables him = CrossCorrelationTables_create (); for (long i = 1; i <= my size; i++) { CrossCorrelationTable item = (CrossCorrelationTable) my item[i]; autoCrossCorrelationTable ct = CrossCorrelationTable_and_Diagonalizer_diagonalize (item, thee); Collection_addItem_move (him.peek(), ct.move()); } return him; } catch (MelderError) { Melder_throw (U"CrossCorrelationTables not diagonalized."); } }
/* * Generate n different cct's that have a common diagonalizer. */ autoCrossCorrelationTables CrossCorrelationTables_createTestSet (long dimension, long n, int firstPositiveDefinite, double sigma) { try { // Start with a square matrix with random gaussian elements and make its singular value decomposition UDV' // The V matrix will be the common diagonalizer matrix that we use. autoNUMmatrix<double> d (1, dimension, 1, dimension); for (long i = 1; i <= dimension; i++) { // Generate the rotation matrix for (long j = 1; j <= dimension; j++) { d[i][j] = NUMrandomGauss (0, 1); } } autoNUMmatrix<double> v (1, dimension, 1, dimension); autoSVD svd = SVD_create_d (d.peek(), dimension, dimension); autoCrossCorrelationTables me = CrossCorrelationTables_create (); for (long i = 1; i <= dimension; i++) { for (long j = 1; j <= dimension; j++) { d[i][j] = 0; } } // Start with a diagonal matrix D and calculate V'DV for (long k = 1; k <= n; k++) { autoCrossCorrelationTable ct = CrossCorrelationTable_create (dimension); double low = k == 1 && firstPositiveDefinite ? 0.1 : -1; for (long i = 1; i <= dimension; i++) { d[i][i] = NUMrandomUniform (low, 1); } for (long i = 1; i <= dimension; i++) { for (long j = 1; j <= dimension; j++) { v[i][j] = NUMrandomGauss (svd -> v[i][j], sigma); } } // we need V'DV, however our V has eigenvectors row-wise -> VDV' NUMdmatrices_multiply_VCVp (ct -> data, v.peek(), dimension, dimension, d.peek(), 1); Collection_addItem_move (me.peek(), ct.move()); } return me; } catch (MelderError) { Melder_throw (U"CrossCorrelationTables test set not created."); } }
autoCrossCorrelationTables Sound_to_CrossCorrelationTables (Sound me, double startTime, double endTime, double lagStep, long ncovars) { try { if (lagStep < my dx) { lagStep = my dx; } if (endTime <= startTime) { startTime = my xmin; endTime = my xmax; } if (startTime + ncovars * lagStep >= endTime) { Melder_throw (U"Lag time too large."); } autoCrossCorrelationTables thee = CrossCorrelationTables_create (); for (long i = 1; i <= ncovars; i++) { double lag = (i - 1) * lagStep; autoCrossCorrelationTable ct = Sound_to_CrossCorrelationTable (me, startTime, endTime, lag); Collection_addItem_move (thee.peek(), ct.move()); } return thee; } catch (MelderError) { Melder_throw (me, U": no CrossCorrelationTables created."); } }
Sound me = FIRST (Sound); PCA thee = FIRST (PCA); praat_new (Sound_and_PCA_projectChannels (me, thee, GET_INTEGER (L"Number of components")), Thing_getName (me), L"_projected"); END FORM (Sound_and_PCA_whitenChannels, L"Sound & PCA: To Sound (whiten channels)", 0) NATURAL (L"Number of components", L"10") OK DO Sound me = FIRST (Sound); PCA thee = FIRST (PCA); praat_new (Sound_and_PCA_whitenChannels (me, thee, GET_INTEGER (L"Number of components")), Thing_getName (me), L"_white"); END DIRECT (CrossCorrelationTable_to_CrossCorrelationTables) autoCrossCorrelationTables thee = CrossCorrelationTables_create (); long nrows = 0, ncols = 0, nselected = 0; LOOP { iam (CrossCorrelationTable); nselected++; if (nselected == 1) { nrows = my numberOfRows; ncols = my numberOfColumns; } if (my numberOfRows != nrows || my numberOfColumns != ncols) Melder_throw ("Dimensions of table ", IOBJECT, " differs from the rest."); autoCrossCorrelationTable myc = Data_copy (me); Collection_addItem (thee.peek(), myc.transfer()); } praat_new (thee.transfer(), L"ct_", Melder_integer (nselected)); END