Main code - LemonRepublica/RPI_AMP GitHub Wiki
In main codes, we design four different function in order to achieve effects we wanted to get.Here are the core algorithms .
Distortion:
if (input_signal > 2047 + distortion_gain)
input_signal= 2047 + distortion_gain;
if (input_signal < 2047 - distortion_gain)
input_signal= 2047 - distortion_gain;>
The distortion is simulating the analog saturation distortion. Two thresholds are set to flatten the signal. It will sound like the 60's fuzzy power-amp distortion.
Delay
Delay_Buffer[DelayCounter] = input_signal + Delay_Buffer[DelayCounter]>>1;
DelayCounter++;
if(DelayCounter >= Delay_Depth)
DelayCounter = 0;
input_signal = (int)(Delay_Buffer[DelayCounter]* ((del_lev * 0.1)+0.5))+input_signal>>1; Delay is use a buffer to store the signals and then send them out with current signal together. It will sound like echo.
Reverb
Reverb_Buffer1[ReverbCounter1] = (input_signal + Reverb_Buffer1[ReverbCounter1])>>1;
Reverb_Buffer2[ReverbCounter2] = (input_signal + Reverb_Buffer2[ReverbCounter2])>>1;
Reverb_Buffer3[ReverbCounter3] = (input_signal + Reverb_Buffer3[ReverbCounter3])>>1;
Reverb_Buffer4[ReverbCounter4] = (input_signal + Reverb_Buffer4[ReverbCounter4])>>1;
Reverb_Buffer5[ReverbCounter5] = (input_signal + Reverb_Buffer5[ReverbCounter5])>>1;
ReverbCounter1++;
if(ReverbCounter1 >= Reverb_Depth1)
ReverbCounter1 = 0;
ReverbCounter2++;
if(ReverbCounter2 >= Reverb_Depth2)
ReverbCounter2 = 0;
ReverbCounter3++;
if(ReverbCounter3 >= Reverb_Depth3)
ReverbCounter3 = 0;
ReverbCounter4++;
if(ReverbCounter4 >= Reverb_Depth4)
ReverbCounter4 = 0;
ReverbCounter5++;
if(ReverbCounter5 >= Reverb_Depth5)
ReverbCounter5 = 0;
input_signal=(int)(input_signal + ((Reverb_Buffer1[ReverbCounter1]) * 0.7) +((Reverb_Buffer2[ReverbCounter2]) * 0.7)
+((Reverb_Buffer3[ReverbCounter3] * 0.7))+((Reverb_Buffer4[ReverbCounter4] * 0.7))
+((Reverb_Buffer5[ReverbCounter5] * 0.7)))>>2;
Reverb is simulating the sound effect in a complex closed environment. Multi irregular echoes are applied to get a rich reverb sound. A discount of 0.7 is set to make the echoes not so loud.
EQ
bufferx[0] = bufferx[1];
bufferx[1] = bufferx[2];
bufferx[2] = bufferx[3];
bufferx[3] = bufferx[4];
bufferx[4] = input_signal/eq_gain;
buffery[0] = buffery[1];
buffery[1] = buffery[2];
buffery[2] = buffery[3];
buffery[3] = buffery[4];
buffery[4] = (bufferx[0] + bufferx[4])
+ coe5 * (bufferx[1] + bufferx[3]) + coe6 * bufferx[2]
+ (coe1 * buffery[0]) + (coe2 * buffery[1])
+ (coe3 * buffery[2]) + (coe4 * buffery[3]);
input_signal = (int)(buffery[4]*((high * 0.1)+0.5));
EQ is using Butterworth filter to change the frequency component. That will make the sound hear darker or brighter. There are 6 coefficients in the Butterworth Bandstop filter.