cannam@126: /* cannam@126: ** Copyright (c) 2002-2016, Erik de Castro Lopo cannam@126: ** All rights reserved. cannam@126: ** cannam@126: ** This code is released under 2-clause BSD license. Please see the cannam@126: ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING cannam@126: */ cannam@126: cannam@126: #include cannam@126: #include cannam@126: #include cannam@126: #include cannam@126: #include cannam@126: cannam@126: #include "util.h" cannam@126: cannam@126: #ifndef M_PI cannam@126: #define M_PI 3.14159265358979323846264338 cannam@126: #endif cannam@126: cannam@126: void cannam@126: gen_windowed_sines (int freq_count, const double *freqs, double max, float *output, int output_len) cannam@126: { int k, freq ; cannam@126: double amplitude, phase ; cannam@126: cannam@126: amplitude = max / freq_count ; cannam@126: cannam@126: for (k = 0 ; k < output_len ; k++) cannam@126: output [k] = 0.0 ; cannam@126: cannam@126: for (freq = 0 ; freq < freq_count ; freq++) cannam@126: { phase = 0.9 * M_PI / freq_count ; cannam@126: cannam@126: if (freqs [freq] <= 0.0 || freqs [freq] >= 0.5) cannam@126: { printf ("\n%s : Error : freq [%d] == %g is out of range. Should be < 0.5.\n", __FILE__, freq, freqs [freq]) ; cannam@126: exit (1) ; cannam@126: } ; cannam@126: cannam@126: for (k = 0 ; k < output_len ; k++) cannam@126: output [k] += amplitude * sin (freqs [freq] * (2 * k) * M_PI + phase) ; cannam@126: } ; cannam@126: cannam@126: /* Apply Hanning Window. */ cannam@126: for (k = 0 ; k < output_len ; k++) cannam@126: output [k] *= 0.5 - 0.5 * cos ((2 * k) * M_PI / (output_len - 1)) ; cannam@126: cannam@126: /* data [k] *= 0.3635819 - 0.4891775 * cos ((2 * k) * M_PI / (output_len - 1)) cannam@126: + 0.1365995 * cos ((4 * k) * M_PI / (output_len - 1)) cannam@126: - 0.0106411 * cos ((6 * k) * M_PI / (output_len - 1)) ; cannam@126: */ cannam@126: cannam@126: return ; cannam@126: } /* gen_windowed_sines */ cannam@126: cannam@126: void cannam@126: save_oct_float (char *filename, float *input, int in_len, float *output, int out_len) cannam@126: { FILE *file ; cannam@126: int k ; cannam@126: cannam@126: printf ("Dumping input and output data to file : %s.\n\n", filename) ; cannam@126: cannam@126: if (! (file = fopen (filename, "w"))) cannam@126: return ; cannam@126: cannam@126: fprintf (file, "# Not created by Octave\n") ; cannam@126: cannam@126: fprintf (file, "# name: input\n") ; cannam@126: fprintf (file, "# type: matrix\n") ; cannam@126: fprintf (file, "# rows: %d\n", in_len) ; cannam@126: fprintf (file, "# columns: 1\n") ; cannam@126: cannam@126: for (k = 0 ; k < in_len ; k++) cannam@126: fprintf (file, "% g\n", input [k]) ; cannam@126: cannam@126: fprintf (file, "# name: output\n") ; cannam@126: fprintf (file, "# type: matrix\n") ; cannam@126: fprintf (file, "# rows: %d\n", out_len) ; cannam@126: fprintf (file, "# columns: 1\n") ; cannam@126: cannam@126: for (k = 0 ; k < out_len ; k++) cannam@126: fprintf (file, "% g\n", output [k]) ; cannam@126: cannam@126: fclose (file) ; cannam@126: return ; cannam@126: } /* save_oct_float */ cannam@126: cannam@126: void cannam@126: save_oct_double (char *filename, double *input, int in_len, double *output, int out_len) cannam@126: { FILE *file ; cannam@126: int k ; cannam@126: cannam@126: printf ("Dumping input and output data to file : %s.\n\n", filename) ; cannam@126: cannam@126: if (! (file = fopen (filename, "w"))) cannam@126: return ; cannam@126: cannam@126: fprintf (file, "# Not created by Octave\n") ; cannam@126: cannam@126: fprintf (file, "# name: input\n") ; cannam@126: fprintf (file, "# type: matrix\n") ; cannam@126: fprintf (file, "# rows: %d\n", in_len) ; cannam@126: fprintf (file, "# columns: 1\n") ; cannam@126: cannam@126: for (k = 0 ; k < in_len ; k++) cannam@126: fprintf (file, "% g\n", input [k]) ; cannam@126: cannam@126: fprintf (file, "# name: output\n") ; cannam@126: fprintf (file, "# type: matrix\n") ; cannam@126: fprintf (file, "# rows: %d\n", out_len) ; cannam@126: fprintf (file, "# columns: 1\n") ; cannam@126: cannam@126: for (k = 0 ; k < out_len ; k++) cannam@126: fprintf (file, "% g\n", output [k]) ; cannam@126: cannam@126: fclose (file) ; cannam@126: return ; cannam@126: } /* save_oct_double */ cannam@126: cannam@126: void cannam@126: interleave_data (const float *in, float *out, int frames, int channels) cannam@126: { int fr, ch ; cannam@126: cannam@126: for (fr = 0 ; fr < frames ; fr++) cannam@126: for (ch = 0 ; ch < channels ; ch++) cannam@126: out [ch + channels * fr] = in [fr + frames * ch] ; cannam@126: cannam@126: return ; cannam@126: } /* interleave_data */ cannam@126: cannam@126: void cannam@126: deinterleave_data (const float *in, float *out, int frames, int channels) cannam@126: { int fr, ch ; cannam@126: cannam@126: for (ch = 0 ; ch < channels ; ch++) cannam@126: for (fr = 0 ; fr < frames ; fr++) cannam@126: out [fr + frames * ch] = in [ch + channels * fr] ; cannam@126: cannam@126: return ; cannam@126: } /* deinterleave_data */ cannam@126: cannam@126: void cannam@126: reverse_data (float *data, int datalen) cannam@126: { int left, right ; cannam@126: float temp ; cannam@126: cannam@126: left = 0 ; cannam@126: right = datalen - 1 ; cannam@126: cannam@126: while (left < right) cannam@126: { temp = data [left] ; cannam@126: data [left] = data [right] ; cannam@126: data [right] = temp ; cannam@126: left ++ ; cannam@126: right -- ; cannam@126: } ; cannam@126: cannam@126: } /* reverse_data */ cannam@126: cannam@126: const char * cannam@126: get_cpu_name (void) cannam@126: { cannam@126: const char *name = "Unknown", *search = NULL ; cannam@126: static char buffer [512] ; cannam@126: FILE * file = NULL ; cannam@126: int is_pipe = 0 ; cannam@126: cannam@126: #if defined (__linux__) cannam@126: file = fopen ("/proc/cpuinfo", "r") ; cannam@126: search = "model name" ; cannam@126: #elif defined (__APPLE__) cannam@126: file = popen ("/usr/sbin/system_profiler -detailLevel full SPHardwareDataType", "r") ; cannam@126: search = "Processor Name" ; cannam@126: is_pipe = 1 ; cannam@126: #elif defined (__FreeBSD__) cannam@126: file = popen ("sysctl -a", "r") ; cannam@126: search = "hw.model" ; cannam@126: is_pipe = 1 ; cannam@126: #else cannam@126: file = NULL ; cannam@126: #endif cannam@126: cannam@126: if (file == NULL) cannam@126: return name ; cannam@126: cannam@126: if (search == NULL) cannam@126: { printf ("Error : search is NULL in function %s.\n", __func__) ; cannam@126: return name ; cannam@126: } ; cannam@126: cannam@126: while (fgets (buffer, sizeof (buffer), file) != NULL) cannam@126: if (strstr (buffer, search)) cannam@126: { char *src, *dest ; cannam@126: cannam@126: if ((src = strchr (buffer, ':')) != NULL) cannam@126: { src ++ ; cannam@126: while (isspace (src [0])) cannam@126: src ++ ; cannam@126: name = src ; cannam@126: cannam@126: /* Remove consecutive spaces. */ cannam@126: src ++ ; cannam@126: for (dest = src ; src [0] ; src ++) cannam@126: { if (isspace (src [0]) && isspace (dest [-1])) cannam@126: continue ; cannam@126: dest [0] = src [0] ; cannam@126: dest ++ ; cannam@126: } ; cannam@126: dest [0] = 0 ; cannam@126: break ; cannam@126: } ; cannam@126: } ; cannam@126: cannam@126: if (is_pipe) cannam@126: pclose (file) ; cannam@126: else cannam@126: fclose (file) ; cannam@126: cannam@126: return name ; cannam@126: } /* get_cpu_name */ cannam@126: