diff options
author | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2003-10-24 13:36:13 +0000 |
---|---|---|
committer | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2003-10-24 13:36:13 +0000 |
commit | 5d65033efcc9841323d9ca6e892017199b7341d3 (patch) | |
tree | d4c77fec93e39cbca1d03e57fd0973c975f21ad9 /fxsdump.c | |
parent | 9665f8f22b65b636199392066ac11c3883d7363c (diff) |
fxsdump
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@257 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'fxsdump.c')
-rwxr-xr-x | fxsdump.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/fxsdump.c b/fxsdump.c new file mode 100755 index 0000000..0451ca3 --- /dev/null +++ b/fxsdump.c @@ -0,0 +1,136 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <linux/zaptel.h> +#include <math.h> + +#include "coeffs.h" + +#define FREQ 1000.0 +#define LEVEL 16384.0 + +#define FIRLEN (sizeof(coeffs) / sizeof(coeffs[0])) + +int firguess(int sample) +{ + static float hist[FIRLEN] = { 0, }; + int x; + float sum; + for (x=FIRLEN-2;x>=0;x--) + hist[x + 1] = hist[x]; + hist[0] = sample; + sum = 0; + for (x=0;x<FIRLEN;x++) { + sum += hist[x] * (float)coeffs[x]; + } + sum /= 32767.0; + if (sum > 32767.0) + sum = 32767.0; + if (sum < -32768.0) + sum = -32768.0; + return (int)sum; +} + +int obufnext(void) +{ + static int pos = 0; + static int spos = 0; + float res; + if (++spos > 100) { + res = LEVEL * sin(2.0 * FREQ * M_PI * (float)pos / 8000.0); + if (res > 32767.0) + res = 32767.0; + if (res < -32768.0) + res = -32768.0; + + pos++; + } else { + res = 0.0; + spos++; + } + return (int)res; +} + +int percent(int a, int b) +{ + float af = a; + float bf = b; + if (!b) + return 0; + return (int)((af/bf) * 100.0); +} + +int main() +{ + int fd; + int fdo,fdo2,fdo3; + int res, x; + int z=0; + short ibuf[512]; + short obuf[512]; + short pred[512]; + fd = open("/dev/zap/1", O_RDWR); + if (fd < 0) { + fprintf(stderr, "open: %s\n", strerror(errno)); + exit(1); + } + fdo = open("datain.raw", O_WRONLY | O_TRUNC | O_CREAT); + fdo2 = open("dataout.raw", O_WRONLY | O_TRUNC | O_CREAT); + fdo3 = open("datapred.raw", O_WRONLY | O_TRUNC | O_CREAT); + x = 1; +#if 0 + if (ioctl(fd, ZT_AUDIOMODE, &x)) { + fprintf(stderr, "audiomode: %s\n", strerror(errno)); + exit(1); + } + x = 1; + if (ioctl(fd, ZT_SETLINEAR, &x)) { + fprintf(stderr, "linear: %s\n", strerror(errno)); + exit(1); + } +#endif + for (x=0;x<sizeof(obuf)/sizeof(obuf[0]);x++) { + obuf[x] = obufnext(); + } + x = ZT_FLUSH_BOTH; + if (ioctl(fd, ZT_FLUSH, &x)) { + fprintf(stderr, "flush: %s\n", strerror(errno)); + exit(1); + } + for (;;) { + for (x=0;x<sizeof(obuf) / sizeof(obuf[0]); x++) + obuf[x] = htons(obuf[x]); + res = write(fd, obuf, sizeof(obuf)); + if (res < sizeof(obuf)) { + fprintf(stderr, "Write Buff: %d/%s\n", res, strerror(errno)); + exit(1); + } + res = read(fd, ibuf, sizeof(ibuf)); + if (res < sizeof(ibuf)) { + fprintf(stderr, "Buff: %d/%s\n", res, strerror(errno)); + exit(1); + } + for (x=0;x<sizeof(ibuf) / sizeof(ibuf[0]); x++) + ibuf[x] = ntohs(ibuf[x]); + for (x=0;x<sizeof(obuf) / sizeof(obuf[0]); x++) + obuf[x] = ntohs(obuf[x]); + for (x=0;x<sizeof(pred) / sizeof(pred[0]); x++) + pred[x] = firguess(obuf[x]); + write(fdo, ibuf, sizeof(ibuf)); + write(fdo2, obuf, sizeof(obuf)); + write(fdo3, pred, sizeof(pred)); + for (x=0;x<sizeof(ibuf)/sizeof(ibuf[0]);x++) { + printf("(%5d/%5d/%5d) ", percent(ibuf[x], pred[x]) /*, (int)obuf[x] */, (int)ibuf[x], (int)pred[x]); + obuf[x] = obufnext(); + z++; + if (z == 4) { + printf("\n"); + z = 0; + } + } + } +} |