Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:rnedelcu:dan_andrei.cretu03 [2025/05/27 13:52]
dan_andrei.cretu03 [Software Design]
pm:prj2025:rnedelcu:dan_andrei.cretu03 [2025/05/28 14:57] (current)
dan_andrei.cretu03 [Rezultate Obţinute]
Line 1: Line 1:
-Pedală de efect pentru chitară electrică +===== Pedală de efect pentru chitară electrică =====
-===== Introducere ​=====+
  
 <note tip> ​ <note tip> ​
Line 52: Line 51:
  
 Fire Fire
 +
 +Rezistenta de 5k legata la masa creeaza un divizor de tensiune, stabilizand semnalul ce vine de la chitara.
 +
 +Condensatorul de 0.47 µF de la intrare protejeaza restul componentelor de tensiuni nedorite si pastreaza numai variatiile audio utile. (cel putin in teorie)
 +
 +Filtrul trece jos de la iesire elimina zgomotele nedorite.
  
 {{:​pm:​prj2025:​rnedelcu:​hardware_pedala.jpeg?​600|}} {{:​pm:​prj2025:​rnedelcu:​hardware_pedala.jpeg?​600|}}
Line 65: Line 70:
  
 Citirea semnalului audio analogic de la chitară (pin A0). Citirea semnalului audio analogic de la chitară (pin A0).
 +
 +<code c++>
 +lastButtonState = buttonState;​
 +
 +  unsigned int raw = analogRead(ADC_PIN);​
 +  raw = (raw + 1) / 4 - 1;
 +
 +  unsigned int out = applyEffect(((float)raw) / SIGNAL_MAX) * SIGNAL_MAX;
 +</​code>​
  
 Prelucrarea semnalului prin funcții specifice fiecărui efect audio (distorsiune,​ tremolo, reverb etc.). Prelucrarea semnalului prin funcții specifice fiecărui efect audio (distorsiune,​ tremolo, reverb etc.).
 +
 + * Tremolo
 +
 +<code c++>
 +
 +int index = 0;
 +float applyTremolo(float x) {
 +  // version 1
 +  index++;
 +
 +  float Fs = TIMER / 8.0f;
 +  float Fx = 5.0f;
 +  float alpha = 0.25f;
 +  float trem = (1.1f + alpha * sin(2.0f * M_PI * index * (Fx / Fs)));
 +
 +  return trem * x * 2.0f;
 +}
 +
 +</​code>​
 +
 +
 + * Overdirve
 +
 +<code c++>
 +float applyDistortion(float x) {
 +  x *= 1.75f;
 +
 +  if (x > 1.0f) x = 1.0f;
 +  if (x < 0.0f) x = 0.0f;
 +
 +  float y;
 +  if (x < 0.2f)
 +    y = 0.0f;
 +  else if (x > 0.7f)
 +    y = 1.0f;
 +  else
 +    y = x * x * (3 - 2 * x);  // Smooth curve in between
 +
 +  return y;
 +}
 +</​code>​
 +
 + * Reverb
 +
 +<code c++>
 +uint8_t reverbBuffer[REVERB_BUFFER_SIZE];​
 +int reverbIndex = 0;
 +float applyReverb(float x) {
 +  // Read the delayed sample from buffer
 +  int delayedIndex = (reverbIndex - REVERB_DELAY + REVERB_BUFFER_SIZE) % REVERB_BUFFER_SIZE;​
 +  float delayedSample = reverbBuffer[delayedIndex] / 255.0f;
 +
 +  // Mix current input with decayed delayed sample
 +  float out = x + REVERB_DECAY * delayedSample;​
 +
 +  // Store current output in the buffer
 +  reverbBuffer[reverbIndex] = (uint8_t)(adjustAmplitude(out) * 255);
 +  reverbIndex = (reverbIndex + 1) % REVERB_BUFFER_SIZE;​
 +
 +  return adjustAmplitude(out);​
 +}
 +</​code>​
  
 Scrierea semnalului procesat pe un DAC extern (PCF8591) pentru ieșirea audio analogică. Scrierea semnalului procesat pe un DAC extern (PCF8591) pentru ieșirea audio analogică.
  
 Controlul efectului activ printr-un buton fizic conectat la pinul A1 – fiecare apăsare schimbă efectul curent. Controlul efectului activ printr-un buton fizic conectat la pinul A1 – fiecare apăsare schimbă efectul curent.
 +
 +<code c++>
 +   int buttonState = digitalRead(BUTTON);​
 +   
 +   if (lastButtonState == HIGH && buttonState == LOW) {
 +     ​currentEffect = (currentEffect + 1) % MAX_EFFECT; ​ // Next effect
 +     ​Serial.println(currentEffect);​
 +     ​delay(200);​ // Debounce simplu
 +   }
 +   
 +   ​lastButtonState = buttonState;​
 +</​code>​
  
 Algoritmi de procesare audio implementați în funcții dedicate fiecărui efect, folosind formule matematice simple și buffer circular (pentru reverb). Algoritmi de procesare audio implementați în funcții dedicate fiecărui efect, folosind formule matematice simple și buffer circular (pentru reverb).
 +
 +<code c++>
 +#define ADC_PIN A0        // Analog input from guitar signal
 +#define BUTTON A1
 +#define SIGNAL_MAX 255
 +
 +#define TIMER 15625
 +
 +#define REVERB_BUFFER_SIZE 1000  // Adjust based on available RAM
 +#define REVERB_DECAY 0.75f       // How much of the echo is preserved
 +#define REVERB_DELAY 800         // How far back in time (in samples) the echo is
 +
 +#define MAX_EFFECT 5
 +</​code>​
  
 Acest software permite utilizatorului să comute dinamic între efecte și să obțină sunete expresive folosind doar hardware minim și procesare digitală în timp real. Acest software permite utilizatorului să comute dinamic între efecte și să obțină sunete expresive folosind doar hardware minim și procesare digitală în timp real.
 +
 </​note>​ </​note>​
  
Line 80: Line 183:
  
 <note tip> <note tip>
-Care au fost rezultatele obţinute în urma realizării proiectului vostru.+Dupa multe incercari, am reusit sa ajung la o versiune finala. 
 + 
 +Partea de hardware ramas mai simpla decat ce mi-as fi dorit, fara valori reglate prin potentiometru. 
 + 
 +Am experimentat cu mai multe efecte, cele mai reusite fiind cel de distors, tremolo si reverb. 
 + 
 +Nu am reusit sa filtrez suficient de bine semnalul astfel incat semnalul ajuns la amplificator sa fie curat. 
 + 
 + * ADC - analogRead() 
 + 
 + * I2C - comunicarea cu DAC-ul 
 + 
 + * GPIO - pinMode 
 + 
 + * timere pentru tremolo 
 </​note>​ </​note>​
  
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Nu am. 
 +}===== Download =====
  
 <note warning> <note warning>
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). +{{:pm:prj2025:rnedelcu:proiect_hau.zip|}}
- +
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**.+
 </​note>​ </​note>​
  
pm/prj2025/rnedelcu/dan_andrei.cretu03.1748343143.txt.gz · Last modified: 2025/05/27 13:52 by dan_andrei.cretu03
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0