From 2e26b747fda85538c3e026ee5b6e16a1650fe6e5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Tue, 10 Feb 2015 00:57:10 -0500 Subject: [PATCH] Add embedded-oriented integer version of DFT. --- Makefile | 7 +- WinDriver.c | 10 ++ colorchord.exe | Bin 58368 -> 60928 bytes dft.c | 255 ++++++++++++++++++++++++++++++++++++++++++++++- dft.h | 7 ++ integerprog.conf | 5 + main.c | 9 +- notefinder.c | 17 +++- notefinder.h | 1 + sound_win.c | 47 +++++---- 10 files changed, 333 insertions(+), 25 deletions(-) create mode 100644 integerprog.conf diff --git a/Makefile b/Makefile index c6dfdc7..a1dce0a 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,8 @@ SOUND:=sound.o sound_alsa.o sound_pulse.o sound_null.o OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o WINGCC:=i586-mingw32msvc-gcc -WINGCCFLAGS:= -lwinmm -lgdi32 -lws2_32 -O2 -ffast-math -g +WINGCCFLAGS:= -O2 -ffast-math -Wl,--relax -Wl,--gc-sections -ffunction-sections -fdata-sections -s +WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 RAWDRAWLIBS:=-lX11 -lm -lpthread -lXinerama -lXext LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse @@ -16,8 +17,8 @@ colorchord : os_generic.o main.o dft.o decompose.o filter.o color.o sort.o note gcc -o $@ $^ $(CFLAGS) $(LDLIBS) $(EXTRALIBS) $(RAWDRAWLIBS) colorchord.exe : os_generic.c main.c dft.c decompose.c filter.c color.c sort.c notefinder.c util.c outdrivers.c DrawFunctions.c parameters.c chash.c WinDriver.c sound.c sound_null.c sound_win.c OutputVoronoi.c DisplayArray.c OutputLinear.c DisplayPie.c DisplayNetwork.c - $(WINGCC) -o $@ $^ $(WINGCCFLAGS) + $(WINGCC) $(WINGCCFLAGS) -o $@ $^ $(WINLDFLAGS) clean : - rm -rf *.o *~ colorchord + rm -rf *.o *~ colorchord colorchord.exe diff --git a/WinDriver.c b/WinDriver.c index 4b054ed..b0f41d7 100644 --- a/WinDriver.c +++ b/WinDriver.c @@ -5,6 +5,7 @@ #include "DrawFunctions.h" #include #include +#include #include //for alloca static HINSTANCE lhInstance; @@ -193,6 +194,8 @@ void CNFGSetup( const char * name_of_window, int width, int height ) InternalHandleResize(); } +void WindowsTerm(); + void CNFGHandleInput() { int ldown = 0; @@ -204,6 +207,13 @@ void CNFGHandleInput() switch( msg.message ) { + case WM_QUIT: + case WM_DESTROY: + case WM_CLOSE: + printf( "Close\n" ); + WindowsTerm(); + TerminateProcess( 0, 0 ); + break; case WM_MOUSEMOVE: HandleMotion( (msg.lParam & 0xFFFF), (msg.lParam>>16) & 0xFFFF, ( (msg.wParam & 0x01)?1:0) | ((msg.wParam & 0x02)?2:0) | ((msg.wParam & 0x10)?4:0) ); break; diff --git a/colorchord.exe b/colorchord.exe index 867fcfcb6630384b350accff5e213e0d75784e9f..7e2638dd6968a22a228d97c31d4ffe04eecab512 100755 GIT binary patch delta 12043 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 QIr5pqW=AGl#zoio0DAAcX#fBK delta 10040 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 diff --git a/dft.c b/dft.c index 1326363..8543846 100644 --- a/dft.c +++ b/dft.c @@ -1,7 +1,10 @@ + #include "dft.h" #include #include - +#include +#include +#include void DoDFT( float * outbins, float * frequencies, int bins, float * databuffer, int place_in_data_buffer, int size_of_data_buffer, float q ) { @@ -41,6 +44,8 @@ void DoDFTQuick( float * outbins, float * frequencies, int bins, const float * d for( i = 0; i < bins; i++ ) { + int flirts = 0; + float freq = frequencies[i]; float phi = 0; int ftq = freq * q; @@ -66,6 +71,7 @@ void DoDFTQuick( float * outbins, float * frequencies, int bins, const float * d binqtyc += cv; phi += advance; + flirts++; } float amp = sqrtf( binqtys * binqtys + binqtyc * binqtyc ); @@ -73,3 +79,250 @@ void DoDFTQuick( float * outbins, float * frequencies, int bins, const float * d } } + + +////////////////////////////DFT Progressive is for embedded systems, primarily. + + +static float * gbinqtys; +static float * gbinqtyc; +static float * phis; +static float * gfrequencies; +static float * goutbins; +static float * lastbins; +static float * advances; + +static int gbins; +static float gq; +static float gspeedup; + +#define PROGIIR .005 + +void HandleProgressive( float sample ) +{ + int i; + + for( i = 0; i < gbins; i++ ) + { + float thiss = sinf( phis[i] ) * sample; + float thisc = cosf( phis[i] ) * sample; + + float s = gbinqtys[i] = gbinqtys[i] * (1.-PROGIIR) + thiss * PROGIIR; + float c = gbinqtyc[i] = gbinqtyc[i] * (1.-PROGIIR) + thisc * PROGIIR; + + phis[i] += advances[i]; + if( phis[i] > 6.283 ) phis[i]-=6.283; + + goutbins[i] = sqrtf( s * s + c * c ); + } +} + + +void DoDFTProgressive( float * outbins, float * frequencies, int bins, const float * databuffer, int place_in_data_buffer, int size_of_data_buffer, float q, float speedup ) +{ + int i; + static int last_place; + + if( gbins != bins ) + { + if( gbinqtys ) free( gbinqtys ); + if( gbinqtyc ) free( gbinqtyc ); + if( phis ) free( phis ); + if( lastbins ) free( lastbins ); + if( advances ) free( advances ); + + gbinqtys = malloc( sizeof(float)*bins ); + gbinqtyc = malloc( sizeof(float)*bins ); + phis = malloc( sizeof(float)*bins ); + lastbins = malloc( sizeof(float)*bins ); + advances = malloc( sizeof(float)*bins ); + + memset( gbinqtys, 0, sizeof(float)*bins ); + memset( gbinqtyc, 0, sizeof(float)*bins ); + memset( phis, 0, sizeof(float)*bins ); + memset( lastbins, 0, sizeof(float)*bins ); + + } + memcpy( outbins, lastbins, sizeof(float)*bins ); + + for( i = 0; i < bins; i++ ) + { + float freq = frequencies[i]; + advances[i] = 3.14159*2.0/freq; + } + + gbins = bins; + gfrequencies = frequencies; + goutbins = outbins; + gspeedup = speedup; + gq = q; + + place_in_data_buffer = (place_in_data_buffer+1)%size_of_data_buffer; + + int didrun = 0; + for( i = last_place; i != place_in_data_buffer; i = (i+1)%size_of_data_buffer ) + { + float fin = ((float)((int)(databuffer[i] * 127))) / 127.0; //simulate 8-bit input (it looks FINE!) + HandleProgressive( fin ); + didrun = 1; + } + last_place = place_in_data_buffer; + + if( didrun ) + { + memcpy( lastbins, outbins, sizeof(float)*bins ); + } + +/* for( i = 0; i < bins; i++ ) + { + printf( "%0.2f ", outbins[i]*100 ); + } + printf( "\n" );*/ + +} + + + + + + + +/////////////////////////////INTEGER DFT + + + + +#define PROGIIR .005 + +//NOTES to self: +// +// Let's say we want to try this on an AVR. +// 24 bins, 5 octaves = 120 bins. +// 20 MHz clock / 4.8k sps = 4096 IPS = 34 clocks per bin = :( +// We can do two at the same time, this frees us up some + +static uint8_t donefirstrun; +static int8_t sintable[512]; //Actually [sin][cos] pairs. + + +//LDD instruction on AVR can read with constant offset. We can set Y to be the place in the buffer, and read with offset. +static uint16_t * datspace; //(advances,places,isses,icses) + +// +void HandleProgressiveInt( int8_t sample1, int8_t sample2 ) +{ + int i; + uint16_t startpl = 0; + int16_t ts, tc; + int16_t tmp1; + int8_t s1, c1; + uint16_t ipl, localipl, adv; + + + //startpl maps to 'Y' + // + + + //Estimated 68 minimum instructions... So for two pairs each... just under 5ksps, theoretical. + //Running overall at ~2kHz. + for( i = 0; i < gbins; i++ ) //Loop, fixed size = 3 + 2 cycles 5 + { + //12 cycles MIN + adv = datspace[startpl++]; //Read, indirect from RAM (and increment) 2+2 cycles 4 + ipl = datspace[startpl++]; //Read, indirect from RAM (and increment) 2+2 cycles 4 + + //13 cycles MIN + ipl += adv; //Advance, 16bit += 16bit, 1 + 1 cycles 2 + localipl = (ipl>>8)<<1; //Select upper 8 bits 1 cycles 1 + + // need to load Z with 'sintable' and add localipl 2 + s1 = sintable[localipl++]; //Read s1 component out of table. 2+2 cycles 2 + c1 = sintable[localipl++]; //Read c1 component out of table. 2 cycles 2 + + ts = (s1 * sample1); // 8 x 8 multiply signed + copy R1 out. zero MSB ts 2 + tc = (c1 * sample1); // 8 x 8 multiply signed + copy R1 out. zero MSB tc 2 + + + //15 cycles MIN + ipl += adv; //Advance, 16bit += 16bit, 1 + 1 cycles 2 + localipl = (ipl>>8)<<1; //Select upper 8 bits 1 cycles 1 + + // need to load Z with 'sintable' and add localipl 2 + s1 = sintable[localipl++]; //Read s1 component out of table. 2 cycles 2 + c1 = sintable[localipl++]; //Read c1 component out of table. 2 cycles 2 + + ts += (s1 * sample2); // 8 x 8 multiply signed + add R1 out. 3 + tc += (c1 * sample2); // 8 x 8 multiply signed + add R1 out. 3 + + + //Add TS and TC to the datspace stuff. (24 instructions) + tmp1 = datspace[startpl]; //Read out, sin component. 4 + tmp1 -= tmp1>>6; //Subtract from the MSB (with carry) 2 + tmp1 += ts>>6; //Add MSBs with carry 2 + + datspace[startpl++] = tmp1; //Store values back 4 + + tmp1 = datspace[startpl]; //Read out, sin component. 4 + tmp1 -= tmp1>>6; //Subtract from the MSB (with carry) 2 + tmp1 += tc>>6; //Add MSBs with carry 2 + + datspace[startpl++] = tmp1; //Store values back 4 + + datspace[startpl-3] = ipl; //Store values back 4 + } +} + + +void DoDFTProgressiveInteger( float * outbins, float * frequencies, int bins, const float * databuffer, int place_in_data_buffer, int size_of_data_buffer, float q, float speedup ) +{ + int i; + static int last_place; + + if( !donefirstrun ) + { + donefirstrun = 1; + for( i = 0; i < 256; i++ ) + { + sintable[i*2+0] = (int8_t)((sinf( i / 256.0 * 6.283 ) * 127.0)); + sintable[i*2+1] = (int8_t)((cosf( i / 256.0 * 6.283 ) * 127.0)); + } + } + + if( gbins != bins ) + { + gbins = bins; + if( datspace ) free( datspace ); + datspace = malloc( bins * 2 * 4 ); + } + + + for( i = 0; i < bins; i++ ) + { + float freq = frequencies[i]; + datspace[i*4] = 65536.0/freq; + } + + + for( i = last_place; i != ( place_in_data_buffer&0xffffe ); i = (i+2)%size_of_data_buffer ) + { + int8_t ifr1 = (int8_t)( ((databuffer[i+0]) ) * 127 ); + int8_t ifr2 = (int8_t)( ((databuffer[i+1]) ) * 127 ); +// printf( "%d %d\n", i, place_in_data_buffer&0xffffe ); + HandleProgressiveInt( ifr1, ifr2 ); + } + + last_place = place_in_data_buffer&0xfffe; + + //Extract bins. + for( i = 0; i < bins; i++ ) + { + int16_t isps = datspace[i*4+2]; + int16_t ispc = datspace[i*4+3]; + int16_t mux = ( (isps/256) * (isps/256)) + ((ispc/256) * (ispc/256)); +// printf( "%d (%d %d)\n", mux, isps, ispc ); + outbins[i] = sqrt( mux )/100.0; + } +// printf( "\n"); +} + + diff --git a/dft.h b/dft.h index 7fedc79..bae53b5 100644 --- a/dft.h +++ b/dft.h @@ -12,5 +12,12 @@ void DoDFT( float * outbins, float * frequencies, int bins, float * databuffer, //Speedup = target number of data points void DoDFTQuick( float * outbins, float * frequencies, int bins, const float * databuffer, int place_in_data_buffer, int size_of_data_buffer, float q, float speedup ); +//An unusual tool to do a "progressive" DFT, using data from previous rounds. +void DoDFTProgressive( float * outbins, float * frequencies, int bins, const float * databuffer, int place_in_data_buffer, int size_of_data_buffer, float q, float speedup ); + +//A progressive DFT that's done using only low-bit integer math. +void DoDFTProgressiveInteger( float * outbins, float * frequencies, int bins, const float * databuffer, int place_in_data_buffer, int size_of_data_buffer, float q, float speedup ); + + #endif diff --git a/integerprog.conf b/integerprog.conf new file mode 100644 index 0000000..d321461 --- /dev/null +++ b/integerprog.conf @@ -0,0 +1,5 @@ +do_progressive_dft = 1 +samplerate = 8000 +buffer = 128 + + diff --git a/main.c b/main.c index d268ede..be4cd84 100644 --- a/main.c +++ b/main.c @@ -14,8 +14,15 @@ #include "outdrivers.h" #include "parameters.h" +struct SoundDriver * sd; + #ifdef WIN32 #include +void WindowsTerm() +{ + CloseSound( sd ); +} + #endif int lastfps; @@ -244,7 +251,7 @@ int main(int argc, char ** argv) //Initialize Sound - struct SoundDriver * sd = InitSound( sound_source, &SoundCB ); + sd = InitSound( sound_source, &SoundCB ); if( !sd ) { diff --git a/notefinder.c b/notefinder.c index 96d042c..11078c8 100644 --- a/notefinder.c +++ b/notefinder.c @@ -25,6 +25,7 @@ struct NoteFinder * CreateNoteFinder( int spsRec ) ret->decompose_iterations = 1000; ret->dft_speedup = 300; ret->dft_q = 16; + ret->do_progressive_dft = 0; ret->default_sigma = 1.4; ret->note_jumpability = 2.5; ret->note_combine_distance = 0.5; @@ -58,6 +59,7 @@ struct NoteFinder * CreateNoteFinder( int spsRec ) RegisterValue( "note_minimum_new_distribution_value", PAFLOAT, &ret->note_minimum_new_distribution_value, sizeof( ret->note_minimum_new_distribution_value ) ); RegisterValue( "note_out_chop", PAFLOAT, &ret->note_out_chop, sizeof( ret->note_out_chop ) ); RegisterValue( "dft_iir", PAFLOAT, &ret->dft_iir, sizeof( ret->dft_iir ) ); + RegisterValue( "do_progressive_dft", PAINT, &ret->do_progressive_dft, sizeof( ret->do_progressive_dft ) ); AddCallback( "freqbins", ChangeNFParameters, ret ); AddCallback( "octaves", ChangeNFParameters, ret ); @@ -175,7 +177,20 @@ void RunNoteFinder( struct NoteFinder * nf, const float * audio_stream, int head //This DFT function does not wavelet or anything. nf->StartTime = OGGetAbsoluteTime(); - DoDFTQuick( dftbins, nf->frequencies, freqs, audio_stream, head, buffersize, nf->dft_q, nf->dft_speedup ); + switch( nf->do_progressive_dft ) + { + case 0: + DoDFTQuick( dftbins, nf->frequencies, freqs, audio_stream, head, buffersize, nf->dft_q, nf->dft_speedup ); + break; + case 1: + DoDFTProgressive( dftbins, nf->frequencies, freqs, audio_stream, head, buffersize, nf->dft_q, nf->dft_speedup ); + break; + case 2: + DoDFTProgressiveInteger( dftbins, nf->frequencies, freqs, audio_stream, head, buffersize, nf->dft_q, nf->dft_speedup ); + break; + default: + fprintf( stderr, "Error: No DFT Seleced\n" ); + } nf->DFTTime = OGGetAbsoluteTime(); for( i = 0; i < freqs; i++ ) diff --git a/notefinder.h b/notefinder.h index f42d4b4..937ebc7 100644 --- a/notefinder.h +++ b/notefinder.h @@ -16,6 +16,7 @@ struct NoteFinder int filter_iter;// = 1; int decompose_iterations;// = 1000; float amplify; // =1 (amplify input across the board) + int do_progressive_dft; //= 1 //at 300, there is still some minimal aliasing at higher frequencies. Increase this for less low-end distortion //NOTE: This /should/ get fixed, as we /should/ be decimating the input data intelligently with lower octaves. diff --git a/sound_win.c b/sound_win.c index e0c5afb..ee731ea 100644 --- a/sound_win.c +++ b/sound_win.c @@ -1,5 +1,3 @@ -//XXX THIS DRIVER IS INCOMPLETE XXX - #include #include "parameters.h" #include "sound.h" @@ -12,7 +10,7 @@ #pragma comment(lib,"winmm.lib") #endif -#define BUFFS 3 +#define BUFFS 2 struct SoundDriverWin { @@ -27,9 +25,7 @@ struct SoundDriverWin int buffer; int isEnding; - int Cbuff; int GOBUFF; - int OLDBUFF; int recording; @@ -42,6 +38,7 @@ static struct SoundDriverWin * w; void CloseSoundWin( struct SoundDriverWin * r ) { int i; + if( r ) { waveInStop(r->hMyWave); @@ -65,6 +62,7 @@ int SoundStateWin( struct SoundDriverWin * soundobject ) void CALLBACK HANDLEMIC(HWAVEIN hwi,UINT umsg, DWORD dwi, DWORD hdr, DWORD dwparm) { int ctr; + int ob; long cValue; unsigned int maxWave=0; @@ -80,18 +78,20 @@ void CALLBACK HANDLEMIC(HWAVEIN hwi,UINT umsg, DWORD dwi, DWORD hdr, DWORD dwpar break; case MM_WIM_DATA: - w->OLDBUFF=w->GOBUFF; - w->GOBUFF=w->Cbuff; - w->Cbuff = (w->Cbuff+1)%3; - waveInPrepareHeader(w->hMyWave,&(w->WavBuff[w->Cbuff]),sizeof(WAVEHDR)); - waveInAddBuffer(w->hMyWave,&(w->WavBuff[w->Cbuff]),sizeof(WAVEHDR)); +// printf( "Mic Data.\n"); + ob = (w->GOBUFF+(BUFFS))%BUFFS; +// waveInPrepareHeader(w->hMyWave,&(w->WavBuff[w->Cbuff]),sizeof(WAVEHDR)); for (ctr=0;ctrbuffer * w->channelsRec;ctr++) { - float cv = (uint16_t)(((uint8_t)w->WavBuff[w->GOBUFF].lpData[ctr*2+1])*256+((uint8_t)w->WavBuff[w->GOBUFF].lpData[ctr*2])+32768)-32768; + float cv = (uint16_t)(((uint8_t)w->WavBuff[ob].lpData[ctr*2+1])*256+((uint8_t)w->WavBuff[ob].lpData[ctr*2])+32768)-32768; cv /= 32768; +// if( ctr < 3 ) cv = -1; +// buffer[(w->buffer * w->channelsRec)-ctr-1] = cv; buffer[ctr] = cv; } + waveInAddBuffer(w->hMyWave,&(w->WavBuff[w->GOBUFF]),sizeof(WAVEHDR)); + w->GOBUFF = ( w->GOBUFF + 1 ) % BUFFS; int playbacksamples; //Unused w->callback( 0, buffer, w->buffer, &playbacksamples, (struct SoundDriver*)w ); @@ -113,23 +113,34 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) w = r; + + printf( "WFMT: %d %d %d\n", r->channelsRec, r->spsRec, + r->spsRec * r->channelsRec ); + wfmt.wFormatTag = WAVE_FORMAT_PCM; wfmt.nChannels = r->channelsRec; wfmt.nSamplesPerSec = r->spsRec; - wfmt.nBlockAlign = 1; + wfmt.nAvgBytesPerSec = r->spsRec * r->channelsRec; + wfmt.nBlockAlign = r->channelsRec * 2; wfmt.wBitsPerSample = 16; - wfmt.nAvgBytesPerSec = 0; + wfmt.cbSize = 0; long dwdevice; dwdevice = GetParameterI( "wininput", WAVE_MAPPER ); - int p = waveInOpen(&r->hMyWave, dwdevice, &wfmt,(DWORD)(void*)(HANDLEMIC) , 0, CALLBACK_FUNCTION); + printf( "Wave Devs: %d; WAVE_MAPPER: %d; Selected Input: %d\n", waveInGetNumDevs(), WAVE_MAPPER, dwdevice ); - printf( "WIO: %d\n", p ); + printf( "waveInOpen: %p, %p\n", &r->hMyWave, &wfmt ); + + int p = waveInOpen(&r->hMyWave, dwdevice, &wfmt,(DWORD)(void*)(&HANDLEMIC) , 0, CALLBACK_FUNCTION); + + printf( "WIO: %d\n", p ); //On real windows, returns 11 for ( i=0;iWavBuff[i]), 0, sizeof(r->WavBuff[i]) ); (r->WavBuff[i]).dwBufferLength = r->buffer*2*r->channelsRec; + (r->WavBuff[i]).dwLoops = 1; (r->WavBuff[i]).lpData=(char*) malloc(r->buffer*r->channelsRec*2); waveInPrepareHeader(r->hMyWave,&(r->WavBuff[i]),sizeof(WAVEHDR)); waveInAddBuffer(r->hMyWave,&(r->WavBuff[i]),sizeof(WAVEHDR)); @@ -137,7 +148,7 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) p = waveInStart(r->hMyWave); - printf( "WIS: %d\n", p ); + printf( "WIS: %d\n", p ); //On real windows returns 5. return r; } @@ -154,14 +165,12 @@ void * InitSoundWin( SoundCBType cb ) r->spsRec = GetParameterI( "samplerate", 44100 ); r->channelsRec = GetParameterI( "channels", 2 ); - r->buffer = GetParameterI( "buffer", 1024 ); + r->buffer = GetParameterI( "buffer", 384 ); r->recording = 0; r->isEnding = 0; printf( "Buffer: %d\n", r->buffer ); - r->Cbuff=0; r->GOBUFF=0; - r->OLDBUFF=0; return InitWinSound(r); }