#include #include #include "DFT8Turbo.h" #include #include #define MAX_FREQS (24) #define OCTAVES (5) #define TARGFREQ 8000.0 /* * The first thought was using an integration map and only operating when we need to, to pull the data out. * Now we're doing the thing below this block comment int16_t accumulated_total; //2 bytes int16_t last_accumulated_total_at_bin[MAX_FREQS*2]; //24 * 2 * sizeof(int16_t) = 96 bytes. uint8_t current_time; //1 byte uint8_t placecode[MAX_FREQS]; */ /* So, the idea here is we would keep a running total of the current ADC value, kept away in a int16_t. It is constantly summing, so we can take an integral of it. Or rather an integral range. Over time, we perform operations like adding or subtracting from a current place. NOTE: Optimizations: Only use 16 bins, lets action table be 16-bits wide. */ //These live in RAM. int16_t running_integral; int16_t integral_at[MAX_FREQS*OCTAVES*2]; int32_t cossindata[MAX_FREQS*OCTAVES*2]; //Contains COS and SIN data. (32-bit for now, will be 16-bit) uint8_t which_octave_for_op[MAX_FREQS]; //counts up, tells you which ocative you are operating on. PUT IN RAM. #define NR_OF_OPS (4< hits per %d: %f %d (%.2f%% error)\n", topbin, f, ACTIONTABLESIZE, (float)ACTIONTABLESIZE/f, dhrpertable, err * 100.0 ); float advance_per_step = dhrpertable/(float)ACTIONTABLESIZE; float fvadv = 0.0; int j; int countset = 0; //XXX TODO Tricky: We need to start fadv off at such a place that there won't be a hicchup when going back around to 0. for( j = 0; j < ACTIONTABLESIZE; j++ ) { if( fvadv >= 0.5 ) { actiontable[j] |= 1<> longestzeroes) & 1) == 0 ); longestzeroes++ ); //longestzeroes goes: 255, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, ... //This isn't great, because we need to also know whether we are attacking the SIN side or the COS side, and if it's + or -. //We can actually decide that out. if( longestzeroes == 255 ) { //This is a nop. Emit a nop. optable[i] = longestzeroes; } else { int iop = phaseinop[longestzeroes]++; optable[i] = (longestzeroes<<1) | (iop & 1); if( iop & 2 ) optable[i] |= 1<<4; //printf( " %d %d\n", iop, val ); } //printf( "HBT: %d = %d\n", i, optable[i] ); } return 0; } #if 0 int16_t running_integral; int16_t integral_at[MAX_FREQS*OCTAVES]; int16_t cossindata[MAX_FREQS*OCTAVES*2]; //Contains COS and SIN data. uint8_t which_octave_for_op[MAX_FREQS]; //counts up, tells you which ocative you are operating on. PUT IN RAM. #define NR_OF_OPS (4<= NR_OF_OPS ) ao = 0; which_octave_for_op[n] = ao; if( op == 255 ) { dprintf( "*" ); //NOP } else { int octaveplace = op & 0xf; int idx = (octaveplace>>1) * MAX_FREQS * 2 + n * (octaveplace&1)*2; int16_t diff; if( op & 0x10 ) //ADD { diff = integral_at[idx>>1] - running_integral; dprintf( "%c", 'a' + octaveplace ); } else //SUBTRACT { diff = running_integral - integral_at[idx>>1]; dprintf( "%c", 'A' + octaveplace ); } integral_at[idx>>1] = running_integral; printf( "%d\n", diff ); //dprintf( "%d\n", idx ); cossindata[idx] += diff; cossindata[idx] -= cossindata[idx] >> 8; } } else { dprintf( " " ); } } dprintf( "\n" ); #if 0 uint32_t actions = *(placeintable++); if( placeintable == &actiontable[ACTIONTABLESIZE] ) placeintable = actiontable; int b; for( b = 0; b < MAX_FREQS; b++ ) { if( ! ((1<>= 1; int octavebit = op & ((1<>5 ); //6 = Actually only feed algorithm numbers from -64 to 63. } last_place = place_in_data_buffer; #if 1 for( i = 0; i < bins; i++ ) { outbins[i] = 0; } for( i = 0; i < MAX_FREQS; i++ ) { int iss = 0;//cossindata[i*2+0]>>8; int isc = 0;//cossindata[i*2+1]>>8; int mux = iss * iss + isc * isc; if( mux == 0 ) mux = 1; if( i == 0 ) //printf( "MUX: %d %d = %d\n", isc, iss, mux ); outbins[i+MAX_FREQS] = sqrt(mux);///200.0; } #endif }