ref: 9bddfb82cc8aa239fe499dcfa3ed32edc72f2ed6
parent: a188768fb3df7ca7cce2c0abaa58ff945cdf4ea4
author: cbagwell <cbagwell>
date: Tue Dec 7 15:20:10 EST 1999
Adding new test file, corr.c
--- a/Changelog
+++ b/Changelog
@@ -58,6 +58,8 @@
o Fixed array overrun bug in rate effect as pointed out by Ian
Donaldson.
o Fixed clip24() range as pointed out by Ted Powell.
+ o Fixed possible segfault in echos effect, as pointed out by Zinx
+ Verituse.
sox-12.16
---------
--- /dev/null
+++ b/test/corr.c
@@ -1,0 +1,187 @@
+/*
+ corr.c
+ print correlation coeff's for 2 input files of 'short' values
+
+ Copyright (C) 1999 Stanley J. Brooks <stabro@megsinet.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+#include <string.h>
+// for open,read,write:
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+// for clock/time:
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#define BLEN 0x20000
+#define HLEN 0x1000
+
+static u_int32_t dist[0x10000];
+#define dis0 (dist+0x8000)
+
+static short buff1[BLEN];
+static short buff2[BLEN];
+static short hist[HLEN];
+
+inline static double square(double x) {return (x*x);}
+
+static void readin(int fd, short *p, int bs)
+{
+ int r;
+ do {
+ r=read(fd,(char*)p,2*bs);
+ }while (r==-1 && errno==EINTR);
+ if (r==-1 || r!=2*bs) {
+ perror("Input error");
+ exit(1);
+ }
+}
+
+int main(int argct, char **argv)
+{
+ int fd1,fd2;
+ int avgn=0,assay=0,code=0;
+ int hx=0,hsum=0;
+ int len,len1,len2,x,r;
+ char *fnam1,*fnam2;
+ double v1=0,v2=0,s1=0;
+
+ /*
+ * Parse the command line arguments
+ */
+ while (*++argv && **argv == '-')
+ while (*(++*argv))
+ switch (**argv) {
+ case 'a':
+ assay=1;
+ break;
+ case 'c':
+ code=1;
+ break;
+ case 'h':
+ fprintf(stderr,"./stat [-n avgn] <file>\n");
+ break;
+ case 'n':
+ if (!*++*argv) { // end of this param string
+ if (!argv[1]) break;
+ ++argv;
+ }
+ avgn=atoi(*argv);
+ *argv += strlen(*argv)-1; // skip to end-1 of this param string
+ break;
+ }
+
+ if (avgn<=0) avgn=1; else if (avgn>HLEN) avgn=HLEN;
+ bzero(hist,sizeof(hist));
+
+ fnam1=*argv++;
+ fd1=open(fnam1,O_RDWR);
+ if (fd1<0) {
+ fprintf(stderr,"Open: %s %s\n",fnam1,strerror(errno)); return(1);
+ }
+ len1=lseek(fd1,0,SEEK_END);
+ r=lseek(fd1,0,SEEK_SET);
+
+ fnam2=*argv++;
+ fd2=open(fnam2,O_RDWR);
+ if (fd2<0) {
+ fprintf(stderr,"Open: %s %s\n",fnam2,strerror(errno)); return(1);
+ }
+ len2=lseek(fd2,0,SEEK_END);
+ r=lseek(fd2,0,SEEK_SET);
+
+ bzero(dist,sizeof(dist));
+ len = (len1<len2)? len1:len2;
+ len /= 2; /* now len is number of shorts data to read */
+ for (x=0; x<len; ){
+ int bs;
+ int j;
+ double c11=0, c12=0, c22=0;
+
+ bs=len-x; if (bs>BLEN) bs=BLEN; /* number of shorts to read */
+
+ readin(fd1,buff1,bs);
+ readin(fd2,buff2,bs);
+
+ for (j=0; j<bs; j++) {
+ c11 += buff1[j]*buff1[j];
+ c12 += buff1[j]*buff2[j];
+ c22 += buff2[j]*buff2[j];
+ }
+ c11 /= bs;
+ c12 /= bs;
+ c22 /= bs;
+
+ {
+ double d11=(c11+2*c12+c22)/4;
+ double d22=(c11-2*c12+c22)/4;
+ double d12=(c11-c22)/4;
+
+ printf("%8.1f%8.1f cf=%f",sqrt(c11),sqrt(c22),c12/sqrt(c11*c22));
+ printf(" | %8.1f%8.1f cf=%f\n",sqrt(d11),sqrt(d22),d12/sqrt(d11*d22));
+ }
+
+ for (j=0; j<bs; j++) {
+ int y;
+ //y=(abs(buff1[j])<abs(buff2[j]))? buff1[j]:buff2[j];
+ y=(buff1[j]+buff2[j]+1)/2;
+ hsum -= hist[hx];
+ hsum += y;
+ hist[hx] = y;
+ if (++hx == avgn) hx=0;
+ s1 += abs(y);
+ v1 += hsum;
+ v2 += square(hsum);
+ y = (hsum+avgn/2)/avgn;
+ dis0[y]++;
+ }
+
+ x += bs;
+ }
+ v1 /= len;
+ v2 /= len;
+ printf("%8d %5d=n %10.2f=avg %10.2f=rms\n",len,avgn,v1/avgn,sqrt(v2-v1*v1)/avgn);
+
+ if (code) {
+ int32_t j,tot,cut;
+ cut = len/2;
+ for (tot=0,j=0; j<0x8000; j++) {
+ int32_t tot1;
+ tot1 = tot+dis0[j];
+ if (j!=0) tot1 += dis0[-j];
+ if (tot1>cut && tot<=cut) {
+ printf(" |%d| %d of %d\n",j-1,tot,cut);
+ cut += (len-cut)/2;
+ }
+ tot=tot1;
+ }
+ }
+
+ if (assay)
+ for (x=-0x8000; x<=0x7fff; x++) {
+ printf("%6d %6d\n",x,dis0[x]);
+ }
+
+ return 0;
+}
+