Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********************************************************************************************************************
- PESIT EEE 6th Sem Mini Project
- May 2013
- ELECTRONIC GUITAR TUNER
- Tested on: Arduino Uno
- Main Algorithm Used: Autocorrelation (for fundamental frequency)
- Software version: 1.0.1
- Test Parameters:
- INPUT: Emulated Acoustic guitar sound from Guitar Pro V5 (for windows)
- SIGNAL FLOW: Computer Audio out->Operational Amplifier->Arduino Uno->7 Segment Display
- USNs: 1PI10EE009
- 1PI10EE026
- 1PI10EE019
- *********************************************************************************************************************/
- /*****************************************************************************
- DECLARATIONS
- ******************************************************************************/
- #define N 200 //Buffer Size
- #define sampleF 38500//Hz
- #define display_time 5000//ms
- byte incomingAudio, bIndex=N-1;
- int buffer[N];
- long int corr[N], corrMin;
- long int t_old, t_new = millis();
- int i, j, minIndex,s;
- int Freq=0;
- boolean clipping = 0, flag = 0;
- const int A = 110, //These are the standard note frequencies
- As = 116, //At the lowest octave
- B = 123,
- C = 131,
- Cs = 139,
- D = 147,
- Ds = 156,
- E = 165,
- F = 171,
- Fs = 185,
- G = 196,
- Gs = 208;
- int note = A;
- int deviation = 0;
- bool dev; //Higher or lower from the correct note
- bool correct; //To show that the guitar is in tune
- /*****************************************************************************
- FUNCTION TO COMPUTE FUNDAMENTAL FREQUENCY
- ******************************************************************************/
- void compute(void){
- //Autocorrelate and find minimum point
- minIndex=0;
- for(i=0; i<=N-1; i++){
- corr[i] = 0;
- for(j=0; j<=N-1; j++){
- s = j+i;
- if((j+i)>(N-1))
- s = (j+i) - (N-1);
- corr[i] = corr[i] + (int)buffer[j]*buffer[s];
- }
- if(corr[i]<corr[minIndex])
- minIndex = i;
- }
- //Calculate Frequency
- Freq = sampleF/(minIndex*2);
- }
- /*****************************************************************************
- PITCH DETECTION FUNCTION
- ******************************************************************************/
- void pitch(void){
- /*
- This function is used to find the pitch after finding frequency and display the
- outputs on the 7 segment display and the LEDs
- */
- const float t = 0.035; //tolerance band for note
- const float t2 = 0.01; //tolerance band for correct note
- int octave = 1;
- //FIND OCTAVE
- if(Freq > Gs*1)
- octave = 2;
- if(Freq > Gs*2)
- octave =4;
- if(Freq > Gs*4)
- octave = 8;
- /*FIND PITCH
- The following portion is equivalent to checking if 'Freq'
- lies within a certain band around the given note.
- The width of this band is set by 't' (a percentage value)
- Check if:
- (input_note) lies within required_note +/- (percentage*required_note)
- */
- if( Freq > (A*octave)*(1-t) && Freq < (A*octave)*(1+t) ){
- note = A;
- //Signal the 7 seg display with the letter in each of these if statements.
- seven_seg_A();
- }
- else if( Freq > (As*octave)*(1-t) && Freq < (As*octave)*(1+t) ){
- note = As;
- seven_seg_As();
- }
- else if( Freq > (B*octave)*(1-t) && Freq < (B*octave)*(1+t) ){
- note = B;
- seven_seg_B();
- }
- else if( Freq > (C*octave)*(1-t) && Freq < (C*octave)*(1+t) ){
- note = C;
- seven_seg_C();
- }
- else if( Freq > (Cs*octave)*(1-t) && Freq < (Cs*octave)*(1+t) ){
- note = Cs;
- seven_seg_Cs();
- }
- else if( Freq > (D*octave)*(1-t) && Freq < (D*octave)*(1+t) ){
- note = D;
- seven_seg_D();
- }
- else if( Freq > (Ds*octave)*(1-t) && Freq < (Ds*octave)*(1+t) ){
- note = Ds;
- seven_seg_Ds();
- }
- else if( Freq > (E*octave)*(1-t) && Freq < (E*octave)*(1+t) ){
- note = E;
- seven_seg_E();
- }
- else if( Freq > (F*octave)*(1-t) && Freq < (F*octave)*(1+t) ){
- note = F;
- seven_seg_F();
- }
- else if( Freq > (Fs*octave)*(1-t) && Freq < (Fs*octave)*(1+t) ){
- note = Fs;
- seven_seg_Fs();
- }
- else if( Freq > (G*octave)*(1-t) && Freq < (G*octave)*(1+t) ){
- note = G;
- seven_seg_G();
- }
- else if( Freq > (Gs*octave)*(1-t) && Freq < (Gs*octave)*(1+t) ){
- note = Gs;
- seven_seg_Gs();
- }
- //DISPLAY
- deviation = Freq - note*octave;
- if (abs(deviation) < t2*note){
- correct = 1; //in tune
- //Serial.print(" ");
- //Serial.println("Correct");
- }
- else{
- correct = 0; //not in tune
- if((deviation)>0){
- //Serial.print(" ");
- //Serial.println("Note = deviated HIGH");
- dev = HIGH;
- }
- else {
- // Serial.print(" ");
- //Serial.println("Deviated Low");
- dev = LOW;
- }
- }
- }
- /***************END OF PITCH DETECTION FUNCTION****************/
- /******************************************************************************
- FUNCTIONS FOR 7 SEGMENT DISPLAY
- *******************************************************************************/
- //These are used to display the specific note on the 7 segment display
- void seven_seg_A(void){
- digitalWrite(9, LOW);
- digitalWrite(8, LOW);
- digitalWrite(7, LOW);
- digitalWrite(6, HIGH);
- digitalWrite(5, LOW);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_As(void){
- digitalWrite(9, LOW);
- digitalWrite(8, LOW);
- digitalWrite(7, LOW);
- digitalWrite(6, HIGH);
- digitalWrite(5, LOW);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, LOW);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_B(void){
- digitalWrite(9, HIGH);
- digitalWrite(8, HIGH);
- digitalWrite(7, LOW);
- digitalWrite(6, LOW);
- digitalWrite(5, LOW);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_C(void){
- digitalWrite(9, HIGH);
- digitalWrite(8, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(6, LOW);
- digitalWrite(5, LOW);
- digitalWrite(4, HIGH);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_Cs(void){
- digitalWrite(9, HIGH);
- digitalWrite(8, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(6, LOW);
- digitalWrite(5, LOW);
- digitalWrite(4, HIGH);
- digitalWrite(3, LOW);
- digitalWrite(2, LOW);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_D(void){
- digitalWrite(9, HIGH);
- digitalWrite(8, LOW);
- digitalWrite(7, LOW);
- digitalWrite(6, LOW);
- digitalWrite(5, LOW);
- digitalWrite(4, HIGH);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_Ds(void){
- digitalWrite(9, HIGH);
- digitalWrite(8, LOW);
- digitalWrite(7, LOW);
- digitalWrite(6, LOW);
- digitalWrite(5, LOW);
- digitalWrite(4, HIGH);
- digitalWrite(3, LOW);
- digitalWrite(2, LOW);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_E(void){
- digitalWrite(9, LOW);
- digitalWrite(8, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(6, LOW);
- digitalWrite(5, LOW);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_F(void){
- digitalWrite(9, LOW);
- digitalWrite(8, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(6, HIGH);
- digitalWrite(5, LOW);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_Fs(void){
- digitalWrite(9, LOW);
- digitalWrite(8, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(6, HIGH);
- digitalWrite(5, LOW);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, LOW);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_G(void){
- digitalWrite(9, LOW);
- digitalWrite(8, LOW);
- digitalWrite(7, LOW);
- digitalWrite(6, LOW);
- digitalWrite(5, HIGH);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, HIGH);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void seven_seg_Gs(void){
- digitalWrite(9, LOW);
- digitalWrite(8, LOW);
- digitalWrite(7, LOW);
- digitalWrite(6, LOW);
- digitalWrite(5, HIGH);
- digitalWrite(4, LOW);
- digitalWrite(3, LOW);
- digitalWrite(2, LOW);
- if(correct == 1)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,HIGH);
- digitalWrite(10,LOW);
- }
- else if(correct == 0)
- {
- if(dev == HIGH)
- {
- digitalWrite(12,LOW);
- digitalWrite(11,LOW);
- digitalWrite(10,HIGH);
- }
- else if(dev == LOW)
- {
- digitalWrite(12,HIGH);
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- }
- }
- }
- void blank(void){
- //Blanks out the 7 Segment display
- digitalWrite(10, LOW);
- digitalWrite(11, LOW);
- digitalWrite(12, LOW);
- digitalWrite(9, HIGH);
- digitalWrite(8, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(6, HIGH);
- digitalWrite(5, HIGH);
- digitalWrite(4, HIGH);
- digitalWrite(3, HIGH);
- digitalWrite(2, HIGH);
- }
- void test(void){
- //To test the 7 Segment display
- seven_seg_A();
- delay(500);
- seven_seg_As();
- delay(500);
- seven_seg_B();
- delay(500);
- seven_seg_C();
- delay(500);
- seven_seg_Cs();
- delay(500);
- seven_seg_D();
- delay(500);
- seven_seg_Ds();
- delay(500);
- seven_seg_E();
- delay(500);
- seven_seg_F();
- delay(500);
- seven_seg_Fs();
- delay(500);
- seven_seg_G();
- delay(500);
- seven_seg_Gs();
- delay(500);
- blank();
- }
- /***************END OF 7 SEG FUNCTIONS****************/
- /*****************************************************************************
- SETUP
- ******************************************************************************/
- void setup(){
- pinMode(13,OUTPUT);//led clipping indicator pin
- cli(); //disable interrupts
- //set up continuous sampling of analog pin 0
- ADCSRA = 0; //clear ADCSRA and ADCSRB registers
- ADCSRB = 0;
- ADMUX |= (1 << REFS0); //set reference voltage
- ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
- ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz
- //ADCSRA |= (1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0);
- ADCSRA |= (1 << ADATE); //enabble auto trigger
- ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
- ADCSRA |= (1 << ADEN); //enable ADC
- ADCSRA |= (1 << ADSC); //start ADC measurements
- sei();//enable interrupts
- Serial.begin(9600);
- }
- /*****************************************************************************
- INTERRUPT SERVICE ROUTINE
- ******************************************************************************/
- ISR(ADC_vect) {//when new ADC value ready
- incomingAudio = ADCH;//store 8 bit value from analog pin 0
- //t_new = millis();
- if (incomingAudio == 0 || incomingAudio == 255){//if clipping
- digitalWrite(13,HIGH);//set pin 13 high
- clipping = 1;//currently clipping
- }
- //Store in buffer //Works
- if(bIndex!=N-1){
- buffer[bIndex] = incomingAudio;
- bIndex++;
- }
- else{
- bIndex = 0;
- //flag = 1;
- }
- }
- /***************END OF INTERRUPT SERVICE ROUTINE**************/
- /*****************************************************************************
- LOOP
- ******************************************************************************/
- void loop(){
- if (clipping){//if currently clipping
- clipping = 0;//
- digitalWrite(13,LOW);//turn off clipping led indicator (pin 13)
- }
- cli();
- compute();
- //To print results on serial monitor
- //Serial.print(Freq);
- //Serial.println(" hz");
- sei();
- }
- /***************END OF LOOP**************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement