diff options
| author | Author Name <[email protected]> | 2023-07-07 12:20:59 +0930 |
|---|---|---|
| committer | David Rowe <[email protected]> | 2023-07-07 12:29:06 +0930 |
| commit | ac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch) | |
| tree | a2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /misc/extract.c | |
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'misc/extract.c')
| -rw-r--r-- | misc/extract.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/misc/extract.c b/misc/extract.c new file mode 100644 index 0000000..b4f38db --- /dev/null +++ b/misc/extract.c @@ -0,0 +1,117 @@ +/* + extract.c + david Rowe Jan 2019 + + Extracts sub sets of vectors from .f32 files, used for LPCNet VQ experiments. +*/ + +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <getopt.h> + +#define NB_FEATURES 55 /* number of cols per row */ + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + int st = 0; + int en = 17; + int stride = NB_FEATURES; + float gain = 1.0; + int frame_delay = 1; + float pred = 0.0; + int removemean = 0; + float lower = -1E32; + + static struct option long_options[] = { + {"startcol", required_argument, 0, 's'}, + {"endcol", required_argument, 0, 'e'}, + {"stride", required_argument, 0, 't'}, + {"gain", required_argument, 0, 'g'}, + {"pred", required_argument, 0, 'p'}, + {"delay", required_argument, 0, 'd'}, + {"removemean", no_argument, 0, 'm'}, + {"lower", required_argument, 0, 'l'}, + {0, 0, 0, 0} + }; + + int opt_index = 0; + int c; + + while ((c = getopt_long (argc, argv, "s:e:t:g:p:d:ml:", long_options, &opt_index)) != -1) { + switch (c) { + case 's': + st = atoi(optarg); + break; + case 'e': + en = atoi(optarg); + break; + case 't': + stride = atoi(optarg); + break; + case 'g': + gain = atof(optarg); + break; + case 'p': + pred = atof(optarg); + break; + case 'd': + frame_delay = atoi(optarg); + break; + case 'm': + removemean = 1; + break; + case 'l': + lower = atof(optarg); + break; + default: + helpmsg: + fprintf(stderr, "usage: %s -s startCol -e endCol [-t strideCol -g gain -p predCoeff -d framesDelay --removemean --lower] input.f32 output.f32\n", argv[0]); + exit(1); + } + } + if ( (argc - optind) < 2) { + fprintf(stderr, "Too few arguments\n"); + goto helpmsg; + } + + fin = fopen(argv[optind],"rb"); assert(fin != NULL); + fout = fopen(argv[optind+1],"wb"); assert(fout != NULL); + printf("extracting from %d to %d inclusive (stride %d) ... gain = %f pred = %f frame_delay = %d\n", + st, en, stride, gain, pred, frame_delay); + + float features[stride], features_prev[frame_delay][stride], delta[stride]; + int i,f,wr=0; + + for (f=0; f<frame_delay; f++) + for(i=0; i<stride; i++) + features_prev[f][i] = 0.0; + + while((fread(features, sizeof(float), stride, fin) == stride)) { + float mean = 0.0; + for(i=st; i<=en; i++) + mean += features[i]; + mean /= (en-st+1); + if (removemean) { + for(i=st; i<=en; i++) + features[i] -= mean; + } + for(i=st; i<=en; i++) { + delta[i] = gain*(features[i] - pred*features_prev[frame_delay-1][i]); + } + if (mean > lower) { + fwrite(&delta[st], sizeof(float), en-st+1, fout); + wr++; + } + for (f=frame_delay-1; f>0; f--) + for(i=0; i<stride; i++) + features_prev[f][i] = features_prev[f-1][i]; + for(i=0; i<stride; i++) + features_prev[0][i] = features[i]; + } + + fclose(fin); fclose(fout); + fprintf(stderr, "%d extracted\n", wr); + return 0; +} + |
