From 7deec0124eeeb6803e6a41c9874494025b535cdb Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sun, 6 Mar 2016 01:53:36 +0000 Subject: [PATCH] command line resampler, stiff debugging git-svn-id: https://svn.code.sf.net/p/freetel/code@2713 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/resample.c | 139 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 codec2-dev/src/resample.c diff --git a/codec2-dev/src/resample.c b/codec2-dev/src/resample.c new file mode 100644 index 00000000..b70205be --- /dev/null +++ b/codec2-dev/src/resample.c @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: resample.c + AUTHOR......: David Rowe + DATE CREATED: 5/3/2016 + + Resamples a stream of 16 bit shorts. + + $ gcc resample.c -o resample -lm -lsamplerate -Wall + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#define BUF_PERIOD 0.1 /* length of processingbuffer in seconds */ + +#include +#include +#include +#include +#include +#include + +/* returns number of output samples generated by resampling */ + +int resample(SRC_STATE *src, + short output_short[], + short input_short[], + int output_sample_rate, + int input_sample_rate, + int length_output_short, /* maximum output array length in samples */ + int length_input_short + ) +{ + SRC_DATA src_data; + float input[length_input_short]; + float output[length_output_short]; + int ret; + + assert(src != NULL); + + src_short_to_float_array(input_short, input, length_input_short); + + src_data.data_in = input; + src_data.data_out = output; + src_data.input_frames = length_input_short; + src_data.output_frames = length_output_short; + src_data.end_of_input = 0; + src_data.src_ratio = (float)output_sample_rate/input_sample_rate; + printf("ratio: %f\n", src_data.src_ratio); + + ret = src_process(src, &src_data); + assert(ret == 0); + + assert(src_data.output_frames_gen <= length_output_short); + src_float_to_short_array(output, output_short, src_data.output_frames_gen); + + return src_data.output_frames_gen; +} + + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + SRC_STATE *src; + int FsIn, FsOut; + int length_input_short, length_output_short; + int src_error; + + if (argc < 5) { + printf("usage: resample FsIn FsOut InputFileOfShorts OutputFileOfShortsn"); + printf("e.g resample 1E6 1E5 Fs1E6HzInputShortFile.raw Fs1E5HzOutputShortFile.raw\n"); + printf("e.g SampleGenerator | resample 1E6 1E5 | SampleConsumer\n"); + exit(1); + } + + FsIn = (int)atof(argv[1]); + FsOut = (int)atof(argv[2]); + + length_input_short = BUF_PERIOD*FsIn; + length_output_short = BUF_PERIOD*FsOut; + printf("FsIn: %d FsOut: %d length_input_short: %d length_output_short: %d\n", + FsIn, FsOut, length_input_short, length_output_short); + + short input_short[length_input_short]; + short output_short[length_output_short]; + + if (strcmp(argv[3], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[3],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[4], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[4],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + src = src_new(SRC_SINC_FASTEST, 1, &src_error); + assert(src != NULL); + + while(fread(input_short, sizeof(short), length_input_short, fin) == length_input_short) { + length_output_short = resample(src, + output_short, + input_short, + FsOut, + FsIn, + length_output_short, + length_input_short); + printf("length_output_short: %d\n", length_output_short); + fwrite(output_short, sizeof(short), length_output_short, fout); + } + + fclose(fin); + fclose(fout); + + src_delete(src); + + return 0; +} -- 2.25.1