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