annotate src/libsamplerate-0.1.8/tests/util.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU General Public License as published by
Chris@0 6 ** the Free Software Foundation; either version 2 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU General Public License
Chris@0 15 ** along with this program; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include <stdio.h>
Chris@0 20 #include <stdlib.h>
Chris@0 21 #include <string.h>
Chris@0 22 #include <ctype.h>
Chris@0 23 #include <math.h>
Chris@0 24
Chris@0 25 #include "util.h"
Chris@0 26
Chris@0 27 #ifndef M_PI
Chris@0 28 #define M_PI 3.14159265358979323846264338
Chris@0 29 #endif
Chris@0 30
Chris@0 31 void
Chris@0 32 gen_windowed_sines (int freq_count, const double *freqs, double max, float *output, int output_len)
Chris@0 33 { int k, freq ;
Chris@0 34 double amplitude, phase ;
Chris@0 35
Chris@0 36 amplitude = max / freq_count ;
Chris@0 37
Chris@0 38 for (k = 0 ; k < output_len ; k++)
Chris@0 39 output [k] = 0.0 ;
Chris@0 40
Chris@0 41 for (freq = 0 ; freq < freq_count ; freq++)
Chris@0 42 { phase = 0.9 * M_PI / freq_count ;
Chris@0 43
Chris@0 44 if (freqs [freq] <= 0.0 || freqs [freq] >= 0.5)
Chris@0 45 { printf ("\n%s : Error : freq [%d] == %g is out of range. Should be < 0.5.\n", __FILE__, freq, freqs [freq]) ;
Chris@0 46 exit (1) ;
Chris@0 47 } ;
Chris@0 48
Chris@0 49 for (k = 0 ; k < output_len ; k++)
Chris@0 50 output [k] += amplitude * sin (freqs [freq] * (2 * k) * M_PI + phase) ;
Chris@0 51 } ;
Chris@0 52
Chris@0 53 /* Apply Hanning Window. */
Chris@0 54 for (k = 0 ; k < output_len ; k++)
Chris@0 55 output [k] *= 0.5 - 0.5 * cos ((2 * k) * M_PI / (output_len - 1)) ;
Chris@0 56
Chris@0 57 /* data [k] *= 0.3635819 - 0.4891775 * cos ((2 * k) * M_PI / (output_len - 1))
Chris@0 58 + 0.1365995 * cos ((4 * k) * M_PI / (output_len - 1))
Chris@0 59 - 0.0106411 * cos ((6 * k) * M_PI / (output_len - 1)) ;
Chris@0 60 */
Chris@0 61
Chris@0 62 return ;
Chris@0 63 } /* gen_windowed_sines */
Chris@0 64
Chris@0 65 void
Chris@0 66 save_oct_float (char *filename, float *input, int in_len, float *output, int out_len)
Chris@0 67 { FILE *file ;
Chris@0 68 int k ;
Chris@0 69
Chris@0 70 printf ("Dumping input and output data to file : %s.\n\n", filename) ;
Chris@0 71
Chris@0 72 if (! (file = fopen (filename, "w")))
Chris@0 73 return ;
Chris@0 74
Chris@0 75 fprintf (file, "# Not created by Octave\n") ;
Chris@0 76
Chris@0 77 fprintf (file, "# name: input\n") ;
Chris@0 78 fprintf (file, "# type: matrix\n") ;
Chris@0 79 fprintf (file, "# rows: %d\n", in_len) ;
Chris@0 80 fprintf (file, "# columns: 1\n") ;
Chris@0 81
Chris@0 82 for (k = 0 ; k < in_len ; k++)
Chris@0 83 fprintf (file, "% g\n", input [k]) ;
Chris@0 84
Chris@0 85 fprintf (file, "# name: output\n") ;
Chris@0 86 fprintf (file, "# type: matrix\n") ;
Chris@0 87 fprintf (file, "# rows: %d\n", out_len) ;
Chris@0 88 fprintf (file, "# columns: 1\n") ;
Chris@0 89
Chris@0 90 for (k = 0 ; k < out_len ; k++)
Chris@0 91 fprintf (file, "% g\n", output [k]) ;
Chris@0 92
Chris@0 93 fclose (file) ;
Chris@0 94 return ;
Chris@0 95 } /* save_oct_float */
Chris@0 96
Chris@0 97 void
Chris@0 98 save_oct_double (char *filename, double *input, int in_len, double *output, int out_len)
Chris@0 99 { FILE *file ;
Chris@0 100 int k ;
Chris@0 101
Chris@0 102 printf ("Dumping input and output data to file : %s.\n\n", filename) ;
Chris@0 103
Chris@0 104 if (! (file = fopen (filename, "w")))
Chris@0 105 return ;
Chris@0 106
Chris@0 107 fprintf (file, "# Not created by Octave\n") ;
Chris@0 108
Chris@0 109 fprintf (file, "# name: input\n") ;
Chris@0 110 fprintf (file, "# type: matrix\n") ;
Chris@0 111 fprintf (file, "# rows: %d\n", in_len) ;
Chris@0 112 fprintf (file, "# columns: 1\n") ;
Chris@0 113
Chris@0 114 for (k = 0 ; k < in_len ; k++)
Chris@0 115 fprintf (file, "% g\n", input [k]) ;
Chris@0 116
Chris@0 117 fprintf (file, "# name: output\n") ;
Chris@0 118 fprintf (file, "# type: matrix\n") ;
Chris@0 119 fprintf (file, "# rows: %d\n", out_len) ;
Chris@0 120 fprintf (file, "# columns: 1\n") ;
Chris@0 121
Chris@0 122 for (k = 0 ; k < out_len ; k++)
Chris@0 123 fprintf (file, "% g\n", output [k]) ;
Chris@0 124
Chris@0 125 fclose (file) ;
Chris@0 126 return ;
Chris@0 127 } /* save_oct_double */
Chris@0 128
Chris@0 129 void
Chris@0 130 interleave_data (const float *in, float *out, int frames, int channels)
Chris@0 131 { int fr, ch ;
Chris@0 132
Chris@0 133 for (fr = 0 ; fr < frames ; fr++)
Chris@0 134 for (ch = 0 ; ch < channels ; ch++)
Chris@0 135 out [ch + channels * fr] = in [fr + frames * ch] ;
Chris@0 136
Chris@0 137 return ;
Chris@0 138 } /* interleave_data */
Chris@0 139
Chris@0 140 void
Chris@0 141 deinterleave_data (const float *in, float *out, int frames, int channels)
Chris@0 142 { int fr, ch ;
Chris@0 143
Chris@0 144 for (ch = 0 ; ch < channels ; ch++)
Chris@0 145 for (fr = 0 ; fr < frames ; fr++)
Chris@0 146 out [fr + frames * ch] = in [ch + channels * fr] ;
Chris@0 147
Chris@0 148 return ;
Chris@0 149 } /* deinterleave_data */
Chris@0 150
Chris@0 151 void
Chris@0 152 reverse_data (float *data, int datalen)
Chris@0 153 { int left, right ;
Chris@0 154 float temp ;
Chris@0 155
Chris@0 156 left = 0 ;
Chris@0 157 right = datalen - 1 ;
Chris@0 158
Chris@0 159 while (left < right)
Chris@0 160 { temp = data [left] ;
Chris@0 161 data [left] = data [right] ;
Chris@0 162 data [right] = temp ;
Chris@0 163 left ++ ;
Chris@0 164 right -- ;
Chris@0 165 } ;
Chris@0 166
Chris@0 167 } /* reverse_data */
Chris@0 168
Chris@0 169 const char *
Chris@0 170 get_cpu_name (void)
Chris@0 171 {
Chris@0 172 const char *name = "Unknown", *search = NULL ;
Chris@0 173 static char buffer [512] ;
Chris@0 174 FILE * file = NULL ;
Chris@0 175 int is_pipe = 0 ;
Chris@0 176
Chris@0 177 #if defined (__linux__)
Chris@0 178 file = fopen ("/proc/cpuinfo", "r") ;
Chris@0 179 search = "model name" ;
Chris@0 180 #elif defined (__APPLE__)
Chris@0 181 file = popen ("/usr/sbin/system_profiler -detailLevel full SPHardwareDataType", "r") ;
Chris@0 182 search = "Processor Name" ;
Chris@0 183 is_pipe = 1 ;
Chris@0 184 #elif defined (__FreeBSD__)
Chris@0 185 file = popen ("sysctl -a", "r") ;
Chris@0 186 search = "hw.model" ;
Chris@0 187 is_pipe = 1 ;
Chris@0 188 #else
Chris@0 189 file = NULL ;
Chris@0 190 #endif
Chris@0 191
Chris@0 192 if (file == NULL)
Chris@0 193 return name ;
Chris@0 194
Chris@0 195 if (search == NULL)
Chris@0 196 { printf ("Error : search is NULL in function %s.\n", __func__) ;
Chris@0 197 return name ;
Chris@0 198 } ;
Chris@0 199
Chris@0 200 while (fgets (buffer, sizeof (buffer), file) != NULL)
Chris@0 201 if (strstr (buffer, search))
Chris@0 202 { char *src, *dest ;
Chris@0 203
Chris@0 204 if ((src = strchr (buffer, ':')) != NULL)
Chris@0 205 { src ++ ;
Chris@0 206 while (isspace (src [0]))
Chris@0 207 src ++ ;
Chris@0 208 name = src ;
Chris@0 209
Chris@0 210 /* Remove consecutive spaces. */
Chris@0 211 src ++ ;
Chris@0 212 for (dest = src ; src [0] ; src ++)
Chris@0 213 { if (isspace (src [0]) && isspace (dest [-1]))
Chris@0 214 continue ;
Chris@0 215 dest [0] = src [0] ;
Chris@0 216 dest ++ ;
Chris@0 217 } ;
Chris@0 218 dest [0] = 0 ;
Chris@0 219 break ;
Chris@0 220 } ;
Chris@0 221 } ;
Chris@0 222
Chris@0 223 if (is_pipe)
Chris@0 224 pclose (file) ;
Chris@0 225 else
Chris@0 226 fclose (file) ;
Chris@0 227
Chris@0 228 return name ;
Chris@0 229 } /* get_cpu_name */
Chris@0 230