int main( int argc, char **argv ) { Analysis *scmanal = new Analysis( 3, 2, 0, "", argc, argv ); char output_comment[ 256 ]; snprintf( output_comment, 256, "(%s) + (%s)", scmanal->get_comment( 0 ), scmanal->get_comment( 1 ) ); scmanal->set_comment( 2, output_comment ); if ( scmanal->get_type( 0 ) != scmanal->get_type( 1 ) ) { fprintf( stderr, "%s: Input file types differ.\n", argv[ 0 ] ); exit( 1 ); } if ( scmanal->get_length( 0 ) != scmanal->get_length( 1 ) ) { fprintf( stderr, "%s: Input file sizes differ.\n", argv[ 0 ] ); if ( scmanal->get_type( 0 ) != TIME_DOMAIN ) { exit( 1 ); } } size_t length = MINVAL( scmanal->get_length( 0 ), scmanal->get_length( 1 ) ); if ( (scmanal->get_begin( 0 ) != scmanal->get_begin( 1 )) || (scmanal->get_compl_begin( 0 ) != scmanal->get_compl_begin( 1 )) || (scmanal->get_compl_end( 0 ) != scmanal->get_compl_end( 1 ))) { fprintf( stderr, "%s: Input file spans differ.\n", argv[ 0 ] ); exit( 1 ); } if ( ( scmanal->get_end( 0 ) != scmanal->get_end( 1 ) ) && ( scmanal->get_type( 0 ) != TIME_DOMAIN ) ) { fprintf( stderr, "%s: Input file ends differ.\n", argv[ 0 ] ); exit( 1 ); } double min_end = MINVAL( scmanal->get_end( 0 ), scmanal->get_end( 1 ) ); scmanal->set_type( 2, scmanal->get_type( 0 ) ); scmanal->set_begin( 2, scmanal->get_begin( 0 ) ); scmanal->set_end( 2, min_end ); scmanal->set_compl_begin( 2, scmanal->get_compl_begin( 0 ) ); scmanal->set_compl_end( 2, scmanal->get_compl_end( 0 ) ); scmanal->make_outputs( length ); double *input_1 = scmanal->get_file( 0 ), *input_2 = scmanal->get_file( 1 ), *output = scmanal->get_file( 2 ); for ( uint i = 0; i < length; i++ ) { output[ i ] = input_1[ i ] + input_2[ i ]; } delete scmanal; }
int main( int argc, char **argv ) { Analysis *scmanal = new Analysis( 1, 1, 1, "AIFF_OUTPUT", argc, argv ); char *output_aiff_filename = argv[ 2 ]; assert( scmanal->get_type( 0 ) == TIME_DOMAIN ); /* Open AIFF input */ SF_INFO aiff_info; aiff_info.format = SF_FORMAT_AIFF | SF_FORMAT_PCM_24; aiff_info.frames = scmanal->get_length( 0 ); aiff_info.samplerate = 2 * (scmanal->get_compl_end( 0 ) - scmanal->get_compl_begin( 0 )); aiff_info.channels = 2; aiff_info.sections = 0; aiff_info.seekable = 0; SNDFILE *aiff = sf_open( output_aiff_filename, SFM_WRITE, &aiff_info ); if ( aiff == NULL ) { fprintf( stderr, "sf_open: %s\n", sf_strerror( NULL ) ); exit( 1 ); } double *file_samples = scmanal->get_file( 0 ); uint length = scmanal->get_length( 0 ); uint overflow_count = 0; for ( uint i = 0; i < length; i++ ) { int samples[ 2 ]; if ( fabs( file_samples[ i ] ) >= 1<<23 ) { // fprintf( stderr, "Warning: Possible overflow at sample %d\n", i ); overflow_count++; } samples[ 0 ] = samples[ 1 ] = 256.0 * file_samples[ i ]; assert( sf_writef_int( aiff, samples, 1 ) == 1 ); } if ( overflow_count ) { fprintf( stderr, "Warning: %d possible overflows\n", overflow_count ); } delete scmanal; assert( sf_close( aiff ) == 0 ); }
int main( int argc, char **argv ) { Analysis *scmanal = new Analysis( 2, 1, 3, "R C TAU", argc, argv ); double r_ohms = atof( argv[ 3 ] ); double c_farads = atof( argv[ 4 ] ); double tau_seconds = atof( argv[ 5 ] ); size_t length = scmanal->get_length( 0 ); if ( scmanal->get_type( 0 ) != FFT_DOMAIN ) { fprintf( stderr, "%s: Input is not FFT domain.\n", argv[ 0 ] ); exit( 1 ); } char output_comment[ 256 ]; snprintf( output_comment, 256, "RCDelay(%s, R=%f, C=%f, tau=%f)", scmanal->get_comment( 0 ), r_ohms, c_farads, tau_seconds ); scmanal->set_comment( 1, output_comment ); double begin_freq = scmanal->get_begin( 0 ); double end_freq = scmanal->get_end( 0 ); scmanal->set_type( 1, FFT_DOMAIN ); scmanal->set_begin( 1, begin_freq ); scmanal->set_end( 1, end_freq ); scmanal->set_compl_begin( 1, scmanal->get_compl_begin( 0 ) ); scmanal->set_compl_end( 1, scmanal->get_compl_end( 0 ) ); scmanal->make_outputs( length ); double *input = scmanal->get_file( 0 ), *output = scmanal->get_file( 1 ); /* DC is not delayed */ output[ 0 ] = input[ 0 ]; for ( uint i = 1; i < (length+1) / 2; i++ ) { double a_real = input[ i ]; double a_imag = input[ length - i ]; double frequency = begin_freq + ((end_freq - begin_freq) * 2 * i / length); double delay = tau_seconds + ((M_PI / 2) - atan(r_ohms * c_farads * 2 * M_PI * frequency)) / (2 * M_PI * frequency); double argument = - 2 * M_PI * delay * frequency; double b_real = cos( argument ); double b_imag = sin( argument ); output[ i ] = a_real * b_real - a_imag * b_imag; output[ length - i ] = a_imag * b_real + a_real * b_imag; } if ( length % 2 == 0 ) { output[ length / 2 ] = 0; } delete scmanal; }