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
|