annotate src/libsamplerate-0.1.9/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 481f5f8c5634
children
rev   line source
Chris@41 1 /*
Chris@41 2 ** Copyright (c) 2002-2016, Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@41 3 ** All rights reserved.
Chris@41 4 **
Chris@41 5 ** This code is released under 2-clause BSD license. Please see the
Chris@41 6 ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING
Chris@41 7 */
Chris@41 8
Chris@41 9 #include <stdio.h>
Chris@41 10 #include <stdlib.h>
Chris@41 11 #include <string.h>
Chris@41 12 #include <ctype.h>
Chris@41 13 #include <math.h>
Chris@41 14
Chris@41 15 #include "util.h"
Chris@41 16
Chris@41 17 #ifndef M_PI
Chris@41 18 #define M_PI 3.14159265358979323846264338
Chris@41 19 #endif
Chris@41 20
Chris@41 21 void
Chris@41 22 gen_windowed_sines (int freq_count, const double *freqs, double max, float *output, int output_len)
Chris@41 23 { int k, freq ;
Chris@41 24 double amplitude, phase ;
Chris@41 25
Chris@41 26 amplitude = max / freq_count ;
Chris@41 27
Chris@41 28 for (k = 0 ; k < output_len ; k++)
Chris@41 29 output [k] = 0.0 ;
Chris@41 30
Chris@41 31 for (freq = 0 ; freq < freq_count ; freq++)
Chris@41 32 { phase = 0.9 * M_PI / freq_count ;
Chris@41 33
Chris@41 34 if (freqs [freq] <= 0.0 || freqs [freq] >= 0.5)
Chris@41 35 { printf ("\n%s : Error : freq [%d] == %g is out of range. Should be < 0.5.\n", __FILE__, freq, freqs [freq]) ;
Chris@41 36 exit (1) ;
Chris@41 37 } ;
Chris@41 38
Chris@41 39 for (k = 0 ; k < output_len ; k++)
Chris@41 40 output [k] += amplitude * sin (freqs [freq] * (2 * k) * M_PI + phase) ;
Chris@41 41 } ;
Chris@41 42
Chris@41 43 /* Apply Hanning Window. */
Chris@41 44 for (k = 0 ; k < output_len ; k++)
Chris@41 45 output [k] *= 0.5 - 0.5 * cos ((2 * k) * M_PI / (output_len - 1)) ;
Chris@41 46
Chris@41 47 /* data [k] *= 0.3635819 - 0.4891775 * cos ((2 * k) * M_PI / (output_len - 1))
Chris@41 48 + 0.1365995 * cos ((4 * k) * M_PI / (output_len - 1))
Chris@41 49 - 0.0106411 * cos ((6 * k) * M_PI / (output_len - 1)) ;
Chris@41 50 */
Chris@41 51
Chris@41 52 return ;
Chris@41 53 } /* gen_windowed_sines */
Chris@41 54
Chris@41 55 void
Chris@41 56 save_oct_float (char *filename, float *input, int in_len, float *output, int out_len)
Chris@41 57 { FILE *file ;
Chris@41 58 int k ;
Chris@41 59
Chris@41 60 printf ("Dumping input and output data to file : %s.\n\n", filename) ;
Chris@41 61
Chris@41 62 if (! (file = fopen (filename, "w")))
Chris@41 63 return ;
Chris@41 64
Chris@41 65 fprintf (file, "# Not created by Octave\n") ;
Chris@41 66
Chris@41 67 fprintf (file, "# name: input\n") ;
Chris@41 68 fprintf (file, "# type: matrix\n") ;
Chris@41 69 fprintf (file, "# rows: %d\n", in_len) ;
Chris@41 70 fprintf (file, "# columns: 1\n") ;
Chris@41 71
Chris@41 72 for (k = 0 ; k < in_len ; k++)
Chris@41 73 fprintf (file, "% g\n", input [k]) ;
Chris@41 74
Chris@41 75 fprintf (file, "# name: output\n") ;
Chris@41 76 fprintf (file, "# type: matrix\n") ;
Chris@41 77 fprintf (file, "# rows: %d\n", out_len) ;
Chris@41 78 fprintf (file, "# columns: 1\n") ;
Chris@41 79
Chris@41 80 for (k = 0 ; k < out_len ; k++)
Chris@41 81 fprintf (file, "% g\n", output [k]) ;
Chris@41 82
Chris@41 83 fclose (file) ;
Chris@41 84 return ;
Chris@41 85 } /* save_oct_float */
Chris@41 86
Chris@41 87 void
Chris@41 88 save_oct_double (char *filename, double *input, int in_len, double *output, int out_len)
Chris@41 89 { FILE *file ;
Chris@41 90 int k ;
Chris@41 91
Chris@41 92 printf ("Dumping input and output data to file : %s.\n\n", filename) ;
Chris@41 93
Chris@41 94 if (! (file = fopen (filename, "w")))
Chris@41 95 return ;
Chris@41 96
Chris@41 97 fprintf (file, "# Not created by Octave\n") ;
Chris@41 98
Chris@41 99 fprintf (file, "# name: input\n") ;
Chris@41 100 fprintf (file, "# type: matrix\n") ;
Chris@41 101 fprintf (file, "# rows: %d\n", in_len) ;
Chris@41 102 fprintf (file, "# columns: 1\n") ;
Chris@41 103
Chris@41 104 for (k = 0 ; k < in_len ; k++)
Chris@41 105 fprintf (file, "% g\n", input [k]) ;
Chris@41 106
Chris@41 107 fprintf (file, "# name: output\n") ;
Chris@41 108 fprintf (file, "# type: matrix\n") ;
Chris@41 109 fprintf (file, "# rows: %d\n", out_len) ;
Chris@41 110 fprintf (file, "# columns: 1\n") ;
Chris@41 111
Chris@41 112 for (k = 0 ; k < out_len ; k++)
Chris@41 113 fprintf (file, "% g\n", output [k]) ;
Chris@41 114
Chris@41 115 fclose (file) ;
Chris@41 116 return ;
Chris@41 117 } /* save_oct_double */
Chris@41 118
Chris@41 119 void
Chris@41 120 interleave_data (const float *in, float *out, int frames, int channels)
Chris@41 121 { int fr, ch ;
Chris@41 122
Chris@41 123 for (fr = 0 ; fr < frames ; fr++)
Chris@41 124 for (ch = 0 ; ch < channels ; ch++)
Chris@41 125 out [ch + channels * fr] = in [fr + frames * ch] ;
Chris@41 126
Chris@41 127 return ;
Chris@41 128 } /* interleave_data */
Chris@41 129
Chris@41 130 void
Chris@41 131 deinterleave_data (const float *in, float *out, int frames, int channels)
Chris@41 132 { int fr, ch ;
Chris@41 133
Chris@41 134 for (ch = 0 ; ch < channels ; ch++)
Chris@41 135 for (fr = 0 ; fr < frames ; fr++)
Chris@41 136 out [fr + frames * ch] = in [ch + channels * fr] ;
Chris@41 137
Chris@41 138 return ;
Chris@41 139 } /* deinterleave_data */
Chris@41 140
Chris@41 141 void
Chris@41 142 reverse_data (float *data, int datalen)
Chris@41 143 { int left, right ;
Chris@41 144 float temp ;
Chris@41 145
Chris@41 146 left = 0 ;
Chris@41 147 right = datalen - 1 ;
Chris@41 148
Chris@41 149 while (left < right)
Chris@41 150 { temp = data [left] ;
Chris@41 151 data [left] = data [right] ;
Chris@41 152 data [right] = temp ;
Chris@41 153 left ++ ;
Chris@41 154 right -- ;
Chris@41 155 } ;
Chris@41 156
Chris@41 157 } /* reverse_data */
Chris@41 158
Chris@41 159 const char *
Chris@41 160 get_cpu_name (void)
Chris@41 161 {
Chris@41 162 const char *name = "Unknown", *search = NULL ;
Chris@41 163 static char buffer [512] ;
Chris@41 164 FILE * file = NULL ;
Chris@41 165 int is_pipe = 0 ;
Chris@41 166
Chris@41 167 #if defined (__linux__)
Chris@41 168 file = fopen ("/proc/cpuinfo", "r") ;
Chris@41 169 search = "model name" ;
Chris@41 170 #elif defined (__APPLE__)
Chris@41 171 file = popen ("/usr/sbin/system_profiler -detailLevel full SPHardwareDataType", "r") ;
Chris@41 172 search = "Processor Name" ;
Chris@41 173 is_pipe = 1 ;
Chris@41 174 #elif defined (__FreeBSD__)
Chris@41 175 file = popen ("sysctl -a", "r") ;
Chris@41 176 search = "hw.model" ;
Chris@41 177 is_pipe = 1 ;
Chris@41 178 #else
Chris@41 179 file = NULL ;
Chris@41 180 #endif
Chris@41 181
Chris@41 182 if (file == NULL)
Chris@41 183 return name ;
Chris@41 184
Chris@41 185 if (search == NULL)
Chris@41 186 { printf ("Error : search is NULL in function %s.\n", __func__) ;
Chris@41 187 return name ;
Chris@41 188 } ;
Chris@41 189
Chris@41 190 while (fgets (buffer, sizeof (buffer), file) != NULL)
Chris@41 191 if (strstr (buffer, search))
Chris@41 192 { char *src, *dest ;
Chris@41 193
Chris@41 194 if ((src = strchr (buffer, ':')) != NULL)
Chris@41 195 { src ++ ;
Chris@41 196 while (isspace (src [0]))
Chris@41 197 src ++ ;
Chris@41 198 name = src ;
Chris@41 199
Chris@41 200 /* Remove consecutive spaces. */
Chris@41 201 src ++ ;
Chris@41 202 for (dest = src ; src [0] ; src ++)
Chris@41 203 { if (isspace (src [0]) && isspace (dest [-1]))
Chris@41 204 continue ;
Chris@41 205 dest [0] = src [0] ;
Chris@41 206 dest ++ ;
Chris@41 207 } ;
Chris@41 208 dest [0] = 0 ;
Chris@41 209 break ;
Chris@41 210 } ;
Chris@41 211 } ;
Chris@41 212
Chris@41 213 if (is_pipe)
Chris@41 214 pclose (file) ;
Chris@41 215 else
Chris@41 216 fclose (file) ;
Chris@41 217
Chris@41 218 return name ;
Chris@41 219 } /* get_cpu_name */
Chris@41 220