1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <bits/nan.h> 5 6 #include "gverb.h" 7 8 void run(const char *desc); 9 10 #define rdtscll(val) __asm__ __volatile__("rdtsc" : "=A" (val)) 11 #define SIZE 48000 12 13 float in[SIZE], out[2][SIZE]; 14 ty_gverb *verb; 15 16 int main(int argc, char *argv[]) 17 { 18 long long then, now; 19 unsigned int i; 20 float v; 21 22 verb = gverb_new(48000, 300.0f, 50.0f, 7.0f, 0.5f, 15.0f, 0.5f, 0.5f, 0.5f); 23 for (i=0; i<SIZE; i++) { 24 in[i] = sin((double)i * 0.03); 25 } 26 run("slow sin"); 27 28 for (i=0; i<SIZE; i++) { 29 in[i] = sin((double)i); 30 } 31 run("fast sin"); 32 33 v = 0.0000001535354543f; 34 for (i=0; i<SIZE; i++) { 35 in[i] = v; 36 v *= 0.0001f; 37 } 38 run("small numbers"); 39 40 v = 1.0f; 41 for (i=0; i<SIZE; i++) { 42 in[i] = v; 43 v *= 10.0f; 44 } 45 run("big numbers"); 46 47 for (i=0; i<SIZE/2; i++) { 48 in[i] = sin((double)i); 49 } 50 for (; i<SIZE; i++) { 51 in[i] = i % 50 * 0.0000000001543534f; 52 } 53 run("sin then small"); 54 55 for (i=0; i<SIZE/2; i++) { 56 in[i] = sin((double)i); 57 } 58 for (; i<SIZE; i++) { 59 in[i] = 0.0f; 60 } 61 run("sin then zero"); 62 63 for (i=0; i<SIZE; i++) { 64 in[i] = 0.0f; 65 } 66 run("all zeros"); 67 68 for (i=0; i<SIZE; i++) { 69 in[i] = 0.00000000432432f; 70 } 71 run("small constant"); 72 73 v = 1.0f; 74 for (i=0; i<SIZE; i++) { 75 if (random() > RAND_MAX / 5) { 76 v *= -1.0f; 77 } 78 v *= -1.0f; 79 in[i] = 1.0f; 80 } 81 run("+0dB pulse constant"); 82 83 for (i=0; i<SIZE; i++) { 84 in[i] = 1.0e100f; 85 } 86 run("+lots dB constant"); 87 88 rdtscll(then); 89 gverb_flush(verb); 90 rdtscll(now); 91 printf("flush took %lld cycles\n", now-then); 92 93 return 0; 94 } 95 96 void run(const char *desc) 97 { 98 unsigned int i; 99 long long then, now; 100 101 // total flush test: verb = gverb_new(48000, 300.0f, 50.0f, 7.0f, 0.5f, 15.0f, 0.5f, 0.5f, 0.5f); 102 rdtscll(then); 103 for (i=0; i<SIZE; i++) { 104 //printf("%f\n", in[i]); 105 gverb_do(verb, in[i], out[0]+i, out[1]+i); 106 } 107 rdtscll(now); 108 printf("%s took %lld cycles/sample\n", desc, (now - then) / (long long)SIZE); 109 gverb_flush(verb); 110 } 111