diff options
| author | drowe67 <[email protected]> | 2023-07-20 08:59:48 +0930 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-20 08:59:48 +0930 |
| commit | 06d4c11e699b0351765f10398abb4f663a984f36 (patch) | |
| tree | 33e22af0814c5b6c3d676f096ae8c2ac8a3ed9f0 /src/mbest.c | |
| parent | 6588e77f38bdebd7adffe091b22e7760d95d0ccb (diff) | |
| parent | 4d6c143c0abec15e1d6ed1fd95d36f80e6cb7df8 (diff) | |
Merge pull request #3 from drowe67/dr-cleanup21.2.0
Cleanup Part 2
Diffstat (limited to 'src/mbest.c')
| -rw-r--r-- | src/mbest.c | 206 |
1 files changed, 100 insertions, 106 deletions
diff --git a/src/mbest.c b/src/mbest.c index 8651e70..9c1a6c5 100644 --- a/src/mbest.c +++ b/src/mbest.c @@ -27,50 +27,47 @@ */ +#include "mbest.h" + #include <assert.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include "mbest.h" - struct MBEST *mbest_create(int entries) { - int i,j; - struct MBEST *mbest; + int i, j; + struct MBEST *mbest; - assert(entries > 0); - mbest = (struct MBEST *)malloc(sizeof(struct MBEST)); - assert(mbest != NULL); + assert(entries > 0); + mbest = (struct MBEST *)malloc(sizeof(struct MBEST)); + assert(mbest != NULL); - mbest->entries = entries; - mbest->list = (struct MBEST_LIST *)malloc(entries*sizeof(struct MBEST_LIST)); - assert(mbest->list != NULL); + mbest->entries = entries; + mbest->list = + (struct MBEST_LIST *)malloc(entries * sizeof(struct MBEST_LIST)); + assert(mbest->list != NULL); - for(i=0; i<mbest->entries; i++) { - for(j=0; j<MBEST_STAGES; j++) - mbest->list[i].index[j] = 0; - mbest->list[i].error = 1E32; - } + for (i = 0; i < mbest->entries; i++) { + for (j = 0; j < MBEST_STAGES; j++) mbest->list[i].index[j] = 0; + mbest->list[i].error = 1E32; + } - return mbest; + return mbest; } - void mbest_destroy(struct MBEST *mbest) { - assert(mbest != NULL); - free(mbest->list); - free(mbest); + assert(mbest != NULL); + free(mbest->list); + free(mbest); } - /* apply weighting to VQ for efficient VQ search */ void mbest_precompute_weight(float cb[], float w[], int k, int m) { - for (int j=0; j<m; j++) { - for(int i=0; i<k; i++) - cb[k*j+i] *= w[i]; - } + for (int j = 0; j < m; j++) { + for (int i = 0; i < k; i++) cb[k * j + i] *= w[i]; + } } /*---------------------------------------------------------------------------*\ @@ -84,33 +81,32 @@ void mbest_precompute_weight(float cb[], float w[], int k, int m) { \*---------------------------------------------------------------------------*/ void mbest_insert(struct MBEST *mbest, int index[], float error) { - int i, found; - struct MBEST_LIST *list = mbest->list; - int entries = mbest->entries; - - found = 0; - for(i=0; i<entries && !found; i++) - if (error < list[i].error) { - found = 1; - memmove(&list[i+1], &list[i], sizeof(struct MBEST_LIST) * (entries - i - 1)); - memcpy(&list[i].index[0], &index[0], sizeof(int) * MBEST_STAGES); - list[i].error = error; - } + int i, found; + struct MBEST_LIST *list = mbest->list; + int entries = mbest->entries; + + found = 0; + for (i = 0; i < entries && !found; i++) + if (error < list[i].error) { + found = 1; + memmove(&list[i + 1], &list[i], + sizeof(struct MBEST_LIST) * (entries - i - 1)); + memcpy(&list[i].index[0], &index[0], sizeof(int) * MBEST_STAGES); + list[i].error = error; + } } - void mbest_print(char title[], struct MBEST *mbest) { - int i,j; - - fprintf(stderr, "%s\n", title); - for(i=0; i<mbest->entries; i++) { - for(j=0; j<MBEST_STAGES; j++) - fprintf(stderr, " %4d ", mbest->list[i].index[j]); - fprintf(stderr, " %f\n", (double)mbest->list[i].error); - } + int i, j; + + fprintf(stderr, "%s\n", title); + for (i = 0; i < mbest->entries; i++) { + for (j = 0; j < MBEST_STAGES; j++) + fprintf(stderr, " %4d ", mbest->list[i].index[j]); + fprintf(stderr, " %f\n", (double)mbest->list[i].error); + } } - /*---------------------------------------------------------------------------*\ mbest_search @@ -120,49 +116,47 @@ void mbest_print(char title[], struct MBEST *mbest) { \*---------------------------------------------------------------------------*/ -void mbest_search( - const float *cb, /* VQ codebook to search */ - float vec[], /* target vector */ - int k, /* dimension of vector */ - int m, /* number on entries in codebook */ - struct MBEST *mbest, /* list of closest matches */ - int index[] /* indexes that lead us here */ -) -{ - int j; - - /* note weighting can be applied externally by modifiying cb[] and vec: - - float e = 0.0; - for(i=0; i<k; i++) - e += pow(w[i]*(cb[j*k+i] - vec[i]),2.0) - - | - \|/ - - for(i=0; i<k; i++) - e += pow(w[i]*cb[j*k+i] - w[i]*vec[i]),2.0) - - | - \|/ - - for(i=0; i<k; i++) - e += pow(cb1[j*k+i] - vec1[i]),2.0) - - where cb1[j*k+i] = w[i]*cb[j*k+i], and vec1[i] = w[i]*vec[i] - */ - - for(j=0; j<m; j++) { - float e = 0.0; - for(int i=0; i<k; i++) { - float diff = *cb++ - vec[i]; - e += diff*diff; - } - - index[0] = j; - if (e < mbest->list[mbest->entries - 1].error) - mbest_insert(mbest, index, e); +void mbest_search(const float *cb, /* VQ codebook to search */ + float vec[], /* target vector */ + int k, /* dimension of vector */ + int m, /* number on entries in codebook */ + struct MBEST *mbest, /* list of closest matches */ + int index[] /* indexes that lead us here */ +) { + int j; + + /* note weighting can be applied externally by modifying cb[] and vec: + + float e = 0.0; + for(i=0; i<k; i++) + e += pow(w[i]*(cb[j*k+i] - vec[i]),2.0) + + | + \|/ + + for(i=0; i<k; i++) + e += pow(w[i]*cb[j*k+i] - w[i]*vec[i]),2.0) + + | + \|/ + + for(i=0; i<k; i++) + e += pow(cb1[j*k+i] - vec1[i]),2.0) + + where cb1[j*k+i] = w[i]*cb[j*k+i], and vec1[i] = w[i]*vec[i] + */ + + for (j = 0; j < m; j++) { + float e = 0.0; + for (int i = 0; i < k; i++) { + float diff = *cb++ - vec[i]; + e += diff * diff; } + + index[0] = j; + if (e < mbest->list[mbest->entries - 1].error) + mbest_insert(mbest, index, e); + } } /*---------------------------------------------------------------------------*\ @@ -174,24 +168,24 @@ void mbest_search( \*---------------------------------------------------------------------------*/ -void mbest_search450(const float *cb, float vec[], float w[], int k,int shorterK, int m, struct MBEST *mbest, int index[]) +void mbest_search450(const float *cb, float vec[], float w[], int k, + int shorterK, int m, struct MBEST *mbest, int index[]) { - float e; - int i,j; - float diff; - - for(j=0; j<m; j++) { - e = 0.0; - for(i=0; i<k; i++) { - //Only search first NEWAMP2_K Vectors - if(i<shorterK){ - diff = cb[j*k+i]-vec[i]; - e += diff*w[i] * diff*w[i]; - } - } - index[0] = j; - mbest_insert(mbest, index, e); + float e; + int i, j; + float diff; + + for (j = 0; j < m; j++) { + e = 0.0; + for (i = 0; i < k; i++) { + // Only search first NEWAMP2_K Vectors + if (i < shorterK) { + diff = cb[j * k + i] - vec[i]; + e += diff * w[i] * diff * w[i]; + } } + index[0] = j; + mbest_insert(mbest, index, e); + } } - |
