From: drowe67 Date: Sat, 28 Jan 2017 21:12:19 +0000 (+0000) Subject: simple linear interpolator X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=03600d7b91438c5b0760f1896cf31083b5a79122;p=freetel-svn-tracking.git simple linear interpolator git-svn-id: https://svn.code.sf.net/p/freetel/code@3004 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/unittest/tlininterp.c b/codec2-dev/unittest/tlininterp.c new file mode 100644 index 00000000..1c5b2905 --- /dev/null +++ b/codec2-dev/unittest/tlininterp.c @@ -0,0 +1,79 @@ +/* + tlininterp.c + David Rowe + Jan 2017 + + Linear interpolator, CPU effecient way of getting large oversample + ratios, if the input is already limited to a fraction of the + input sampling rate. + + build: gcc tlininterp.c -o tlininterp -Wall -O2 + +*/ + +#include +#include +#include +#include +#include + +#define N 10000 /* processing buffer size */ + +void display_help(void) { + fprintf(stderr, "\nusage: tlininterp inputRawFile OutputRawFile OverSampleRatio [-c]\n"); + fprintf(stderr, "\nUse - for stdin/stdout\n\n"); + fprintf(stderr, "-c complex (two channel) resampling\n\n"); +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short left, right, out; + float oversample, t; + + if (argc < 3) { + display_help(); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) + fin = stdin; + else + fin = fopen(argv[1], "rb"); + assert(fin != NULL); + + if (strcmp(argv[2], "-") == 0) + fout = stdout; + else + fout = fopen(argv[2], "wb"); + assert(fout != NULL); + + oversample = atof(argv[3]); + + int channels = 1; + int opt; + while ((opt = getopt(argc, argv, "c")) != -1) { + switch (opt) { + case 'c': channels = 2; break; + default: + display_help(); + exit(1); + } + } + + left = 0; + t = 0.0; + while(fread(&right, sizeof(short), 1, fin) == 1) { + while (t < 1.0) { + out = (1.0 - t)*left + t*right; + fwrite(&out, sizeof(short), 1, fout); + t += 1.0/oversample; + } + t -= 1.0; + left = right; + } + + fclose(fout); + fclose(fin); + + return 0; +}