示例#1
0
//*******************************************************************
// 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
};
示例#3
0
//************************************************************************
// 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
}