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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�V8v6|?@4@GSAIUSuC#G1I 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 #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); }