41#include "sigpr/EST_filter.h"
42#include "sigpr/EST_fft.h"
43#include "EST_wave_aux.h"
44#include "EST_TBuffer.h"
45#include "sigpr/EST_Window.h"
56 for (i = 0; i <
sig.num_samples(); ++i)
59 for (
j = 1;
j < a.
n(); ++
j)
71 for (i = 0; i < a.
n(); ++i)
73 r =
sig.a_no_check(i);
74 for (
j = 1;
j < a.
n(); ++
j)
78 for (i = a.
n(); i <
sig.num_samples(); ++i)
80 r =
sig.a_no_check(i);
81 for (
j = 1;
j < a.
n(); ++
j)
103 int i,
j, k, start, end, size;
113 for(i = 1; i <
lpc.num_frames() - 1; ++i)
115 start = (int)((
float)
lpc.t(i - 1) *
in_sig.sample_rate());
116 end = (int)((
float)
lpc.t(i + 1) *
in_sig.sample_rate());
117 if (end >
out_sig.num_samples())
139 for (k = 0,
j = start;
j < end; ++
j, ++k){
141 (int)((
float)
out_sub.a_no_check(k) *
160 for (start = 0, i = 0; i <
lpc.num_frames() - 1; ++i)
175 for (k = start; k < end; ++k)
179 sig.a_no_check(k) = (
short) s + res.a_no_check(k);
182 for (k = start; k < end; ++k)
187 sig.a_no_check(k) = (
short) s + res.a_no_check(k);
204 int order =
lpc.num_channels() - 1;
205 if (order < 0) order = 0;
207 float *
filt = walloc(
float,order+1);
208 short *
residual = res.values().memory();
212 for (k=0; k<order; k++)
214 for (start = k,
m = 0, i = 0; i <
lpc.num_frames() - 1; ++i)
219 for (
j=1;
j<
lpc.num_channels();
j++)
222 for (k = start; k < end; ++k,++
m)
225 for (
j = 1;
j < n; ++
j)
234 for (
j=0,i=order; i < k;
j++,i++)
244 for (
int j = 0;
j <
sig.num_channels(); ++
j)
245 for (
int i = 0; i <
sig.num_samples(); i++)
247 sig.a(i,
j) = (int)((
float)
sig.a(i,
j) + a * last);
259 for (
int j = 0;
j <
sig.num_channels(); ++
j)
260 for (
int i = 0; i <
sig.num_samples(); i++)
262 x =
sig.a_no_check(i,
j);
263 sig.a_no_check(i,
j) =
264 sig.a_no_check(i,
j) - int(a *
x_1);
271 out.resize(
sig.num_samples(),
sig.num_channels());
273 for (
int j = 0;
j <
sig.num_channels(); ++
j)
275 out.a_no_check(0,
j) =
sig.a_no_check(0,
j);
276 for (
int i = 1; i <
sig.num_samples(); i++)
277 out.a_no_check(i,
j) =
278 sig.a_no_check(i,
j) - int(a * (
float)
sig.a_no_check(i-1,
j));
284 out.resize(
sig.num_samples(),
sig.num_channels());
286 for (
int j = 0;
j <
sig.num_channels(); ++
j)
288 out.a_no_check(0,
j) =
sig.a_no_check(0,
j);
289 for (
int i = 1; i <
sig.num_samples(); i++)
290 out.a_no_check(i,
j) =
291 sig.a_no_check(i,
j) + int(a * (
float)
sig.a_no_check(i-1,
j));
295void simple_mean_smooth(
EST_Wave &c,
int n)
302 for (i = 0; (i < h); ++i)
307 sum += c.a_no_check(
j);
308 a[i] = sum /(
float) k;
314 for (
j = 0;
j < n; ++
j)
315 sum += c.a_no_check(i - h +
j);
316 a[i] = sum /(
float) k;
323 for (
j = 0;
j < k; ++
j)
324 sum += c.a_no_check(i - (k/2) +
j);
325 a[i] = sum /(
float) k;
329 c.a_no_check(i) = (
short)(a[i] + 0.5);
351 EST_error(
"Can't have negative delay !\n");
354 EST_error(
"Can't filter EST_Wave with given filter");
356 int i,
j,n=
in_sig.num_samples();
369 float *
in = walloc(
float,n);
370 for (i=0; i < n; ++i)
371 in[i] = (
float)
in_sig.a_no_check(i);
375 float *
out = walloc(
float,n);
377 for (i = 0; i < n; ++i)
424 cerr <<
"Requested filter order must be odd" <<
endl;
431 cerr <<
"Desired frequency response must have dimension 2^N" <<
endl;
438 for(i=0;i<
dummy.n();i++)
444 cerr <<
"Failed to design filter because FFT failed" <<
endl;
453 for(i=1; i<=mid ;i++)
456 float window = 0.5 + 0.5 *
cos(PI*(
float)i / (
float)mid);
466EST_FVector design_high_or_low_pass_FIR_filter(
int sample_rate,
472 if (sample_rate <= 0){
473 cerr <<
"Can't design a FIR filter for a sampling rate of "
474 << sample_rate <<
endl;
501 return design_FIR_filter(
freq_resp, order);
504EST_FVector design_lowpass_FIR_filter(
int sample_rate,
int freq,
int order)
506 return design_high_or_low_pass_FIR_filter(sample_rate,
507 freq, order, 1.0, 0.0);
510EST_FVector design_highpass_FIR_filter(
int sample_rate,
int freq,
int order)
512 return design_high_or_low_pass_FIR_filter(sample_rate,
513 freq, order, 0.0, 1.0);
547void FIRlowpass_double_filter(
EST_Wave &
in_sig,
int freq,
int order)
582void FIRhighpass_double_filter(
EST_Wave &
in_sig,
int freq,
int order)
INLINE int n() const
number of items in vector.
INLINE const T & a_no_check(int n) const
read-only const access operator: without bounds checking
short & a(int i, int channel=0)
int sample_rate() const
return the sampling rate (frequency)
int num_samples() const
return the number of samples in the waveform
static void make_window(EST_TBuffer< float > &window_vals, int size, const char *name, int window_centre)