Exemple #1
0
Error_t
VectorMinVI(float* value, unsigned* index, const float* src, unsigned length)
{
    
#ifdef __APPLE__
    // Use the Accelerate framework if we have it
    vDSP_minvi(src, 1, value, (unsigned long*)index, length);
#else
    float res = src[0];
    for (unsigned i = 0; i < length; ++i)
    {
        if (src[i] < res)
        {
            *value = res = src[i];
            *index = i;
        }
    }
#endif
    return NOERR;
}
Exemple #2
0
uint_t
fvec_min_elem (fvec_t * s)
{
#ifndef HAVE_ACCELERATE
  uint_t j, pos = 0.;
  smpl_t tmp = s->data[0];
  for (j = 0; j < s->length; j++) {
    pos = (tmp < s->data[j]) ? pos : j;
    tmp = (tmp < s->data[j]) ? tmp : s->data[j];
  }
#else
  smpl_t tmp = 0.;
  uint_t pos = 0.;
#if !HAVE_AUBIO_DOUBLE
  vDSP_minvi(s->data, 1, &tmp, (vDSP_Length *)&pos, s->length);
#else
  vDSP_minviD(s->data, 1, &tmp, (vDSP_Length *)&pos, s->length);
#endif
#endif
  return pos;
}
Exemple #3
0
Float32 DTW32_getSimilarityScore(DTW32 *self,
                                 Float32 *inputData,
                                 size_t inputRowCount,
                                 Float32 *comparisonData,
                                 size_t comparisonDataRowCount,
                                 size_t currentColumnCount)
{
    
//    Float32_printContiguous2DArray(inputData, inputRowCount, currentColumnCount, "input");
//    Float32_printContiguous2DArray(comparisonData, comparisonDataRowCount, currentColumnCount, "compare");

    Float32 similarity = INFINITY;
    self->currentInputRowCount = inputRowCount;
    self->currentComparisonDataRowCount = comparisonDataRowCount;
    vDSP_vsq(inputData, 1, self->inputTemp, 1, inputRowCount * currentColumnCount);
    vDSP_vsq(comparisonData, 1, self->comparisonDataTemp, 1, comparisonDataRowCount * currentColumnCount);
    

    
    vDSP_mtrans(self->inputTemp, 1, self->multiplicationTemp, 1, currentColumnCount, inputRowCount);
    vDSP_mmul(self->ones, 1, self->multiplicationTemp, 1, self->inputTemp, 1, 1, inputRowCount, currentColumnCount);
    
    vDSP_mtrans(self->comparisonDataTemp, 1, self->multiplicationTemp, 1, currentColumnCount, comparisonDataRowCount);
    vDSP_mmul(self->ones, 1, self->multiplicationTemp, 1, self->comparisonDataTemp, 1, 1, comparisonDataRowCount, currentColumnCount);
    
    const int elementCountInput = (int)inputRowCount;
    const int elementCountComparisonData = (int)comparisonDataRowCount;
    
    vvsqrtf(self->inputTemp, self->inputTemp, &elementCountInput);
    vvsqrtf(self->comparisonDataTemp, self->comparisonDataTemp, &elementCountComparisonData);
 
    cblas_sgemm(CblasRowMajor,
                CblasNoTrans,
                CblasTrans,
                (SInt32)inputRowCount,
                (SInt32)comparisonDataRowCount,
                1,
                1.0,
                self->inputTemp,
                1,
                self->comparisonDataTemp,
                1,
                0.,
                self->normalisationMatrix,
                (SInt32)comparisonDataRowCount);
    
    cblas_sgemm(CblasRowMajor,
                CblasNoTrans,
                CblasTrans,
                (SInt32)inputRowCount,
                (SInt32)comparisonDataRowCount,
                (SInt32)currentColumnCount,
                1.0,
                inputData,
                (SInt32)currentColumnCount,
                comparisonData,
                (SInt32)currentColumnCount,
                0.,
                self->distanceMatrix,
                (SInt32)comparisonDataRowCount);
    
    vDSP_vdiv(self->normalisationMatrix, 1, self->distanceMatrix, 1, self->distanceMatrix, 1, inputRowCount * comparisonDataRowCount);
    
//    Float32_printContiguous2DArray(self->distanceMatrix, inputRowCount, comparisonDataRowCount, "norm");

    
    Float32 minusOne =  -1.f;

    vDSP_vsma(self->distanceMatrix, 1, &minusOne, self->ones, 1, self->distanceMatrix, 1, inputRowCount * comparisonDataRowCount);

//    Float32_printContiguous2DArray(self->distanceMatrix, inputRowCount, comparisonDataRowCount, "norm");

    
    vDSP_mmov(self->distanceMatrix, &self->globalDistanceMatrix[comparisonDataRowCount + 2], comparisonDataRowCount, inputRowCount, comparisonDataRowCount, comparisonDataRowCount + 1);


    Float32 nan = NAN;
    
    vDSP_vfill(&nan, &self->globalDistanceMatrix[1], 1, comparisonDataRowCount);
    vDSP_vfill(&nan, &self->globalDistanceMatrix[comparisonDataRowCount + 1], comparisonDataRowCount + 1, inputRowCount);
    
    Float32 comparisonArray[3] = {0};
    

    
    for (size_t i = 0; i < inputRowCount; ++i) {
        
        for (size_t j = 0; j < comparisonDataRowCount; ++j) {
            
            comparisonArray[0] = self->globalDistanceMatrix[i * (comparisonDataRowCount + 1) + j];
            comparisonArray[1] = self->globalDistanceMatrix[i * (comparisonDataRowCount + 1) + (j + 1)];
            comparisonArray[2] = self->globalDistanceMatrix[(i + 1) * (comparisonDataRowCount + 1) + j];
            
            
            Float32 dmax;
            size_t index;
            vDSP_minvi(comparisonArray, 1, &dmax, &index, 3);
            self->phi[(i * comparisonDataRowCount) + j] = index + 1;
            
            
            self->globalDistanceMatrix[(i + 1) * (comparisonDataRowCount + 1) + (j + 1)] = self->globalDistanceMatrix[(i + 1) * (comparisonDataRowCount + 1) + (j + 1)] + dmax;
            
        }
    }
    

    
    similarity = self->globalDistanceMatrix[(comparisonDataRowCount + 1) * (inputRowCount + 1) - 1];
        
    return similarity;
}