42 #include "EST_system.h"
44 #include "sigpr/EST_Window.h"
45 #include "EST_TNamedEnum.h"
50 static inline int min(
int a,
int b) {
return (a<b)?a:b; }
51 static inline int max(
int a,
int b) {
return (a>b)?a:b; }
65 for(
int i=0; i<size; i++ )
75 if( window_centre < 0 ) {
77 const float k = 2.0 / (float)size;
84 r_window[end-i] = r_window[i];
89 const float k_left = 1.0 / (float) (window_centre+1);
90 const float k_right = 1.0 / (float) (size-(window_centre+1));
96 r_window[i] = i * k_left;
99 const int righthand_size = size-1-window_centre;
100 for( i=0; i<righthand_size; ++i )
101 r_window[end-i] = i * k_right;
112 if( window_centre < 0 ){
119 k = 2.0 * M_PI / size;
121 r_window[end-i] = r_window[i] = 0.5 - 0.5 * cos(k * (i + 0.5));
128 int effective_size = (2*window_centre)+1;
129 k = 2.0 * M_PI / effective_size;
131 r_window[i] = 0.5 - 0.5 * cos(k * (i + 0.5));
134 const int righthand_size = size-1-window_centre;
135 effective_size = (2*righthand_size)+1;
136 k = 2.0 * M_PI / effective_size;
137 for( i=0; i<righthand_size; ++i )
138 r_window[end-i] = 0.5 - 0.5 * cos(k * (i + 0.5));
145 int i, c, end=size-1;
149 if( window_centre < 0 ){
151 k = 2.0 * M_PI / size;
156 for( i=0; i<c; i++ ){
157 r_window[i] = 0.54 - 0.46 * cos(k * (i + 0.5));
158 r_window[end-i] = r_window[i];
166 int effective_size = (2*window_centre)+1;
167 k = 2.0 * M_PI / effective_size;
168 for( i=0; i<c ; ++i )
169 r_window[i] = 0.54 - 0.46 * cos(k * (i + 0.5));
172 const int righthand_size = size-1-window_centre;
173 effective_size = (2*righthand_size)+1;
174 k = 2.0 * M_PI / effective_size;
175 for( i=0; i<righthand_size; ++i )
176 r_window[end-i] = 0.54 - 0.46 * cos(k * (i + 0.5));
186 typedef enum EST_WindowType {
194 typedef struct Info {
196 const char *description;
201 { wf_none, {
"none" },
202 {NULL,
"unknown window type"}},
203 { wf_rectangle, {
"rectangle",
"rect",
"rectangular"},
204 {Rectangular,
"Rectangular window"}},
205 { wf_triangle, {
"triangle",
"tri",
"triangular"},
206 {Triangular,
"Triangular window"}},
207 { wf_hanning, {
"hanning",
"han"},
208 {Hanning,
"Hanning window"}},
209 { wf_hamming, {
"hamming",
"ham"},
210 {Hamming,
"Hamming window"}},
211 { wf_none, { NULL }},
218 EST_WindowType key = map.token(name);
223 cerr <<
"no such window type %s" << name << endl;
227 return map.info(key).func;
232 EST_WindowType key = map.token(name);
234 return map.info(key).description;
241 static float find_dc(
const EST_Wave &sig,
int start,
int size)
246 start = max(0, start);
249 for(i=0; i<size; i++)
250 sum += sig.a_no_check(start+i);
252 return (sum / (
float)size);
256 const char *name,
int window_centre )
259 window_vals.
ensure(size, (
bool)FALSE);
264 const char *name,
int window_centre )
268 fwindow.
ensure(size, (
bool)FALSE);
271 for (
int i = 0; i < size; ++i)
272 window_vals[i] = fwindow[i];
276 EST_WindowFunc *make_window,
286 window.
ensure(size, (
bool)FALSE);
287 dc = find_dc(sig, start, size);
294 for(i=0; i<size && start+i<0; i++)
298 window[i] = (window_vals(i) * (sig.
a(start + i) - dc) + dc);
310 EST_WindowFunc *wf =
creator(window_name,
true);
315 EST_WindowFunc *make_window,
339 else if (frame.
length() < size)
341 cerr <<
"Frame is wrong size: expected " << size <<
" got "
342 << frame.
length() << endl;
353 dc = find_dc(sig, start, size);
360 for(i = 0; i < size && start+i< 0; i++)
363 for (; (i < size) && (start + i < sig.
num_samples()); i++)
364 frame.
a_no_check(i) = (window_vals(i) * (sig.a_no_check(start + i) - dc) + dc);
366 for(; i < frame.
length(); i++)
385 for(
int n=0; n< map.n() ; n++)
387 const char *nm = map.name(map.token(n));
388 const char *d = map.info(map.token(n)).
description;
399 for(
int n=0; n< map.n() ; n++)
401 const char *nm = map.name(map.token(n));
412 #if defined(INSTANTIATE_TEMPLATES)
414 #include "../base_class/EST_TNamedEnum.cc"