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; }
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; }
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; }