80 likes | 164 Views
Voice Modulator by James C. Stroup. P urpose.
E N D
Purpose The purpose of this project is to receive an external signal via the RxBuffer and then manipulate the signal. The manipulation would allow the user to transform their recorded voice into that of the Chipmunks. The program would also give the user the ability to choose between a two speaker or four speaker output.
Specific Functionality To allow the user to hear an external signal. To allow the user to record the signal that they hear. To allow user to playback the sound that they record. To allow user to choose between a Front or Surround Sound form of output and seamlessly switch between them. To allow the user to alter the way theyhear their voice [Chipmunk Effect]. To give the user a visual experience that illustrates the function of the board (most notably, a “Loading Effect” [representing that the board is recording] that users would recognize from their use of popular operating systems). To allow the user to re-record unlimited times without signal degradation.
Responses to Functionality To send the RxBuffer to the TxBuffer automatically. To simultaneously send the RxBuffer into the SDRAM. To sample the SDRAM and send the result to the TxBuffer. To simultaneously send the output (ChannelLeftOut) to the TxBuffers required for the four speakers. To sample from the SDRAM twice as fast by incrementing the pointer twice to simulate the Chipmunk effect. To design these effects to respond to an interrupt. To integrate Lab 2 of this course’s LED Blink code with the algorithm that stores the song into the SDRAM To re-write the values of the buffer by resetting the pointer to the beginning.
Implementation Initialization of SDRAM void Init_SDRAM(void) { if (*pEBIU_SDSTAT & SDRS) { *pEBIU_SDRRC = 0x00000406; *pEBIU_SDBCTL = 0x00000025; *pEBIU_SDGCTL = 0x0091998d; *point = pSDRAM_open; ssync(); } }
Implementation Storing algorithm Loading Effect void Loading(void) { iChannel0LeftIn = iRxBuffer1[INTERNAL_ADC_L0]; iChannel0RightIn = iRxBuffer1[INTERNAL_ADC_R0]; iChannel1LeftIn = iRxBuffer1[INTERNAL_ADC_L0]; iChannel1RightIn = iRxBuffer1[INTERNAL_ADC_R0]; iChannel0LeftOut = iChannel0LeftIn; iChannel0RightOut = iChannel0RightIn; iChannel1LeftOut = iChannel1LeftIn; iChannel1RightOut = iChannel1RightIn; iTxBuffer1[INTERNAL_DAC_L0] = iChannel0LeftOut; iTxBuffer1[INTERNAL_DAC_R0] = iChannel0RightOut; iTxBuffer1[INTERNAL_DAC_L1] = iChannel1LeftOut; iTxBuffer1[INTERNAL_DAC_R1] = iChannel1RightOut; *point++ = (short)(iChannel0LeftIn>>8); } EX_INTERRUPT_HANDLER(Timer0_ISR) { if(LEDLOAD) { *pTIMER_STATUS = 0x0001; if(sLight_Move_Direction) { if((ucActive_LED = ucActive_LED >> 1) == 0x00) ucActive_LED = 0x40; } else { if((ucActive_LED = ucActive_LED << 1) == 0x40) ucActive_LED = 0x01; } } *pFlashA_PortB_Data = ucActive_LED; }
Implementation Chipmunk effect and output switch if (PLAY == 1) { ChannelLeftOut = *point++; if (FILTERCYCLE == 0) { iChannel0LeftOut = ((int) ChannelLeftOut)<<8; if (SPKRCYCLE==0) { Process_Data2(); } else if (SPKRCYCLE==1) { Process_Data4(); } } else if (FILTERCYCLE == 1) { ChannelLeftOut = *point++; iChannel0LeftOut = ((int) ChannelLeftOut)<<8; if (SPKRCYCLE==0) { Process_Data2(); } else if (SPKRCYCLE==1) { Process_Data4(); } }