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.