/* * Updates the fourier transform of a sample window of N samples. * Uses a sample cache to update the frequencies. */ void sdft(uint8_t new_sample, complex *freq, complex *coefficients) { uint8_t old = get_old_sample(); insert_sample(new_sample); int8_t delta = (int8_t)(new_sample - old); for (uint8_t i=0; i<N; i++) { freq[i] = mul(addi(freq[i], delta), coefficients[i]); } }
void process_signal( void) { char *buff = malloc( CF_nread * CF_chans * CF_bytes); if( !buff) bailout( "not enough memory for input buffer"); while( 1) { int i, q; double f; q = read_soundcard( buff); // Unpack the input buffer and scale to -1..+1 for further processing. if( CF_bytes == 1) { unsigned char *dp = (unsigned char *) buff; if( CF_chans == 1) for( i=0; i<q; i++) { f = *dp++; insert_sample( &left, (f - 127)/128); maybe_do_fft(); } else // CF_chans == 2 for( i=0; i<q; i++) { f = *dp++; insert_sample( &left, (f - 127)/128); f = *dp++; insert_sample( &right, (f - 127)/128); maybe_do_fft(); } } else if( CF_bytes == 2) { short *dp = (short *) buff; if( CF_chans == 1) for( i=0; i<q; i++) { f = *dp++; insert_sample( &left, f/32768); maybe_do_fft(); } else // CF_chans == 2 for( i=0; i<q; i++) { f = *dp++; insert_sample( &left, f/32768); f = *dp++; insert_sample( &right, f/32768); maybe_do_fft(); } } else if( CF_bytes == 3) { char *dp = buff; if( CF_chans == 1) for( i=0; i<q; i++) { f = (* (int *) dp) & 0xffffff; dp += 3; insert_sample( &left, f/8388608); maybe_do_fft(); } else // CF_chans == 2 for( i=0; i<q; i++) { f = (* (int *) dp) & 0xffffff; dp += 3; insert_sample( &left, f/8388608); f = (* (int *) dp) & 0xffffff; dp += 3; insert_sample( &right, f/8388608); maybe_do_fft(); } } else if( CF_bytes == 4) { int *dp = (int *) buff; if( CF_chans == 1) for( i=0; i<q; i++) { f = *dp++; insert_sample( &left, f/2147483648UL); maybe_do_fft(); } else // CF_chans == 2 for( i=0; i<q; i++) { f = *dp++; insert_sample( &left, f/2147483648UL); f = *dp++; insert_sample( &right, f/2147483648UL); maybe_do_fft(); } } } }