//******************************************************************* // ilEuclidNorm // normalizes vectors of dim=n in mxn input matrix with the // Euclidean norm //******************************************************************* void ilEuclidNorm(pMat const& src, pMat dst) { int m = src->rows; int n = src->cols; int type = src->type; pMat ones = CreateMat(n, 1, type); pMat res1 = CreateMat(m, n, type); pMat norm = CreateMat(m, 1, type); SetValue(ones, cvScalar(1.0)); //*** compute the norm Multiply(src, src, res1); MatrixMultiply(res1, ones, norm); PowerMatrix(norm, norm, .5); //*** normalize columns of src #if 0 //*** matrix version pMat normmat = CreateMat(m, n, CV_32FC1); pMat onesrow = CreateMat(1, n, CV_32FC1); SetValue(onesrow, cvScalar(1.0)); MatrixMultiply(norm, onesrow, normmat); Divide(src, normmat, dst); #endif #if 1 // *** column version CvMat colmat1 = cvMat(0, 0, 0, 0); CvMat colmat2 = cvMat(0, 0, 0, 0); for (int i = 0; i<n; ++i) { cvGetCol(src.get(), &colmat1, i); cvGetCol(dst.get(), &colmat2, i); Divide(dummyGuard(&colmat1), norm, dummyGuard(&colmat2)); } #endif }
//------------------------------------------------------ // Spectrum Matrix Analysis Drive //------------------------------------------------------ void ArtStoryCore::SpectrumMatrixAnalysis(){ /* Available Infos: melodyStoragesVec */ float max, min; PowerMatrix(NormalizationPower); //power up and normalize GetMatrixMaxMin(max, min); //shifts to ensure all zero or positive ScalerAddMatrix(-min); //integrate HighFreqCompensation inside //HighFreqCompensation(); //BandedNormalizeMatrix(FrequencyBandSeparatorVec); //integrate HardDecisionPolarizeRule //HardDecisionPolarizeRule(dynamicThreshold,valueBottom,valueTop); // hard decision rule StepFreRegistration(); //Including the Tone Translation };
//************************************************************************ // ilEuclidDist // Computes Euclidean distance between sets of points in src1 and src2. // src1 is m1*n array; src2 is m2*n array where m1 and m2 are // the number of points in each set and n is the dimensionality // of the Euclidean space. The result dst is an m1*m2 matrix // with distances between all pairs of points. // If m1=m2=1 Euclidean distance between two vectors is computed. //************************************************************************ void ilEuclidDist(pMat const& src1, pMat const& src2, pMat dst) { int m1 = src1->rows; int m2 = src2->rows; int n = src1->cols; int type=src1->type; #if 0 //*** matrix version pMat ones_nm2 = CreateMat(n, m2, type); pMat ones_m1n = CreateMat(m1, n, type); pMat src1sq = CreateMat(m1, n, type); pMat src2sq = CreateMat(m2, n, type); pMat res1 = CreateMat(m1, m2, type); pMat res2 = CreateMat(m1, m2, type); Multiply(src1, src1, src1sq); Multiply(src2, src2, src2sq); SetValue(ones_nm2, cvScalar(1.0)); SetValue(ones_m1n, cvScalar(1.0)); //*** Euclidean distance with matrix multiplications MatrixMultiply(src1sq, ones_nm2, res1); GEMM(ones_m1n, src2sq, 1.0, res1, 1, res2, CV_GEMM_B_T); GEMM(src1, src2, -2.0, res2, 1, dst, CV_GEMM_B_T); PowerMatrix(dst, dst, .5); #endif #if 1 //*** element-wise version pMat src1sq = CreateMat(m1, n, type); pMat src2sq = CreateMat(m2, n, type); Multiply(src1, src1, src1sq); Multiply(src2, src2, src2sq); float *ptrsrc1sq, *ptrsrc2sq, *ptrdst; ptrsrc1sq = Ptr2D<float>(src1sq); ptrsrc2sq = Ptr2D<float>(src2sq); ptrdst = Ptr2D<float>(dst); int indsrc1sq, indsrc2sq, inddst=0; float v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, vdst; for(int i = 0; i<m1; ++i) { indsrc1sq = i * n; v0 = ptrsrc1sq[indsrc1sq + 0]; v1 = ptrsrc1sq[indsrc1sq + 1]; v2 = ptrsrc1sq[indsrc1sq + 2]; v3 = ptrsrc1sq[indsrc1sq + 3]; v4 = ptrsrc1sq[indsrc1sq + 4]; v5 = ptrsrc1sq[indsrc1sq + 5]; v6 = ptrsrc1sq[indsrc1sq + 6]; v7 = ptrsrc1sq[indsrc1sq + 7]; v8 = ptrsrc1sq[indsrc1sq + 8]; v9 = ptrsrc1sq[indsrc1sq + 9]; for (int j=0; j<m2; ++j) { inddst = i * m2 + j; indsrc2sq = j * n; vdst = (v0-ptrsrc2sq[indsrc2sq]) * (v0-ptrsrc2sq[indsrc2sq]); vdst += (v1-ptrsrc2sq[indsrc2sq+1]) * (v1-ptrsrc2sq[indsrc2sq+1]); vdst += (v2-ptrsrc2sq[indsrc2sq+2]) * (v2-ptrsrc2sq[indsrc2sq+2]); vdst += (v3-ptrsrc2sq[indsrc2sq+3]) * (v3-ptrsrc2sq[indsrc2sq+3]); vdst += (v4-ptrsrc2sq[indsrc2sq+4]) * (v4-ptrsrc2sq[indsrc2sq+4]); vdst += (v5-ptrsrc2sq[indsrc2sq+5]) * (v5-ptrsrc2sq[indsrc2sq+5]); vdst += (v6-ptrsrc2sq[indsrc2sq+6]) * (v6-ptrsrc2sq[indsrc2sq+6]); vdst += (v7-ptrsrc2sq[indsrc2sq+7]) * (v7-ptrsrc2sq[indsrc2sq+7]); vdst += (v8-ptrsrc2sq[indsrc2sq+8]) * (v8-ptrsrc2sq[indsrc2sq+8]); vdst += (v9-ptrsrc2sq[indsrc2sq+9]) * (v9-ptrsrc2sq[indsrc2sq+9]); ptrdst[inddst] = vdst; } } #endif }