Acordor de chitara

Introducere

Proiectul este un acordor de chitara. Selectia unei corzi de acordat se face prin apasarea butonului corespunzator corzii. Dupa selectia microfonul va prelua sunetul si ii va testa frecventa cu frecventa de referinta a sunetului, urmand sa afiseze gradul de corectitudine prin aprinderea unuia dintre cele 3 leduri astfel:

  • ledul rosu din stanga : frecventa este prea joasa
  • ledul verde din centru : frecventa este cea corecta
  • ledul rosu din dreapta : frecventa este prea inalta

Scopul proiectului este acela de a permite o acordare cat mai simpla a unei chitare.

Descriere generală

Module Hardware

In afara modulelor hardware din cadrul placutei de baza din prima etapa, se disting urmatoarele module:

  • modul de preamplificare - amplifica semnalului primit de la microfon
  • modul de selectie - un set de 6 butoane care permit selectia corzii de acordat
  • modul de test - un set de 3 leduri care vor afisa gradul de corectitudine al sunetului

Module Software

Se disting 5 module software:

  • modul de alegerea a frecventei de referinta - va seta frecventa de referinta in functie de butonul selectat
  • modul de conversie analog-digital - va transforma semnalul analogic intors de microfon intr-un semnal digital
  • modul “Transformata Fourier” - va aplica transformata fourier (FFT) pe valorile returnate de ADC
  • modul de extragere a frecventei - va selecta frecventa din valorile intoarse de modulul Fourier
  • modul de afisare a corectitudinii - va compara frecventa selectata cu valoarea de referinta si va afisa corectitudinea cu funtiile (correct_led(), higher_led(), lower_led, err_led() ).

Schema bloc Hardware

Schema bloc Software

Hardware Design

Piese
  • microfon capsula
  • tranzistor 2N3904
  • condensatoare
  • rezistente
  • 3 x leduri
  • 6 x intrerupatoare
Scheme electrice
  • schema de preamplificare - outputul schemei este conectat la pinul 40 al AT-MEGA16

  • schema modulului de test

  • schema modulului de selectie

Software Design

Module Software

  • Modulul de afisare al corectitudinii
    • se bazeaza pe urmatoarele 4 functii:
      • correct_led() - va lumina ledul central ( coarda este acordata)
      • higher_led() - va lumina ledul rosu din dreapta ( frecventa prea mare)
      • lower_led() - va lumina ledul rosu din stanga ( frecventa prea mica)
      • err_led() - va lumina ambele leduri rosii ( exista mai multe butoane apasate )

void correct_led()

{
	PORTB |= (1<<PB1);
	PORTB &= ~(1<<PB0) & ~(1<<PB2);
}

void lower_led()

{
	PORTB |= (1<<PB0);
	PORTB &= ~(1<<PB1) & ~(1<<PB2);
}

void higher_led()

{
	PORTB |= (1<<PB2);
	PORTB &= ~(1<<PB0) & ~(1<<PB1);
}

void err_led()

{
	PORTB |= (1<<PB0) | (1<<PB2);
	PORTB &= ~(1<<PB1);
}
  • Modul de selectie
    • se refera la alegerea unei corzi de testat prin apasarea unui singur buton
    • functia folosita: sel_but()

int sel_but()

{
 int b_sel = -1;
 int selected = 0;

 if (!(PINC & (1<<PC0)))
	{
		b_sel = 0;
		selected = 1;
	}

 if (!(PINC & (1<<PC1)))
	{
	  if(selected)
		return -2;
	  else
	  {
		b_sel = 1;
		selected = 1;
	  }
	}

 if (!(PINC & (1<<PC2)))
	{
		if(selected)
			return -2;
		else
		{
			b_sel = 2;
			selected = 1;
		}
	}
	
if (!(PINC & (1<<PC3)))
	{
		if(selected)
			return -2;
		else
		{
			b_sel = 3;
			selected = 1;
		}
	}
	
if (!(PINC & (1<<PC4)))
	{
		if(selected)
			return -2;
		else
		{
			b_sel = 4;
			selected = 1;
		}
	}
	
 if (!(PINC & (1<<PC5)))
	{
		if(selected)
			return -2;
		else
		{
			b_sel = 5;
			selected = 1;
		}
	}

 return b_sel;
}
  • Modulul ADC
    • contine 2 functii:
      • ADC_init() - initializeaza ADC pe canalul 0 in modul free running cu prescaler fclk/128 cu intreruperi active si cu tensiunea de referinta AVCC cu un condensator extern pe pinul AREF
      • ADC_get() - preia valoarea obtinuta in urma conversiei

