// // Generate sine waves to test ADEV, FFT, or PSD tools. // // 27-Nov-2009 tvb // #include #include #include double pi = 3.14159265358979323; void main (int argc, char *argv[]) { double secs, sps, a[100], f[100]; long terms, j, k; // Usage message. if (argc < 4) { fprintf(stderr, "Usage:\n"); fprintf(stderr, " %s [secs] [sps] [ampl,freq]*\n", argv[0]); fprintf(stderr, "\nExample:\n"); fprintf(stderr, " %s 1 1000 1,60\n", argv[0]); fprintf(stderr, " %s 1 44100 1,440\n", argv[0]); fprintf(stderr, " %s 5 1200 1,60 0.5,120 2,150\n", argv[0]); exit(1); } // Get user arguments. secs = atof(argv[1]); sps = atof(argv[2]); if (secs < 1 || sps < 1) { fprintf(stderr, "invalid seconds or samples-per-second\n"); exit(1); } for (terms = 0; argc > 3; terms += 1, argc -= 1, argv += 1) { if (2 != sscanf(argv[3], "%lg,%lg", &a[terms], &f[terms])) { fprintf(stderr, "invalid amplitude,frequency pair: %s\n", argv[3]); exit(1); } } // Echo user arguments. fprintf(stderr, "%lg seconds at %lg Hz (samples per second)\n", secs, sps); fprintf(stderr, "output ="); for (j = 0; j < terms; j += 1) { fprintf(stderr, "%s %lg*sin(%lg*wt)", j ? " +" : "", a[j], f[j]); } fprintf(stderr, "\n"); // Generate composite sine wave output. for (k = 0; k <= secs * sps; k += 1) { double t = k / sps; double a_sum = 0.0; for (j = 0; j < terms; j += 1) { double w = 2 * pi * f[j]; a_sum += a[j] * sin(w * t); } printf("%.12lf\n", a_sum); } }