Mercurial > hg > sv-dependency-builds
diff src/libsamplerate-0.1.8/tests/util.c @ 0:c7265573341e
Import initial set of sources
author | Chris Cannam |
---|---|
date | Mon, 18 Mar 2013 14:12:14 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/libsamplerate-0.1.8/tests/util.c Mon Mar 18 14:12:14 2013 +0000 @@ -0,0 +1,230 @@ +/* +** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com> +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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 General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <math.h> + +#include "util.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +void +gen_windowed_sines (int freq_count, const double *freqs, double max, float *output, int output_len) +{ int k, freq ; + double amplitude, phase ; + + amplitude = max / freq_count ; + + for (k = 0 ; k < output_len ; k++) + output [k] = 0.0 ; + + for (freq = 0 ; freq < freq_count ; freq++) + { phase = 0.9 * M_PI / freq_count ; + + if (freqs [freq] <= 0.0 || freqs [freq] >= 0.5) + { printf ("\n%s : Error : freq [%d] == %g is out of range. Should be < 0.5.\n", __FILE__, freq, freqs [freq]) ; + exit (1) ; + } ; + + for (k = 0 ; k < output_len ; k++) + output [k] += amplitude * sin (freqs [freq] * (2 * k) * M_PI + phase) ; + } ; + + /* Apply Hanning Window. */ + for (k = 0 ; k < output_len ; k++) + output [k] *= 0.5 - 0.5 * cos ((2 * k) * M_PI / (output_len - 1)) ; + + /* data [k] *= 0.3635819 - 0.4891775 * cos ((2 * k) * M_PI / (output_len - 1)) + + 0.1365995 * cos ((4 * k) * M_PI / (output_len - 1)) + - 0.0106411 * cos ((6 * k) * M_PI / (output_len - 1)) ; + */ + + return ; +} /* gen_windowed_sines */ + +void +save_oct_float (char *filename, float *input, int in_len, float *output, int out_len) +{ FILE *file ; + int k ; + + printf ("Dumping input and output data to file : %s.\n\n", filename) ; + + if (! (file = fopen (filename, "w"))) + return ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: input\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", in_len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < in_len ; k++) + fprintf (file, "% g\n", input [k]) ; + + fprintf (file, "# name: output\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", out_len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < out_len ; k++) + fprintf (file, "% g\n", output [k]) ; + + fclose (file) ; + return ; +} /* save_oct_float */ + +void +save_oct_double (char *filename, double *input, int in_len, double *output, int out_len) +{ FILE *file ; + int k ; + + printf ("Dumping input and output data to file : %s.\n\n", filename) ; + + if (! (file = fopen (filename, "w"))) + return ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: input\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", in_len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < in_len ; k++) + fprintf (file, "% g\n", input [k]) ; + + fprintf (file, "# name: output\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", out_len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < out_len ; k++) + fprintf (file, "% g\n", output [k]) ; + + fclose (file) ; + return ; +} /* save_oct_double */ + +void +interleave_data (const float *in, float *out, int frames, int channels) +{ int fr, ch ; + + for (fr = 0 ; fr < frames ; fr++) + for (ch = 0 ; ch < channels ; ch++) + out [ch + channels * fr] = in [fr + frames * ch] ; + + return ; +} /* interleave_data */ + +void +deinterleave_data (const float *in, float *out, int frames, int channels) +{ int fr, ch ; + + for (ch = 0 ; ch < channels ; ch++) + for (fr = 0 ; fr < frames ; fr++) + out [fr + frames * ch] = in [ch + channels * fr] ; + + return ; +} /* deinterleave_data */ + +void +reverse_data (float *data, int datalen) +{ int left, right ; + float temp ; + + left = 0 ; + right = datalen - 1 ; + + while (left < right) + { temp = data [left] ; + data [left] = data [right] ; + data [right] = temp ; + left ++ ; + right -- ; + } ; + +} /* reverse_data */ + +const char * +get_cpu_name (void) +{ + const char *name = "Unknown", *search = NULL ; + static char buffer [512] ; + FILE * file = NULL ; + int is_pipe = 0 ; + +#if defined (__linux__) + file = fopen ("/proc/cpuinfo", "r") ; + search = "model name" ; +#elif defined (__APPLE__) + file = popen ("/usr/sbin/system_profiler -detailLevel full SPHardwareDataType", "r") ; + search = "Processor Name" ; + is_pipe = 1 ; +#elif defined (__FreeBSD__) + file = popen ("sysctl -a", "r") ; + search = "hw.model" ; + is_pipe = 1 ; +#else + file = NULL ; +#endif + + if (file == NULL) + return name ; + + if (search == NULL) + { printf ("Error : search is NULL in function %s.\n", __func__) ; + return name ; + } ; + + while (fgets (buffer, sizeof (buffer), file) != NULL) + if (strstr (buffer, search)) + { char *src, *dest ; + + if ((src = strchr (buffer, ':')) != NULL) + { src ++ ; + while (isspace (src [0])) + src ++ ; + name = src ; + + /* Remove consecutive spaces. */ + src ++ ; + for (dest = src ; src [0] ; src ++) + { if (isspace (src [0]) && isspace (dest [-1])) + continue ; + dest [0] = src [0] ; + dest ++ ; + } ; + dest [0] = 0 ; + break ; + } ; + } ; + + if (is_pipe) + pclose (file) ; + else + fclose (file) ; + + return name ; +} /* get_cpu_name */ +