void ADC_init()

{
	ADMUX = 0;
	ADMUX |= (1<<REFS0) | (1<<ADLAR);
	ADCSRA = 0;
	ADCSRA |= (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADATE);
	SFIOR &= ~(1<<ADTS0) & ~(1<<ADTS1) & ~(1<<ADTS2);
	ADCSRA |= (1<<ADEN);
}

float ADC_get()

{
	
	ADCSRA |= (1<<ADSC);
	loop_until_bit_is_set(ADCSRA,ADIF);
	return ADCH;
}
  • Modulul Fourier - aplica transformata Fourier FFT asupra valorilor preluate de la modulul ADC

void fourier(float *x)

{
	long i,j,k,logN,le,le2;
	float *p, *q,t, ur, ui,arg,wr,wi,*p1r,*p1i,*p2r,*p2i,tr,ti;
	logN = (long)(log(16)/log(2.) + .5);
	
	
	for(i=2;i< 30;i+=2)
		{
			for(k=2, j=0;k<32;k<<=1)
				{
					if ( i & k ) j++;
					j <<=1;
				}
			if (i < j)
				{
				 p = x + i;
				 q = x + j;
				 t = *p;
				 *(p++) = *q;
				 *(q++) = t;
				 t = *p;
				 *p = *q;
				 *q = t;
				}
		}
		
	for (k = 0, le = 2; k<logN; k++)
		{
			le <<= 1;
			le2 = le >> 1;
			ur = 1.0;
			ui = 0.0;
			arg = M_PI/(le2>>1);
			wr = cos(arg);
			wi = -sin(arg);
			
			for(j=0;j<le2;j+=2)
				{
				 p1r = x + j; p1i = p1r + 1;
				 p2r = p1r + le2; p2i= p2r + 1;
				 for(i=j;i<32;i+=le)
					{
						tr = *p2r * ur - *p2i * ui;
						ti = *p2r * ui + *p2i * ur;
						*p2r = *p1r - tr;
						*p2i = *p1i - ti;
						*p1r += tr;
						*p1i += ti;
						p1r += le;
						p1i += le;
						p2r += le;
						p2i += le;
					}
				tr = ur *wr - ui * wi;
				ui = ur * wi + ui * wr;
				ur = tr;
				}
		}
}

Rezultate Obţinute

Acordarea nu se face corespunzator deoarece nu s-a putut realiza extragerea corecta a frecventei din sirul rezultat in urma transformatei fourier.

Concluzii

Nu s-a putut finisa proiectul in lipsa unei metode corecte de a extrage frecventa din sirul intors de transformata fourier. Metoda recomandata intoarce intotdeauna o frecventa cu valoarea 0:

fourier(v); max = -100; maxi = 0; F_curent = F_ref[x]; for(i=0;i<16;i++)

 if ( v[i] > max )
{max = v[i]; maxi = i; }

max = maxi * sampleRate/ transformLength;

if(max < F_curent +15 && max > F_curent -15)

correct_led();

else

if (max > F_curent)
	higher_led();
else
	lower_led(); 

Sampelul ales a fost de 16 valori de la ADC. A fost testata placuta si cu sampeluri mai mari (32,64,128) dar cu acelasi rezultat.

Download

Arhiva cu surse si scheme: acordor_de_chitara.zip

Arhiva contine:

  • sursa acordor.c
  • schemele bloc hard si soft
  • schemele electrice
  • un Makefile de compilare

Bibliografie/Resurse

Resurse Hardware

Resurse Software

pm/prj2011/dloghin/radu-andrei-acordor.txt · Last modified: 2021/04/14 17:07 (external edit)
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