Chris@0: /* Chris@0: ** Copyright (C) 2002-2011 Erik de Castro Lopo Chris@0: ** Chris@0: ** This program is free software; you can redistribute it and/or modify Chris@0: ** it under the terms of the GNU General Public License as published by Chris@0: ** the Free Software Foundation; either version 2 of the License, or Chris@0: ** (at your option) any later version. Chris@0: ** Chris@0: ** This program is distributed in the hope that it will be useful, Chris@0: ** but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: ** GNU General Public License for more details. Chris@0: ** Chris@0: ** You should have received a copy of the GNU General Public License Chris@0: ** along with this program; if not, write to the Free Software Chris@0: ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. Chris@0: */ Chris@0: Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: Chris@0: #include "util.h" Chris@0: Chris@0: #ifndef M_PI Chris@0: #define M_PI 3.14159265358979323846264338 Chris@0: #endif Chris@0: Chris@0: void Chris@0: gen_windowed_sines (int freq_count, const double *freqs, double max, float *output, int output_len) Chris@0: { int k, freq ; Chris@0: double amplitude, phase ; Chris@0: Chris@0: amplitude = max / freq_count ; Chris@0: Chris@0: for (k = 0 ; k < output_len ; k++) Chris@0: output [k] = 0.0 ; Chris@0: Chris@0: for (freq = 0 ; freq < freq_count ; freq++) Chris@0: { phase = 0.9 * M_PI / freq_count ; Chris@0: Chris@0: if (freqs [freq] <= 0.0 || freqs [freq] >= 0.5) Chris@0: { printf ("\n%s : Error : freq [%d] == %g is out of range. Should be < 0.5.\n", __FILE__, freq, freqs [freq]) ; Chris@0: exit (1) ; Chris@0: } ; Chris@0: Chris@0: for (k = 0 ; k < output_len ; k++) Chris@0: output [k] += amplitude * sin (freqs [freq] * (2 * k) * M_PI + phase) ; Chris@0: } ; Chris@0: Chris@0: /* Apply Hanning Window. */ Chris@0: for (k = 0 ; k < output_len ; k++) Chris@0: output [k] *= 0.5 - 0.5 * cos ((2 * k) * M_PI / (output_len - 1)) ; Chris@0: Chris@0: /* data [k] *= 0.3635819 - 0.4891775 * cos ((2 * k) * M_PI / (output_len - 1)) Chris@0: + 0.1365995 * cos ((4 * k) * M_PI / (output_len - 1)) Chris@0: - 0.0106411 * cos ((6 * k) * M_PI / (output_len - 1)) ; Chris@0: */ Chris@0: Chris@0: return ; Chris@0: } /* gen_windowed_sines */ Chris@0: Chris@0: void Chris@0: save_oct_float (char *filename, float *input, int in_len, float *output, int out_len) Chris@0: { FILE *file ; Chris@0: int k ; Chris@0: Chris@0: printf ("Dumping input and output data to file : %s.\n\n", filename) ; Chris@0: Chris@0: if (! (file = fopen (filename, "w"))) Chris@0: return ; Chris@0: Chris@0: fprintf (file, "# Not created by Octave\n") ; Chris@0: Chris@0: fprintf (file, "# name: input\n") ; Chris@0: fprintf (file, "# type: matrix\n") ; Chris@0: fprintf (file, "# rows: %d\n", in_len) ; Chris@0: fprintf (file, "# columns: 1\n") ; Chris@0: Chris@0: for (k = 0 ; k < in_len ; k++) Chris@0: fprintf (file, "% g\n", input [k]) ; Chris@0: Chris@0: fprintf (file, "# name: output\n") ; Chris@0: fprintf (file, "# type: matrix\n") ; Chris@0: fprintf (file, "# rows: %d\n", out_len) ; Chris@0: fprintf (file, "# columns: 1\n") ; Chris@0: Chris@0: for (k = 0 ; k < out_len ; k++) Chris@0: fprintf (file, "% g\n", output [k]) ; Chris@0: Chris@0: fclose (file) ; Chris@0: return ; Chris@0: } /* save_oct_float */ Chris@0: Chris@0: void Chris@0: save_oct_double (char *filename, double *input, int in_len, double *output, int out_len) Chris@0: { FILE *file ; Chris@0: int k ; Chris@0: Chris@0: printf ("Dumping input and output data to file : %s.\n\n", filename) ; Chris@0: Chris@0: if (! (file = fopen (filename, "w"))) Chris@0: return ; Chris@0: Chris@0: fprintf (file, "# Not created by Octave\n") ; Chris@0: Chris@0: fprintf (file, "# name: input\n") ; Chris@0: fprintf (file, "# type: matrix\n") ; Chris@0: fprintf (file, "# rows: %d\n", in_len) ; Chris@0: fprintf (file, "# columns: 1\n") ; Chris@0: Chris@0: for (k = 0 ; k < in_len ; k++) Chris@0: fprintf (file, "% g\n", input [k]) ; Chris@0: Chris@0: fprintf (file, "# name: output\n") ; Chris@0: fprintf (file, "# type: matrix\n") ; Chris@0: fprintf (file, "# rows: %d\n", out_len) ; Chris@0: fprintf (file, "# columns: 1\n") ; Chris@0: Chris@0: for (k = 0 ; k < out_len ; k++) Chris@0: fprintf (file, "% g\n", output [k]) ; Chris@0: Chris@0: fclose (file) ; Chris@0: return ; Chris@0: } /* save_oct_double */ Chris@0: Chris@0: void Chris@0: interleave_data (const float *in, float *out, int frames, int channels) Chris@0: { int fr, ch ; Chris@0: Chris@0: for (fr = 0 ; fr < frames ; fr++) Chris@0: for (ch = 0 ; ch < channels ; ch++) Chris@0: out [ch + channels * fr] = in [fr + frames * ch] ; Chris@0: Chris@0: return ; Chris@0: } /* interleave_data */ Chris@0: Chris@0: void Chris@0: deinterleave_data (const float *in, float *out, int frames, int channels) Chris@0: { int fr, ch ; Chris@0: Chris@0: for (ch = 0 ; ch < channels ; ch++) Chris@0: for (fr = 0 ; fr < frames ; fr++) Chris@0: out [fr + frames * ch] = in [ch + channels * fr] ; Chris@0: Chris@0: return ; Chris@0: } /* deinterleave_data */ Chris@0: Chris@0: void Chris@0: reverse_data (float *data, int datalen) Chris@0: { int left, right ; Chris@0: float temp ; Chris@0: Chris@0: left = 0 ; Chris@0: right = datalen - 1 ; Chris@0: Chris@0: while (left < right) Chris@0: { temp = data [left] ; Chris@0: data [left] = data [right] ; Chris@0: data [right] = temp ; Chris@0: left ++ ; Chris@0: right -- ; Chris@0: } ; Chris@0: Chris@0: } /* reverse_data */ Chris@0: Chris@0: const char * Chris@0: get_cpu_name (void) Chris@0: { Chris@0: const char *name = "Unknown", *search = NULL ; Chris@0: static char buffer [512] ; Chris@0: FILE * file = NULL ; Chris@0: int is_pipe = 0 ; Chris@0: Chris@0: #if defined (__linux__) Chris@0: file = fopen ("/proc/cpuinfo", "r") ; Chris@0: search = "model name" ; Chris@0: #elif defined (__APPLE__) Chris@0: file = popen ("/usr/sbin/system_profiler -detailLevel full SPHardwareDataType", "r") ; Chris@0: search = "Processor Name" ; Chris@0: is_pipe = 1 ; Chris@0: #elif defined (__FreeBSD__) Chris@0: file = popen ("sysctl -a", "r") ; Chris@0: search = "hw.model" ; Chris@0: is_pipe = 1 ; Chris@0: #else Chris@0: file = NULL ; Chris@0: #endif Chris@0: Chris@0: if (file == NULL) Chris@0: return name ; Chris@0: Chris@0: if (search == NULL) Chris@0: { printf ("Error : search is NULL in function %s.\n", __func__) ; Chris@0: return name ; Chris@0: } ; Chris@0: Chris@0: while (fgets (buffer, sizeof (buffer), file) != NULL) Chris@0: if (strstr (buffer, search)) Chris@0: { char *src, *dest ; Chris@0: Chris@0: if ((src = strchr (buffer, ':')) != NULL) Chris@0: { src ++ ; Chris@0: while (isspace (src [0])) Chris@0: src ++ ; Chris@0: name = src ; Chris@0: Chris@0: /* Remove consecutive spaces. */ Chris@0: src ++ ; Chris@0: for (dest = src ; src [0] ; src ++) Chris@0: { if (isspace (src [0]) && isspace (dest [-1])) Chris@0: continue ; Chris@0: dest [0] = src [0] ; Chris@0: dest ++ ; Chris@0: } ; Chris@0: dest [0] = 0 ; Chris@0: break ; Chris@0: } ; Chris@0: } ; Chris@0: Chris@0: if (is_pipe) Chris@0: pclose (file) ; Chris@0: else Chris@0: fclose (file) ; Chris@0: Chris@0: return name ; Chris@0: } /* get_cpu_name */ Chris@0: