From 27405f4f8c65baabb28ce427912851be10207781 Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Thu, 11 Nov 2004 16:13:58 +0000 Subject: Added fft files fixed some issues, included equalizer. --- Graphic_Equalizer/Graphic_Equalizer.hp | 42 +- Graphic_Equalizer/Graphic_Equalizer.pref | 109 ++++-- Graphic_Equalizer/include/audio.hch | 13 +- Graphic_Equalizer/include/configuration.hch | 6 +- Graphic_Equalizer/include/eventhandler.hch | 2 +- Graphic_Equalizer/include/eventhandler_shared.hch | 3 +- Graphic_Equalizer/include/fft.hch | 8 + Graphic_Equalizer/src/audio.hcc | 34 +- Graphic_Equalizer/src/display.hcc | 10 +- Graphic_Equalizer/src/eventhandler.hcc | 27 +- Graphic_Equalizer/src/fft.hcc | 454 ++++++++++++++++++++++ Graphic_Equalizer/src/main.hcc | 7 +- Graphic_Equalizer/src/mouse.hcc | 37 +- Graphic_Equalizer/src/smartmedia.hcc | 9 +- Support_Libs/debug/debug.hcc | 36 +- 15 files changed, 704 insertions(+), 93 deletions(-) create mode 100644 Graphic_Equalizer/include/fft.hch create mode 100644 Graphic_Equalizer/src/fft.hcc diff --git a/Graphic_Equalizer/Graphic_Equalizer.hp b/Graphic_Equalizer/Graphic_Equalizer.hp index a151425..15bc63f 100644 --- a/Graphic_Equalizer/Graphic_Equalizer.hp +++ b/Graphic_Equalizer/Graphic_Equalizer.hp @@ -86,27 +86,59 @@ setting RC200E "include:R:\\c2hardw\\Program Files\\celoxica\\pdk\\hardware\\inc setting RC200E "include:R:\\c2hardw\\Program Files\\celoxica\\pdk\\hardware\\" false setting RC200E include:..\\..\\..\\include false setting RC200E include:include true +setting RC200E include:..\\Support_Libs\\debug true +setting RC200E include:C:\\Project_CVS\\Support_Libs\\debug false command RC200E "cd RC200" command RC200E "call edifmake_rc200 Graphic_Equalizer" output RC200E bin\\Graphic_Equalizer.bit +document include\\audio.hch { + type hch +} +document include\\configuration.hch { + type hch +} document include\\display.hch { type hch } document include\\display_shared.hch { type hch } -document include\\mousedriver.hch { +document include\\eventhandler.hch { + type hch +} +document include\\eventhandler_shared.hch { + type hch +} +document include\\mouse.hch { + type hch +} +document include\\mouse_shared.hch { type hch } -document include\\mousedriver_shared.hch { +document include\\smartmedia.hch { type hch } -document src\\display\\display.hcc { +document src\\audio.hcc { type hcc } -document src\\display\\main.hcc { +document src\\display.hcc { type hcc } -document src\\display\\mousedriver.hcc { +document src\\eventhandler.hcc { type hcc } +document src\\main.hcc { + type hcc +} +document src\\mouse.hcc { + type hcc +} +document src\\smartmedia.hcc { + type hcc +} +document ..\\support_libs\\debug\\debug.hcc { + type hcc +} +document ..\\support_libs\\debug\\debug.hch { + type hch +} diff --git a/Graphic_Equalizer/Graphic_Equalizer.pref b/Graphic_Equalizer/Graphic_Equalizer.pref index 8cf1236..66251fb 100644 --- a/Graphic_Equalizer/Graphic_Equalizer.pref +++ b/Graphic_Equalizer/Graphic_Equalizer.pref @@ -1,55 +1,114 @@ -[WorkState_v1_2.Frames.ChildFrames.Document-4] +[WorkState_v1_2.Frames.ChildFrames.Document-8] ptn_Child1=ViewFrame-0 -[WorkState_v1_2.Frames.ChildFrames.Document-4.ViewFrame-0] -DocPathName=R:\c2hardw\Project_Marcel_&_Oliver\Project_CVS\Graphic_Equalizer\include\display_shared.hch +[WorkState_v1_2.Frames.ChildFrames.Document-8.ViewFrame-0] +DocPathName=C:\project_cvs\graphic_equalizer\include\audio.hch DocumentString= DocTemplateIndex=5 -WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPCEAAAAAACEAAAAAAINCAAAAADIBAAAAA +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPMCAAAAAAMCAAAAAAEPCAAAAAPABAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-9] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-9.ViewFrame-0] +DocPathName=C:\Project_CVS\Graphic_Equalizer\include\smartmedia.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPMCAAAAAAMCAAAAAAEPCAAAAAPABAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-10] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-10.ViewFrame-0] +DocPathName=C:\project_cvs\support_libs\debug\debug.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPCEAAAAAACEAAAAAAKADAAAAAFCBAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-11] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-11.ViewFrame-0] +DocPathName=C:\Project_CVS\Graphic_Equalizer\include\mouse_shared.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPGBAAAAAAGBAAAAAADLCAAAAAJPAAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-12] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-12.ViewFrame-0] +DocPathName=C:\Project_CVS\Graphic_Equalizer\include\eventhandler.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPCEAAAAAACEAAAAAAPNCAAAAAFCBAAAAA IsActiveChildFrame=False -[WorkState_v1_2] -ptn_Child1=Frames -ptn_Child2=DK Design Suite Preferences -ptn_Child3=Breakpoints -ptn_Child4=WatchVars -[WorkState_v1_2.Frames] -ptn_Child1=ChildFrames -[WorkState_v1_2.Frames.ChildFrames] -ptn_Child1=Document-0 -ptn_Child2=Document-1 -ptn_Child3=Document-2 -ptn_Child4=Document-3 [WorkState_v1_2.Frames.ChildFrames.Document-0] ptn_Child1=ViewFrame-0 [WorkState_v1_2.Frames.ChildFrames.Document-0.ViewFrame-0] -DocPathName=R:\c2hardw\project_marcel_&_oliver\project_cvs\graphic_equalizer\src\display\main.hcc +DocPathName=C:\Project_CVS\Graphic_Equalizer\src\display.hcc DocumentString= DocTemplateIndex=4 -WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPGBAAAAAAGBAAAAAAMKCAAAAAFDBAAAAA +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPAAAAAAAAAAAAAAAAAOCAAAAAEEBAAAAA IsActiveChildFrame=False [WorkState_v1_2.Frames.ChildFrames.Document-1] ptn_Child1=ViewFrame-0 [WorkState_v1_2.Frames.ChildFrames.Document-1.ViewFrame-0] -DocPathName=R:\c2hardw\project_marcel_&_oliver\project_cvs\graphic_equalizer\src\display\display.hcc +DocPathName=C:\Project_CVS\Graphic_Equalizer\src\eventhandler.hcc DocumentString= DocTemplateIndex=4 -WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPMCAAAAAAMCAAAAAAGMCAAAAAPEBAAAAA +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPIFAAAAAAIFAAAAAAJMCAAAAAPGBAAAAA IsActiveChildFrame=False [WorkState_v1_2.Frames.ChildFrames.Document-2] ptn_Child1=ViewFrame-0 [WorkState_v1_2.Frames.ChildFrames.Document-2.ViewFrame-0] -DocPathName=R:\c2hardw\Project_Marcel_&_Oliver\Project_CVS\Graphic_Equalizer\src\display\mousedriver.hcc +DocPathName=C:\Project_CVS\Graphic_Equalizer\src\mouse.hcc DocumentString= DocTemplateIndex=4 -WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPCEAAAAAACEAAAAAAMNCAAAAAFGBAAAAA +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPAAAAAAAAAAAAAAAABHCAAAAAHBBAAAAA IsActiveChildFrame=False [WorkState_v1_2.Frames.ChildFrames.Document-3] ptn_Child1=ViewFrame-0 [WorkState_v1_2.Frames.ChildFrames.Document-3.ViewFrame-0] -DocPathName=R:\c2hardw\Project_Marcel_&_Oliver\Project_CVS\Graphic_Equalizer\include\mousedriver.hch +DocPathName=C:\Project_CVS\support_libs\debug\debug.hcc DocumentString= -DocTemplateIndex=5 -WindowPlacement=MCAAAAAACAAAAAAADAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPIFAAAAAAIFAAAAAACPCAAAAALHBAAAAA +DocTemplateIndex=4 +WindowPlacement=MCAAAAAACAAAAAAADAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPGBAAAAAAGBAAAAAAHICAAAAANCBAAAAA IsActiveChildFrame=True +[WorkState_v1_2.Frames.ChildFrames.Document-4] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-4.ViewFrame-0] +DocPathName=C:\Project_CVS\Graphic_Equalizer\include\mouse.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPMCAAAAAAMCAAAAAANJCAAAAADEBAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-5] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-5.ViewFrame-0] +DocPathName=C:\Project_CVS\Graphic_Equalizer\include\mouse_shared.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPCEAAAAAACEAAAAAADLCAAAAAJFBAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-6] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-6.ViewFrame-0] +DocPathName=C:\project_cvs\graphic_equalizer\include\eventhandler.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPCEAAAAAACEAAAAAADLCAAAAAJFBAAAAA +IsActiveChildFrame=False +[WorkState_v1_2.Frames.ChildFrames.Document-7] +ptn_Child1=ViewFrame-0 +[WorkState_v1_2.Frames.ChildFrames.Document-7.ViewFrame-0] +DocPathName=C:\project_cvs\graphic_equalizer\include\display.hch +DocumentString= +DocTemplateIndex=5 +WindowPlacement=MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPMPPPPPPPJOPPPPPPAAAAAAAAAAAAAAAABHCAAAAAHBBAAAAA +IsActiveChildFrame=False +[WorkState_v1_2] +ptn_Child1=Frames +ptn_Child2=DK Design Suite Preferences +ptn_Child3=Breakpoints +ptn_Child4=WatchVars +[WorkState_v1_2.Frames] +ptn_Child1=ChildFrames [WorkState_v1_2.DK Design Suite Preferences] Active Project Index=0 Active Configuration Index=3 diff --git a/Graphic_Equalizer/include/audio.hch b/Graphic_Equalizer/include/audio.hch index ff4a4fc..39fa52d 100644 --- a/Graphic_Equalizer/include/audio.hch +++ b/Graphic_Equalizer/include/audio.hch @@ -24,6 +24,11 @@ /* * Type definition of the shared memory to be used in various processes */ +mpram equalizer_levels_t { + ram unsigned 4 write[768]; + rom unsigned 4 read[768]; +}; + @@ -60,15 +65,15 @@ * passed level, input_source chooses between line in or mic in. The * sample_rate is set to supplied rate. Defines for these are mentioned above. */ -macro proc audio_init(gain_level, input_source, sample_rate); +macro proc audio_init(gain_level, input_source, sample_rate, AUDIOIN, AUDIOOUT); /* - * Main audiodriver loop. This procedure never returns! It handles audio io, - * updates the shared memory and notifies listeners. + * Main audiodriver loop. This procedure never returns! It handles audio io and + * updates the shared memory. It needs Audio I/O handlers passed. */ -void audio_main(void); +macro proc audio_main(AUDIOIN, AUDIOOUT); #else #error "ERROR file audio.hch multiple times included" diff --git a/Graphic_Equalizer/include/configuration.hch b/Graphic_Equalizer/include/configuration.hch index 7db28bc..6cc644b 100644 --- a/Graphic_Equalizer/include/configuration.hch +++ b/Graphic_Equalizer/include/configuration.hch @@ -32,8 +32,9 @@ * routines. To only load the mask and not the entire data set USE_MASK_ONLY to * 1. 0 will load all bitmaps. */ -#define HAVE_SMARTMEDIA 1 +#define HAVE_SMARTMEDIA 0 #define USE_MASK_ONLY 1 +#define SKIP_LOAD 1 @@ -96,7 +97,8 @@ /* * Set the color for various items that will be drawn on screen. */ -#define PIXEL_VOLUME_YAXIS (0x00ff00) +#define PIXEL_VOLUME_YAXIS (0x00ff00) +#define PIXEL_EQUALIZER (0xff0000) #else #error "ERROR file configuration.hch multiple times included" diff --git a/Graphic_Equalizer/include/eventhandler.hch b/Graphic_Equalizer/include/eventhandler.hch index b8f5ca9..1ee9099 100644 --- a/Graphic_Equalizer/include/eventhandler.hch +++ b/Graphic_Equalizer/include/eventhandler.hch @@ -27,7 +27,7 @@ * to store actions to be performed and a mousedata pointer so that we know on * what mousestate to respond. We never returns! */ -macro proc eventhandler_main(events, mousedata); +macro proc eventhandler_main(equalizer_levels, events, mousedata); #else #error "ERROR file eventhandler.hch multiple times included" diff --git a/Graphic_Equalizer/include/eventhandler_shared.hch b/Graphic_Equalizer/include/eventhandler_shared.hch index 342bb0b..90922fb 100644 --- a/Graphic_Equalizer/include/eventhandler_shared.hch +++ b/Graphic_Equalizer/include/eventhandler_shared.hch @@ -27,9 +27,10 @@ * Type definition of the shared memory to be used in various processes */ typedef struct { - unsigned 1 help; unsigned 10 volume_position; + unsigned ram 9 equalizer_position[128]; unsigned 8 mask; + unsigned 1 help; } events_t; diff --git a/Graphic_Equalizer/include/fft.hch b/Graphic_Equalizer/include/fft.hch new file mode 100644 index 0000000..6bcc8cc --- /dev/null +++ b/Graphic_Equalizer/include/fft.hch @@ -0,0 +1,8 @@ +#if HARDWARE_MULTIPLY +void perform_fft(signed 18 *pcm_audio); +void perform_ifft(signed 18 *modified_audio /*,unsigned 6 *ifft_info*/); +#else +void perform_fft(signed 16 *pcm_audio); +void perform_ifft(signed 16 *modified_audio /*,unsigned 6 *ifft_info*/); +#endif +void equalize_audio(unsigned 4 *eq_level, unsigned 7 *fft_info); diff --git a/Graphic_Equalizer/src/audio.hcc b/Graphic_Equalizer/src/audio.hcc index 2959591..b38805b 100644 --- a/Graphic_Equalizer/src/audio.hcc +++ b/Graphic_Equalizer/src/audio.hcc @@ -26,9 +26,8 @@ -/*! \fn void audio_init(gain_level, - * input_source, - * sample_rate) +/*! \fn void audio_init(gain_level, input_source, + * sample_rate, AUDIOIN, AUDIOOUT) * * \brief Set some inital values to the audio hardware. * @@ -43,12 +42,7 @@ * \retval void * */ -macro proc audio_init(gain_level, input_source, sample_rate) { - /* - * Setup audio pointers. - */ - macro expr AudioIn = PalAudioInCT(0); - macro expr AudioOut = PalAudioOutCT(0); +macro proc audio_init(gain_level, input_source, sample_rate, AUDIOIN, AUDIOOUT) { /* * We simply call the appropiate handlers and pass values along. We * Don't set the mute on input gain. We have volume control to do this. @@ -57,31 +51,27 @@ macro proc audio_init(gain_level, input_source, sample_rate) { */ RC200AudioInSetGain(FALSE, gain_level, gain_level); RC200AudioInSetInput(input_source); - PalAudioInSetSampleRate(AudioIn, sample_rate); - PalAudioOutSetSampleRate(AudioOut, sample_rate); + PalAudioInSetSampleRate(AUDIOIN, sample_rate); + PalAudioOutSetSampleRate(AUDIOOUT, sample_rate); } /* --- audio_init() --- */ -/*! \fn void audio_main(void); +/*! \fn void audio_main(AUDIOIN, AUDIOOUT); + * * \brief Main audiodriver. This function never returns! It calls the * audiohandlers and stores samples into a global array. Once 64 * Samples are collected it raises a signal AUDIO_READY to let * other processes know it's ready. We use quadruple buffering for * audio input and double buffering for audio output. * - * \param void + * \param AUDIOIN Audio Input Handler + * \param AUDIOOUT Audio Output Handler * * \return Never Returns. * \retval void */ -void audio_main(void) { - /* - * Setup audio pointers. - */ - macro expr AudioIn = PalAudioInCT(0); - macro expr AudioOut = PalAudioOutCT(0); - +macro proc audio_main(AUDIOIN, AUDIOOUT) { /* * Determin the data width for the current platform. */ @@ -92,7 +82,7 @@ void audio_main(void) { signed OW sample_left_out, sample_right_out; for (;;) { - PalAudioInRead(AudioIn, &sample_left_in, &sample_right_in); + PalAudioInRead(AUDIOIN, &sample_left_in, &sample_right_in); /* par { sample_add(sample_left_in); @@ -104,6 +94,6 @@ void audio_main(void) { * 64 Samples have been processed, calculate. * / } -*/ PalAudioOutWrite(AudioOut, (signed OW)(sample_left_in @ 0), (signed OW)(sample_right_in @ 0)); +*/ PalAudioOutWrite(AUDIOOUT, (signed OW)(sample_left_in @ 0), (signed OW)(sample_right_in @ 0)); } } /* --- audio_main() --- */ diff --git a/Graphic_Equalizer/src/display.hcc b/Graphic_Equalizer/src/display.hcc index 3260990..79cf4b2 100644 --- a/Graphic_Equalizer/src/display.hcc +++ b/Graphic_Equalizer/src/display.hcc @@ -42,7 +42,7 @@ chan unsigned 1 maskupdate_notification; -/*! \fn void display_main(events_t *events, +/*! \fn void display_main(equalizer_levels_t *equalizer_levels, events_t *events, * mousedata_t *mousedata, ClockRate, RAM_BANK0); * * \brief This routine handles all drawing of pixels. It never returns! @@ -111,7 +111,11 @@ macro proc display_main(events, mousedata, CLOCKRATE, VIDEOOUT, RAM_BANK0) { } break; default: - PalVideoOutWrite(VIDEOOUT, PIXEL); + if ((AREA_EQUALIZER_MIN <= pixeldata[31:24]) && (pixeldata[31:24] <= AREA_EQUALIZER_MAX) && ((SCANY -382) == 0 @ events.equalizer_position[(pixeldata[31:24] -0x80) <- 7])) { + PalVideoOutWrite(VIDEOOUT, PIXEL_EQUALIZER); + } else { + PalVideoOutWrite(VIDEOOUT, PIXEL); + } break; } @@ -126,8 +130,8 @@ macro proc display_main(events, mousedata, CLOCKRATE, VIDEOOUT, RAM_BANK0) { if ((SCANX == 0 @ mousedata.x) && (SCANY == 0 @ mousedata.y)) { par { events.mask = pixeldata[31:24]; - maskupdate_notification ! MOUSE_UPDATED; mousedata.status = MOUSE_NOT_UPDATED; + maskupdate_notification ! MOUSE_UPDATED; } } else { delay; diff --git a/Graphic_Equalizer/src/eventhandler.hcc b/Graphic_Equalizer/src/eventhandler.hcc index b614d28..f0583aa 100644 --- a/Graphic_Equalizer/src/eventhandler.hcc +++ b/Graphic_Equalizer/src/eventhandler.hcc @@ -36,7 +36,7 @@ extern chan unsigned 1 maskupdate_notification; -/*! \fn void eventhandler_main(events_t *events, mousedata_t *mousedata); +/*! \fn void eventhandler_main(equalizer_levels_t *equalizer_levels, events_t *events, mousedata_t *mousedata); * \brief * * \param events_t *events pointer to struct with all events. @@ -45,12 +45,15 @@ extern chan unsigned 1 maskupdate_notification; * \return Never Returns. * \retval void */ -macro proc eventhandler_main(events, mousedata) { +macro proc eventhandler_main(equalizer_levels, events, mousedata) { unsigned 5 volume_left; unsigned 1 newmaskupdate; for (;;) { maskupdate_notification ? newmaskupdate; + print_string("Mask: ");print_hex_value(0 @ events.mask);print_eol(); + print_string("state: ");print_hex_value(0 @ mousedata.state);print_eol(); + /* * First we determine what mousestate we currently have. Then * we check where we are to decide what to do. @@ -96,7 +99,25 @@ macro proc eventhandler_main(events, mousedata) { delay; } if ((AREA_EQUALIZER_MIN <= events.mask) && (events.mask <= AREA_EQUALIZER_MAX)) { - delay; + print_string("Ypos for eq: ");print_hex_value(0 @ mousedata.y);print_eol(); + /* + * Copy the current Y position into a + * store for the current equalizer bar. + */ + events.equalizer_position[(events.mask -0x80) <- 7] = mousedata.y; + /* + * We look our current possition up in + * the lookup table. We determin our + * position via the current Y position + * (minus an offset of course). We + * store the result in the array of + * equalizer levels. The index we get + * from the current mask. + * + * TODO: lock equalizer store with a + * semaphore! + */ + equalizer_levels.write[0 @ (events.mask -0x80) <- 7] = equalizer_table[((mousedata.y) -382) <- 7]; } else { delay; } diff --git a/Graphic_Equalizer/src/fft.hcc b/Graphic_Equalizer/src/fft.hcc new file mode 100644 index 0000000..7c3fa94 --- /dev/null +++ b/Graphic_Equalizer/src/fft.hcc @@ -0,0 +1,454 @@ +#include +#include +#include "weights256.hch" +#include "config.hch" +#include "debug.hch" +#include "xilinxmult.hch" + +#define PERFORM_FFT_CALCULATION 1 +#define USE_UNSIGNED_AUDIO 0 +#define PRINT_DEBUG 0 +/* Define two multi-port RAMs for FFT calculation; one for real and one for imaginary values + * Extra block RAM settings are defined to make sure read and write actions can be performed + * within one clock-cycle. + * Left out extra settings on new board the clock changes TODO !!!! + */ +#if HARDWARE_MULTIPLY +mpram +{ + ram signed 18 rwrite[256]; + rom signed 18 read[256]; +} real with {block = "BlockRAM"/*, westart=2.5, welength=1, rclkpos={1.5}, wclkpos={3}, clkpulselen=0.5*/}; + +mpram +{ + ram signed 18 rwrite[256]; + rom signed 18 read[256]; +} imaginary with {block = "BlockRAM"/*, westart=2.5, welength=1, rclkpos={1.5}, wclkpos={3}, clkpulselen=0.5*/}; +#else +mpram +{ + ram signed 24 rwrite[256]; + rom signed 24 read[256]; +} real with {block = "BlockRAM"/*, westart=2.5, welength=1, rclkpos={1.5}, wclkpos={3}, clkpulselen=0.5*/}; + +mpram +{ + ram signed 24 rwrite[256]; + rom signed 24 read[256]; +} imaginary with {block = "BlockRAM"/*, westart=2.5, welength=1, rclkpos={1.5}, wclkpos={3}, clkpulselen=0.5*/}; +#endif +// multiplication factors for equalizer function +ram signed 7 eq_settings[16] = {0,2,4,7,10,13,16,19,22,26,30,35,41,48,55,63}; + + +/**************************************************************** +* Function: multiply * +* * +* Arguments * +* x,y signed variables * +* * +* Description * +* Just a multiplier. But by doing this in a function the * +* FPGA space needed is reduced. * +* * +* Return Values * +* The result after multiplication * +****************************************************************/ +macro proc multiply(result, op_a, op_b) +{ +#if HARDWARE_MULTIPLY + xilinxmult(result, op_a, adjs(op_b,18)); +#else + macro expr mul_width = (width(op_a) + width(op_b)); + result = adjs(op_a, mul_width) * adjs(op_b, mul_width); +#endif +/* signed result; + + fixed_mul(result,x,y); + return result;*/ +} +/*macro proc multiply(result, x,y) +{ +#if HARDWARE_MULTIPLY + xilinxmult(result, adjs(x,18), adjs(y,18)); +#else + result = ((adjs(x,36))*(adjs(y,36))); +#endif + +} +*/ + + + +/******************************************************************* +* Function: calculate_fft * +* * +* Arguments * +* select_inverse Boolean that indicates FFT or iFFT calculation * +* * +* Description * +* This routine performs the Fast Fourier Transform for * +* calculation of the frequency spectrum * +* * +*******************************************************************/ +void calculate_fft(unsigned 1 select_inverse) +{ + unsigned 4 level; + unsigned 8 point1,point2,j,f,k; + unsigned 9 e,i; + signed 16 weight1,weight2; +#if HARDWARE_MULTIPLY + signed 18 p,q,r,t; +#else + signed 24 p,q,r,t; +#endif + signed a,b; + + macro expr rescale (x) = (x[35] @ x[30:14]); + + for(level=1;level<=NUMBER_OF_COLUMNS;level++) // count all the columns + { + e=1<<(NUMBER_OF_COLUMNS-level+1); // number of points in each block in this column + f=(e>>1)<-8; // number of butterflies in each block in this column + + for(j=1;j<=f;j++) // count all the butterflies in each block + { + par + { + // Weight factors for real (the same for FFT and iFFT) + weight1 = weight_re[((j-1)<<(level-1))<-7]; + + + // Weight factors for imaginary (opposite for FFT and iFFT) + weight2 = (!select_inverse) ? (weight_im[((j-1)<<(level-1))<-7]) : -(weight_im[((j-1)<<(level-1))<-7]); + + /* ORIGINAL CODE BELOW, MODIFIED BECAUSE OF MISMATCHING OUTPUT WITH BORLAND TESTAPP + weight2 = (!select_inverse) ? -(weight_im[((j-1)<<(level-1))<-7]) : weight_im[((j-1)<<(level-1))<-7]; + */ + + + + for(i=0@j;i<=NUMBER_OF_POINTS;i+=e) // count all the blocks in this column + { // Butterfly calculation + par + { + point1 = ((i<-8)-1); + point2 = (((i<-8)+f)-1); + } + + par + { + p = (real.read[point1] >> 1) + (real.rwrite[point2] >> 1); + q = (imaginary.read[point1] >> 1) + (imaginary.rwrite[point2] >> 1); + } + + par + { + r = (real.read[point1] >> 1) - (real.rwrite[point2] >> 1); + t = (imaginary.read[point1] >> 1) - (imaginary.rwrite[point2] >> 1); + } + + multiply(a,r,weight1); + multiply(b,t,weight2); + + par + { + real.rwrite[point2] = (rescale(a-b)); + imaginary.rwrite[point1] = q; + } + + multiply(a,t,weight1); + multiply(b,r,weight2); + + par + { + real.rwrite[point1] = p; + imaginary.rwrite[point2] = (rescale(a+b)); + } + + } + } + } + } + + j=1; + for(i=1;i>1; + + + while(k>1; + } + + j+=k; + } + +} + +/********************************************************************/ +#if HARDWARE_MULTIPLY +void perform_fft(signed 18 *pcm_audio) +#else +void perform_fft(signed 16 *pcm_audio) +#endif +{ + unsigned 8 k; + + +#if HARDWARE_MULTIPLY + signed 18 sample; + k=0; + sample = adjs(pcm_audio[k],18); +#else + signed 24 sample; + k=0; + sample = adjs(pcm_audio[k],24); +#endif + + //initialize variables for the copying pipeline + + + // copy audio data to real-array before starting FFT calculation + // and set imaginary values to zero + do + { + //Copying the array values has been pipelined to prevent parallel access to the + //pcm_audio array. This copying procedure must be finished before another + //sample is read from the audio input. The time available for this loop is + //determined by the sampling rate of 44,1 Khz + par + { + //COPYING NEEDS TO BE DONE IN 2 STEPS, BECAUSE THE VALUE THAT NEEDS TO WRITTEN + //TO THE REAL-RAM NEEDS TO BE AVAILABLE ON THE START OFF THE CLOCKCYCLE. +#if HARDWARE_MULTIPLY + sample = adjs(pcm_audio[k+1],18); +#else + sample = adjs(pcm_audio[k+1],24); +#endif + real.rwrite[k] = sample; + imaginary.rwrite[k] = 0; + k++; + } + } while (k); + + + +#if PERFORM_FFT_CALCULATION + calculate_fft(0); +#endif + + +} + +/********************************************************************/ +#if HARDWARE_MULTIPLY +void perform_ifft(signed 18 *modified_audio/*, unsigned 6 *ifft_info*/) +#else +void perform_ifft(signed 16 *modified_audio/*, unsigned 6 *ifft_info*/) +#endif +{ + unsigned 6 k; +#if HARDWARE_MULTIPLY + signed 18 p; +#else + signed 24 p; +#endif +#if PERFORM_FFT_CALCULATION + calculate_fft(1); +#endif + + k=0; +//initialize variables for the copying pipeline +#if PERFORM_FFT_CALCULATION + #if HARDWARE_MULTIPLY + p = (real.read[(0@k)+95] << NUMBER_OF_COLUMNS); + #else + p = (real.read[(0@k)+95] >> NUMBER_OF_COLUMNS); + #endif +#else + p = (real.read[(0@k)+95]); +#endif + + do + { + //Copying the array values has been pipelined to prevent parallel access to the + //pcm_audio array. This copying procedure must be finished before another + //sample is read from the audio input. The time available for this loop is + //determined by the sampling rate of 44,1 Khz + par + { +#if PERFORM_FFT_CALCULATION + #if HARDWARE_MULTIPLY + p = (real.read[(0@k)+95] << NUMBER_OF_COLUMNS); + #else + p = (real.read[(0@k)+95] >> NUMBER_OF_COLUMNS); + #endif +#else + p = (real.read[(0@k)+95]); +#endif +#if HARDWARE_MULTIPLY + modified_audio[k] = p ; +#else + modified_audio[k] = (p<-16); +#endif + //ifft_info[k] = (unsigned)(p[15:10]); + k++; + } + } while(k); +} + +/********************************************************************/ +void equalize_audio(unsigned 4 *eq_level, unsigned 7 *fft_info) +{ +#if 1 +#if HARDWARE_MULTIPLY + signed 18 p,q; +#else + signed 24 p,q; +#endif + signed 16 a; + unsigned 8 i, mirror_i, bit, m, n; + unsigned 7 old_value; + unsigned 9 tmp; + + //macro expr equalize_bar = multiply(q,a)[29:6]; + + macro proc equalize_bar(result) + { + signed result; + multiply(result, q,a); +#if HARDWARE_MULTIPLY + result = result[29:12]; +#else + result = result[29:6]; +#endif + } +#if HARDWARE_MULTIPLY + p = real.read[0] - 10; +#else + p = real.read[0] - DC_COMPONENT; // remove DC component for calculations +#endif + real.rwrite[0] = p; +// imaginary.rwrite[0] = 0; // remove DC component + + + for(i=0;i<=NUMBER_OF_FREQUENCIES;i++) + { + // set multiplication factor (0..64) for current frequency bar + a = adjs(eq_settings[eq_level[i<-7]],16); + + // multiply frequency with this factor and divide by 64 (drop 6 LSB's) + q = real.read[i]; + equalize_bar(p); + real.rwrite[i] = p; + + q = imaginary.read[i]; + equalize_bar(p); + imaginary.rwrite[i] = p; + + // the upper part(128..255) of the spectrum is mirrored to the lower part; + // these values need to be adjusted too + if ((i<-7)!=0) // if not in DC component bar + { + mirror_i = (NUMBER_OF_POINTS-1)-i+1; + q = real.read[mirror_i]; + equalize_bar(p); + real.rwrite[mirror_i] = p; + + q = imaginary.read[mirror_i]; + equalize_bar(p); + imaginary.rwrite[mirror_i] = p; + } + } + + //write data to fft_info for display purposes + for(i=0;i>1; + fft_info[i<-7] = (old_value <= (tmp<-7)) ? (tmp<-7) : old_value-1; + } + else + { + old_value = fft_info[i<-7]; +#if HARDWARE_MULTIPLY + fft_info[i<-7] = (old_value<=(unsigned)(p[15:9])) ? (unsigned)(p[15:9]) : old_value-1; +#else + fft_info[i<-7] = (old_value<=(unsigned)(p[21:15])) ? (unsigned)(p[21:15]) : old_value-1; +#endif + } + } + + // add DC component again before inverse FFT calculation is performed +#if HARDWARE_MULTIPLY + p = real.read[0] +10;// + DC_COMPONENT; +#else + p = real.read[0] + DC_COMPONENT; +#endif + real.rwrite[0] = p; +#endif +} diff --git a/Graphic_Equalizer/src/main.hcc b/Graphic_Equalizer/src/main.hcc index 9c18ca5..60eb71b 100644 --- a/Graphic_Equalizer/src/main.hcc +++ b/Graphic_Equalizer/src/main.hcc @@ -60,6 +60,7 @@ void main(void) { mousedata_t mousedata; events_t events; + mpram equalizer_levels_t equalizer_levels; unsigned 1 result; /* @@ -123,7 +124,7 @@ void main(void) { display_init(ClockRate); PalAudioInEnable(AudioIn); PalAudioOutEnable(AudioOut); - audio_init(6, LINE_IN, SR_44100); + audio_init(6, LINE_IN, SR_44100, AudioIn, AudioOut); #if HAVE_SMARTMEDIA /* * Once we properly setup the SmartMedia we load our @@ -154,8 +155,8 @@ void main(void) { */ mouse_main(mousedata); display_main(events, mousedata, ClockRate, VideoOut, RAM_BANK0); - eventhandler_main(events, mousedata); - audio_main(); + eventhandler_main(equalizer_levels, events, mousedata); + audio_main(AudioIn, AudioOut); } #if HAVE_SMARTMEDIA } else { diff --git a/Graphic_Equalizer/src/mouse.hcc b/Graphic_Equalizer/src/mouse.hcc index 8db9c51..4d28097 100644 --- a/Graphic_Equalizer/src/mouse.hcc +++ b/Graphic_Equalizer/src/mouse.hcc @@ -25,9 +25,14 @@ #include "pal_mouse.hch" /******** Application Includes ********/ +#include "configuration.hch" #include "mouse_shared.hch" #include "mouse.hch" +#if HAVE_DEBUG + #include "debug.hch" +#endif + /*! \fn void mouse_main(mousedata_t *mousedata); @@ -54,7 +59,7 @@ macro proc mouse_main(mousedata) * using newer libs this might be overkill, e.g. smaller values may due * or sampling all together will be redundant. */ - for(touch_sampler = 1;;touch_sampler++) { + for(touch_sampler = 1;; touch_sampler++) { if (!touch_sampler) { /* * We are here ready to set mouse states. We compare @@ -83,19 +88,31 @@ macro proc mouse_main(mousedata) touched = FALSE; /* + * In the rare occurance that we receive values + * beyond our range, we set them to some sane + * values here. + */ + x = (x > 639) ? 0 : x; + y = (y > 479) ? 0 : y; + + /* * Compare Previous States and Coordinates to determine * wether they have changed. If so, Copy them into * shared memory, notify the listening processes and - * Set the new as previous values for the next run. + * Set the new as previous values for the next run. We + * can only do this when the display has handled all + * changes. */ - if ((oldmousestate != mousestate) || (oldx != x) || (oldy != y)) { - mousedata.x = x; - mousedata.y = y; - mousedata.state = mousestate; - mousedata.status = MOUSE_UPDATED; - oldx = x; - oldy = y; - oldmousestate = mousestate; + if (((oldmousestate != mousestate) || (oldx != x) || (oldy != y)) && (MOUSE_NOT_UPDATED == mousedata.status)) { + //par { + oldx = x; + oldy = y; + oldmousestate = mousestate; + mousedata.x = x; + mousedata.y = y; + mousedata.state = mousestate; + mousedata.status = MOUSE_UPDATED; + //} } } diff --git a/Graphic_Equalizer/src/smartmedia.hcc b/Graphic_Equalizer/src/smartmedia.hcc index 5c547cc..86d6f44 100644 --- a/Graphic_Equalizer/src/smartmedia.hcc +++ b/Graphic_Equalizer/src/smartmedia.hcc @@ -100,7 +100,7 @@ macro proc smartmedia_loaddata(RAM_BANK0) { * We start with the address of the skin, and do the loop until we have * done the end of the help. */ - for (address = ADDRESS_SKIN_START; address != (ADDRESS_HELP_END +1); address++) { + for (address = ADDRESS_SKIN_START; address != (ADDRESS_SKIN_END +1); address++) { /* * Once we are done with the loading of our skin, we need to * change the smartmedia start addresses. @@ -114,7 +114,12 @@ macro proc smartmedia_loaddata(RAM_BANK0) { * Before reading our data from the smartmedia we set our * address pointer to the address from our loop. */ +#if SKIP_LOAD + PalPL2RAMSetWriteAddress(RAM_BANK0, 0); +#else +/* Warning: Make sure the proper images are loaded into ram before calling! */ PalPL2RAMSetWriteAddress(RAM_BANK0, address); +#endif /* * SmartMedia data is read one byte per call. Because we want @@ -145,7 +150,7 @@ macro proc smartmedia_loaddata(RAM_BANK0) { data = 0 @ mask @ r @ g @ b; #else - data = 0xff000f00; + data = 0x0000ff00; #endif /* * Now that we have gathered all pixel data, store it in ram. diff --git a/Support_Libs/debug/debug.hcc b/Support_Libs/debug/debug.hcc index 618ca46..ac7c481 100644 --- a/Support_Libs/debug/debug.hcc +++ b/Support_Libs/debug/debug.hcc @@ -4,21 +4,33 @@ #include "debug.hch" -void print_hex_value(unsigned 32 value) -{ - unsigned 8 ch; - unsigned 4 i; +void print_hex_value(unsigned 32 value) { + unsigned char character; + unsigned 4 index; - for(i = 0;i < 8;i++) - { - ch = 0 @ (value\\28); + /* + * We print 32 bits values max, so we only need 8 positions. + */ + for(index = 0; index != 7; index++) { + /* + * The 4 MSB equals one hex digit so we ignore the rest. + */ + character = 0 @ (value \\ 28); + /* + * To easly get our 4 MSB on the next run, we shift them here. + */ value <<= 4; - ch += (ch > 9) ? 0x37 : 0x30; - PalDataPortWrite(PalRS232PortCT(0), ch); + /* + * We now have a value between 0 and f stored in our variable. + * We simply add the appropiate value to our character because + * only ascii characters make sense to be printed. + */ + character += (character > 9) ? 0x37 : 0x30; + PalDataPortWrite(PalRS232PortCT(0), character); } } -void print_string(unsigned char *s) { +void print_string(unsigned char *string) { unsigned 10 index; /* @@ -27,8 +39,8 @@ void print_string(unsigned char *s) { * with the '\0' character. Since Handel-C init's var's to 0 this * normally will never go wrong. */ - for(index = 0; '\0' != s[index]; index++) { - PalDataPortWrite(PalRS232PortCT(0), s[index]); + for(index = 0; '\0' != string[index]; index++) { + PalDataPortWrite(PalRS232PortCT(0), string[index]); } } -- cgit v0.12