History

Larhe update of fir_interp.cc.

Erik de Castro Lopo committed 22 years ago

Commit 1c4bee31 parent dc719a51 file · +90 −40Browse files

Unified · Split

FIR-POLY/fir_interp.cc+90−40
@@ -31,23 +31,24 @@ · 30 unmodified lines
3131
3232 #include "mag_spectrum.hh"
3333
34−#define UPSAMPLE_RATIO 2.0
34+#define UPSAMPLE_RATIO 2
3535 #define ARRAY_LEN(x) (sizeof (x) / sizeof ((x) [0]))
3636
37+#define INTERP_LEN 1600
3738 /*
3839 ** Number of half cycles of impulse response to the left and right
3940 ** of the center.
40−** left_half_offset <= right_half_cycles
41+** left_half_offset <= right_len
4142 */
4243
43−static int left_half_cycles = 6 ;
44−static int right_half_cycles = 20 ;
44+static int left_len = 150 ;
45+static int right_len = 750 ;
4546
4647
4748 typedef struct
4849 {
4950 /* Window coefficients (all in range [0, 1]). */
50− double y_left [3], y_right [3] ;
51+ double y_left [10], y_right [10] ;
5152
5253 double sinc_time_fudge ;
5354
@@ -57,20 +58,20 @@ typedef struct · 3 unmodified lines
5758 {
5859 union
5960 { FIR_PARAMS fir_params ;
60− double data [20] ;
61+ double data [30] ;
6162 } ;
6263
6364 unsigned middle, total_len ;
6465
65− double left_window_poly [5] ;
66− double right_window_poly [5] ;
66+ double left_window_poly [20] ;
67+ double right_window_poly [20] ;
6768
68− double sinc [2048] ;
69− double window [2048] ;
70− double filter [2048] ;
71− double mag [1024] ;
72− double logmag [1024] ;
73− double phase [1024] ;
69+ double sinc [INTERP_LEN] ;
70+ double window [INTERP_LEN] ;
71+ double filter [INTERP_LEN] ;
72+ double mag [INTERP_LEN / 2] ;
73+ double logmag [INTERP_LEN / 2] ;
74+ double phase [INTERP_LEN / 2] ;
7475 } FIR_INTERP ;
7576
7677 static double fir_error (const GMatrix& gm) ;
@@ -90,6 +91,7 @@ main (void) · 13 unmodified lines
9091 double error ;
9192 int param_count ;
9293
94+ puts ("Running ........") ;
9395 param_count = sizeof (FIR_PARAMS) / sizeof (double) ;
9496
9597 randomize_data (&interp) ;
@@ -128,15 +130,27 @@ poly_evaluate (int order, const double *coeff, double x) · 32 unmodified lines
128130
129131 static double
130132 evaluate_filter (FIR_INTERP *interp)
131−{
133+{ double error = 0.0, temp, stop_max = 0.0, stop_sum = 0.0 ;
134+ unsigned k ;
135+
132136 mag_spectrum (interp->filter, ARRAY_LEN (interp->filter), interp->mag, interp->logmag, interp->phase) ;
137+
138+ for (k = ARRAY_LEN (interp->logmag) / UPSAMPLE_RATIO ; k < ARRAY_LEN (interp->logmag) ; k++)
139+ { temp = interp->logmag [k] + 150.0 ;
140+ if (temp > stop_max)
141+ stop_max = temp ;
142+ if (temp > 0.0)
143+ stop_sum += temp ;
144+ } ;
133145
134− return 1.0 ;
146+ error = stop_max * stop_sum ;
147+ return error ;
135148 } /* evaluate_filter */
136149
137150 static double
138151 fir_error (const GMatrix& gm)
139152 { static FIR_INTERP interp ;
153+ static int test_count = 0 ;
140154 static double best_error = 1e200 ;
141155 double error = 0.0 ;
142156 unsigned param_count ;
@@ -146,24 +160,22 @@ fir_error (const GMatrix& gm) · 3 unmodified lines
146160 param_count = sizeof (FIR_PARAMS) / sizeof (double) ;
147161
148162 if (ARRAY_LEN (interp.data) < param_count)
149− { printf ("\n\nError : ARRAY_LEN (interp.data) < param_count.\n") ;
163+ { printf ("\n\nError : ARRAY_LEN (interp.data) < param_count.\n\n") ;
150164 exit (1) ;
151165 } ;
152166
153167 if (gm.GetData (param_count, interp.data) != param_count)
154− { printf ("\n\nError : GetData should return %d.\n", param_count) ;
168+ { printf ("\n\nError : GetData should return %d.\n\n", param_count) ;
155169 exit (1) ;
156170 } ;
157171
158172 /* Eval error in sinc_time_fudge. */
159− if (interp.fir_params.sinc_time_fudge < 1.0)
173+ if (fabs (interp.fir_params.sinc_time_fudge - 1.0) > 0.5)
160174 return 1e30 * (fabs (interp.fir_params.sinc_time_fudge - 1.0)) ;
161175
162− if (interp.fir_params.sinc_time_fudge > 1.25)
163− return 1e30 * (fabs (interp.fir_params.sinc_time_fudge - 1.25)) ;
164176
165− interp.middle = lrint (floor (left_half_cycles * UPSAMPLE_RATIO / interp.fir_params.sinc_time_fudge)) ;
166− interp.total_len = interp.middle + lrint (floor (right_half_cycles * UPSAMPLE_RATIO / interp.fir_params.sinc_time_fudge)) ;
177+ interp.middle = left_len ;
178+ interp.total_len = left_len + right_len ;
167179
168180 if (interp.total_len > ARRAY_LEN (interp.sinc))
169181 { printf ("\n\nError : interp.total_len > ARRAY_LEN (interp.sinc).\n") ;
@@ -178,13 +190,14 @@ fir_error (const GMatrix& gm) · 8 unmodified lines
178190
179191 error = evaluate_filter (&interp) ;
180192
181− oct_save (&interp) ;
182− printf ("%s %d : exit\n", __func__, __LINE__) ;
183− exit (1) ;
193+ test_count ++ ;
194+// printf ("%s %d : exit\n", __func__, __LINE__) ;
195+// exit (1) ;
184196
185197 if (error < best_error)
186198 { oct_save (&interp) ;
187199 best_error = error ;
200+ printf ("%12d best : %f\n", test_count, best_error) ;
188201 } ;
189202
190203 return error ;
@@ -195,7 +208,8 @@ calc_window (FIR_INTERP *interp, double * returned_error) · 4 unmodified lines
195208 { unsigned k ;
196209 double error, temp, x ;
197210
198− error = 0 ;
211+ /* Make sure left poly params are in range [0, 1]. */
212+ error = 0.0 ;
199213 for (k = 0 ; k < ARRAY_LEN (interp->fir_params.y_left) ; k++)
200214 { temp = fabs (interp->fir_params.y_left [k] - 0.5) ;
201215 if (temp > 0.5 && temp > error)
@@ -207,7 +221,8 @@ calc_window (FIR_INTERP *interp, double * returned_error) · 5 unmodified lines
207221 return 1 ;
208222 } ;
209223
210− error = 0 ;
224+ /* Make sure right poly params are in range [0, 1]. */
225+ error = 0.0 ;
211226 for (k = 0 ; k < ARRAY_LEN (interp->fir_params.y_right) ; k++)
212227 { temp = fabs (interp->fir_params.y_right [k] - 0.5) ;
213228 if (temp > 0.5 && temp > error)
@@ -219,11 +234,14 @@ calc_window (FIR_INTERP *interp, double * returned_error) · 5 unmodified lines
219234 return 1 ;
220235 } ;
221236
222− interp->left_window_poly [0] = interp->fir_params.y_left [0] ;
223− interp->left_window_poly [1] = 13.0/2 - 13.0/2 * interp->fir_params.y_left [0] + 27.0/2 * interp->fir_params.y_left [1] - 27.0/2 * interp->fir_params.y_left [2] ;
224− interp->left_window_poly [2] = -139.0/4 + 29.0/2 * interp->fir_params.y_left [0] - 189.0/4 * interp->fir_params.y_left [1] + 135.0/2 * interp->fir_params.y_left [2] ;
225− interp->left_window_poly [3] = 54 - 27.0/2 * interp->fir_params.y_left [0] + 54 * interp->fir_params.y_left [1] - 189.0/2 * interp->fir_params.y_left [2] ;
226− interp->left_window_poly [4] = -99.0/4 + 9.0/2 * interp->fir_params.y_left [0] - 81.0/4 * interp->fir_params.y_left [1] + 81.0/2 * interp->fir_params.y_left [2] ;
237+ /* Generate polynomial for left side of window. */
238+ interp->left_window_poly [0] = interp->fir_params.y_left [0] ;
239+ interp->left_window_poly [1] = 12.4166666667 - 12.4166666667 * interp->fir_params.y_left [0] + 31.25 * interp->fir_params.y_left [1] - 41.6666666667 * interp->fir_params.y_left [2] + 41.6666666667 * interp->fir_params.y_left [3] - 31.25 * interp->fir_params.y_left [4] ;
240+ interp->left_window_poly [2] = -140.756944444 + 58.2916666667 * interp->fir_params.y_left [0] - 231.770833333 * interp->fir_params.y_left [1] + 413.194444444 * interp->fir_params.y_left [2] - 447.916666667 * interp->fir_params.y_left [3] + 348.958333333 * interp->fir_params.y_left [4] ;
241+ interp->left_window_poly [3] = 571.614583333 - 135.416666667 * interp->fir_params.y_left [0] + 662.760416667 * interp->fir_params.y_left [1] - 1395.83333333 * interp->fir_params.y_left [2] + 1682.29166667 * interp->fir_params.y_left [3] - 1385.41666667 * interp->fir_params.y_left [4] ;
242+ interp->left_window_poly [4] = -1062.93402778 + 166.666666667 * interp->fir_params.y_left [0] - 917.96875 * interp->fir_params.y_left [1] + 2152.77777778 * interp->fir_params.y_left [2] - 2838.54166667 * interp->fir_params.y_left [3] + 2500. * interp->fir_params.y_left [4] ;
243+ interp->left_window_poly [5] = 917.96875 - 104.166666667 * interp->fir_params.y_left [0] + 618.489583333 * interp->fir_params.y_left [1] - 1562.5 * interp->fir_params.y_left [2] + 2213.54166667 * interp->fir_params.y_left [3] - 2083.33333333 * interp->fir_params.y_left [4] ;
244+ interp->left_window_poly [6] = -297.309027778 + 26.0416666667 * interp->fir_params.y_left [0] - 162.760416667 * interp->fir_params.y_left [1] + 434.027777778 * interp->fir_params.y_left [2] - 651.041666667 * interp->fir_params.y_left [3] + 651.041666667 * interp->fir_params.y_left [4] ;
227245
228246 /* Generate left side of window. */
229247 error = 0.0 ;
@@ -232,16 +250,20 @@ calc_window (FIR_INTERP *interp, double * returned_error) · 2 unmodified lines
232250 interp->window [k] = poly_evaluate (ARRAY_LEN (interp->left_window_poly) - 1, interp->left_window_poly, x) ;
233251 } ;
234252
235− if (fabs (interp->window [0] - 0.2) > 0.2)
253+ /* Ensure start value in range [0, 0,2]. */
254+ if (fabs (interp->window [0] - 0.1) > 0.1)
236255 { *returned_error = 1e16 * fabs (interp->window [0] - 0.1) ;
237256 return 1 ;
238257 } ;
239258
240− interp->right_window_poly [0] = 1 ;
241− interp->right_window_poly [1] = 0 ;
242− interp->right_window_poly [2] = -85.0/4 + 27 * interp->fir_params.y_right [0] - 27.0/4 * interp->fir_params.y_right [1] + interp->fir_params.y_right [2] ;
243− interp->right_window_poly [3] = 45 - 135.0/2 * interp->fir_params.y_right [0] + 27 * interp->fir_params.y_right [1] - 9.0/2 * interp->fir_params.y_right [2] ;
244− interp->right_window_poly [4] = -99.0/4 + 81.0/2 * interp->fir_params.y_right [0] - 81.0/4 * interp->fir_params.y_right [1] + 9.0/2 * interp->fir_params.y_right [2] ;
259+ /* Generate polynomial for right side of window. */
260+ interp->right_window_poly [0] = 1 ;
261+ interp->right_window_poly [1] = 0 ;
262+ interp->right_window_poly [2] = -83.4652777778 + 125. * interp->fir_params.y_right [0] - 62.5 * interp->fir_params.y_right [1] + 27.7777777778 * interp->fir_params.y_right [2] - 7.8125 * interp->fir_params.y_right [3] + interp->fir_params.y_right [4] ;
263+ interp->right_window_poly [3] = 446.614583333 - 802.083333333 * interp->fir_params.y_right [0] + 557.291666667 * interp->fir_params.y_right [1] - 270.833333333 * interp->fir_params.y_right [2] + 79.4270833333 * interp->fir_params.y_right [3] - 10.4166666667 * interp->fir_params.y_right [4] ;
264+ interp->right_window_poly [4] = -932.725694444 + 1848.95833333 * interp->fir_params.y_right [0] - 1536.45833333 * interp->fir_params.y_right [1] + 850.694444444 * interp->fir_params.y_right [2] - 266.927083333 * interp->fir_params.y_right [3] + 36.4583333333 * interp->fir_params.y_right [4] ;
265+ interp->right_window_poly [5] = 865.885416667 - 1822.91666667 * interp->fir_params.y_right [0] + 1692.70833333 * interp->fir_params.y_right [1] - 1041.66666667 * interp->fir_params.y_right [2] + 358.072916667 * interp->fir_params.y_right [3] - 52.0833333333 * interp->fir_params.y_right [4] ;
266+ interp->right_window_poly [6] = -297.309027778 + 651.041666667 * interp->fir_params.y_right [0] - 651.041666667 * interp->fir_params.y_right [1] + 434.027777778 * interp->fir_params.y_right [2] - 162.760416667 * interp->fir_params.y_right [3] + 26.0416666667 * interp->fir_params.y_right [4] ;
245267
246268 /* Generate right side of window. */
247269 error = 0.0 ;
@@ -250,12 +272,14 @@ calc_window (FIR_INTERP *interp, double * returned_error) · 2 unmodified lines
250272 interp->window [k] = poly_evaluate (ARRAY_LEN (interp->right_window_poly) - 1, interp->right_window_poly, x) ;
251273 } ;
252274
275+ /* Ensure end value in range [0, 0,4]. */
253276 k = interp->total_len - 1 ;
254− if (fabs (interp->window [k] - 0.2) > 0.2)
277+ if (fabs (interp->window [k] - 0.1) > 0.1)
255278 { *returned_error = 1e16 * fabs (interp->window [k] - 0.1) ;
256279 return 1 ;
257280 } ;
258281
282+ /* Ensure whole window is in [0, 1] range. */
259283 error = 0.0 ;
260284 for (k = 0 ; k < interp->total_len ; k++)
261285 { temp = fabs (interp->window [k] - 0.5) ;
@@ -268,6 +292,32 @@ calc_window (FIR_INTERP *interp, double * returned_error) · 6 unmodified lines
268292 return 1 ;
269293 } ;
270294
295+ /* Monotonicity of left side of window. */
296+ error = 0.0 ;
297+ for (k = 1 ; k < interp->middle ; k++)
298+ { temp = (interp->window [k - 1] - interp->window [k]) ;
299+ if (temp > 0.0)
300+ error += temp ;
301+ } ;
302+
303+ if (error > 0.0)
304+ { *returned_error = 1e14 * error ;
305+ return 1 ;
306+ } ;
307+
308+ /* Monotonicity of right side of window. */
309+ error = 0.0 ;
310+ for (k = interp->middle + 1 ; k < interp->total_len ; k++)
311+ { temp = (interp->window [k] - interp->window [k - 1]) ;
312+ if (temp > 0.0)
313+ error += temp ;
314+ } ;
315+
316+ if (error > 0.0)
317+ { *returned_error = 1e14 * error ;
318+ return 1 ;
319+ } ;
320+
271321 return 0 ;
272322 } /* calc_window */
273323

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t