diff -urN midi_prog-/buf.c midi_prog/buf.c --- midi_prog-/buf.c Fri Aug 7 00:00:00 2015 +++ midi_prog/buf.c Mon Aug 10 00:00:00 2015 @@ -151,3 +151,144 @@ if(d == 0) return v; return v + (rbuf_get_arr_cpx(rb, arr_idx((si + 1), rb->n)) - v) * d; } + + +/* tbuf */ + +void +tbuf_init(struct tbuf *tb, double smp_freq, double wsec, int is_complex) +{ + int n = (int) ceil(smp_freq * wsec + 1); + rbuf_init_alloc(&tb->rb, n, is_complex); + tb->smp_freq = smp_freq; + tb->wsec = wsec; +} + +double +tbuf_sec_to_sridx(struct tbuf *tb, double sec) +{ + return tb->smp_freq * sec; +} + +double +tbuf_sridx_to_sec(struct tbuf *tb, double sridx) +{ + return sridx / tb->smp_freq; +} + +double +tbuf_oldest_sec(struct tbuf *tb) +{ + int sridx = rbuf_oldest(&tb->rb); + return tbuf_sridx_to_sec(tb, sridx); +} + +double +tbuf_newest_sec(struct tbuf *tb) +{ + int sridx = rbuf_newest(&tb->rb); + return tbuf_sridx_to_sec(tb, sridx); +} + +double +tbuf_next_sec(struct tbuf *tb) +{ + int sridx = rbuf_next(&tb->rb); + return tbuf_sridx_to_sec(tb, sridx); +} + +int +tbuf_is_over_sec(struct tbuf *tb, double sec) +{ + return tbuf_next_sec(tb) <= sec; +} + +void +tbuf_add_dbl(struct tbuf *tb, double v) +{ + rbuf_add_dbl(&tb->rb, v); +} + +void +tbuf_add_cpx(struct tbuf *tb, double complex v) +{ + rbuf_add_cpx(&tb->rb, v); +} + +double +tbuf_get_dbl(struct tbuf *tb, double sec) +{ + double sridx = tbuf_sec_to_sridx(tb, sec); + return rbuf_get_dbl(&tb->rb, sridx); +} + +double complex +tbuf_get_cpx(struct tbuf *tb, double sec) +{ + double sridx = tbuf_sec_to_sridx(tb, sec); + return rbuf_get_cpx(&tb->rb, sridx); +} + + +/* sbuf */ + +void +sbuf_init(struct sbuf *sb, double smp_freq, double wsec) +{ + int is_complex = 1; + tbuf_init(&sb->tb, smp_freq, wsec, is_complex); + sb->sum = 0; +} + +void +sbuf_add(struct sbuf *sb, double complex v) +{ + sb->sum += v; + tbuf_add_cpx(&sb->tb, sb->sum); +} + +double complex +sbuf_sum(struct sbuf *sb, double from_sec, double to_sec) +{ + return tbuf_get_cpx(&sb->tb, to_sec) - tbuf_get_cpx(&sb->tb, from_sec); +} + +double complex +sbuf_sum_mean(struct sbuf *sb, double from_sec, double to_sec) +{ + double wsec = to_sec - from_sec; + double dn = tbuf_sec_to_sridx(&sb->tb, wsec); + return sbuf_sum(sb, from_sec, to_sec) / dn; +} + +double complex +sbuf_sum_mean_all(struct sbuf *sb) +{ + double from_sec = tbuf_oldest_sec(&sb->tb); + double to_sec = tbuf_newest_sec(&sb->tb); + return sbuf_sum_mean(sb, from_sec, to_sec); +} + + +/* abuf */ + +void +abuf_init(struct abuf *ab, double smp_freq, double wsec) +{ + int is_complex = 0; + tbuf_init(&ab->tb, smp_freq, wsec, is_complex); + ab->max_v = 0; + ab->sum = 0; +} + +void +abuf_add(struct abuf *ab, double v) +{ + int sridx = rbuf_oldest(&ab->tb.rb); + double ov = rbuf_get_dbl(&ab->tb.rb, sridx); + + tbuf_add_dbl(&ab->tb, v); + + if(ab->max_v < v) ab->max_v = v; + ab->sum += v - ov; +} diff -urN midi_prog-/buf.h midi_prog/buf.h --- midi_prog-/buf.h Fri Aug 7 00:00:00 2015 +++ midi_prog/buf.h Mon Aug 10 00:00:00 2015 @@ -36,4 +36,50 @@ double rbuf_get_dbl(struct rbuf *rb, double sridx); double complex rbuf_get_cpx(struct rbuf *rb, double sridx); + +struct tbuf{ + struct rbuf rb; + double smp_freq; + double wsec; +}; + +void tbuf_init(struct tbuf *tb, double smp_freq, double wsec, int is_complex); + +/* sridx : serial index, rb->cnt scale */ +double tbuf_sec_to_sridx(struct tbuf *tb, double sec); +double tbuf_sridx_to_sec(struct tbuf *tb, double sridx); + +double tbuf_oldest_sec(struct tbuf *tb); +double tbuf_newest_sec(struct tbuf *tb); +double tbuf_next_sec(struct tbuf *tb); +int tbuf_is_over_sec(struct tbuf *tb, double sec); + +void tbuf_add_dbl(struct tbuf *tb, double v); +void tbuf_add_cpx(struct tbuf *tb, double complex v); + +double tbuf_get_dbl(struct tbuf *tb, double sec); +double complex tbuf_get_cpx(struct tbuf *tb, double sec); + + +struct sbuf{ + struct tbuf tb; + double complex sum; +}; + +void sbuf_init(struct sbuf *sb, double smp_freq, double wsec); +void sbuf_add(struct sbuf *sb, double complex v); +double complex sbuf_sum(struct sbuf *sb, double from_sec, double to_sec); +double complex sbuf_sum_mean(struct sbuf *sb, double from_sec, double to_sec); +double complex sbuf_sum_mean_all(struct sbuf *sb); + + +struct abuf{ + struct tbuf tb; + double max_v; + double sum; +}; + +void abuf_init(struct abuf *ab, double smp_freq, double wsec); +void abuf_add(struct abuf *ab, double v); + #endif diff -urN midi_prog-/tool.c midi_prog/tool.c --- midi_prog-/tool.c Fri Aug 7 00:00:00 2015 +++ midi_prog/tool.c Mon Aug 10 00:00:00 2015 @@ -1,5 +1,6 @@ #include "util.h" #include "in.h" +#include "buf.h" int main(int ac, char **av) @@ -7,9 +8,18 @@ in_rec_t in; double v; + struct sbuf sb; + double freq = 440.0; + int wn = 8; + double wsec = wn / freq; + in_init(&in, ac, av); + sbuf_init(&sb, in.smp_freq, wsec); while(in_do_mono(&in, &v) != EOF){ + double complex arg = I * 2 * M_PI * freq * tbuf_next_sec(&sb.tb); + sbuf_add(&sb, v * cexp(-arg)); + v = cabs( sbuf_sum_mean_all(&sb) ); printf("v=%f\n", v); } return 0;