Project showcase
Arduino Beat Detector

Arduino Beat Detector © GPL3+

It detects a beat in a line level audio signal.

  • 6,542 views
  • 18 comments
  • 11 respects

Components and supplies

About this project

The idea of this project is to use Arduino to detect beats in music in line level (like the red and white RCA cables of audio). The analog input of the Arduino can only accept from 0v to 5v DC. An audio signal is an AC signal. So, how to get the negative part of the wave of an audio signal? We must bias to 2,5v. So our new 0 is actually 2,5v (the wave goes above and below this "new zero"). And so we can connect to the Arduino analog input. Then code written for the Arduino is needed to detect if there is a beat on the signal, and then the possibilities are endless. When it detects a beat, the Arduino can blink an LED or activate a relay, for example, and so on.

Code

arduino_beat_detector.inoArduino
It detects beats on audio line level signal and blink an LED
// Arduino Beat Detector By Damian Peckett 2015
// License: Public Domain.

// Our Global Sample Rate, 5000hz
#define SAMPLEPERIODUS 200

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
    // Set ADC to 77khz, max for 10bit
    sbi(ADCSRA,ADPS2);
    cbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);

    //The pin with the LED
    pinMode(2, OUTPUT);
}

// 20 - 200hz Single Pole Bandpass IIR Filter
float bassFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = (sample) / 3.f; // change here to values close to 2, to adapt for stronger or weeker sources of line level audio  
    

    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7960060012f * yv[0]) + (1.7903124146f * yv[1]);
    return yv[2];
}

// 10hz Single Pole Lowpass IIR Filter
float envelopeFilter(float sample) { //10hz low pass
    static float xv[2] = {0,0}, yv[2] = {0,0};
    xv[0] = xv[1]; 
    xv[1] = sample / 50.f;
    yv[0] = yv[1]; 
    yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);
    return yv[1];
}

// 1.7 - 3.0hz Single Pole Bandpass IIR Filter
float beatFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 2.7f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7169861741f * yv[0]) + (1.4453653501f * yv[1]);
    return yv[2];
}

void loop() {
    unsigned long time = micros(); // Used to track rate
    float sample, value, envelope, beat, thresh;
    unsigned char i;

    for(i = 0;;++i){
        // Read ADC and center so +-512
        sample = (float)analogRead(0)-503.f;

        // Filter only bass component
        value = bassFilter(sample);

        // Take signal amplitude and filter
        if(value < 0)value=-value;
        envelope = envelopeFilter(value);

        // Every 200 samples (25hz) filter the envelope 
        if(i == 200) {
                // Filter out repeating bass sounds 100 - 180bpm
                beat = beatFilter(envelope);

                // Threshold it based on potentiometer on AN1
                thresh = 0.02f * (float)analogRead(1);

                // If we are above threshold, light up LED
                if(beat > thresh) digitalWrite(2, HIGH);
                else digitalWrite(2, LOW);

                //Reset sample counter
                i = 0;
        }

        // Consume excess clock cycles, to keep at 5000 hz
        for(unsigned long up = time+SAMPLEPERIODUS; time > 20 && time < up; time = micros());
    }  
}

Schematics

Biasing audio signal (line level) to Arduino analog input 0
Biasing for input arduino vxuv7rrzi2

Comments

Similar projects you might like

Arduino EMF Detector A.K.A Ghost Detector

Project showcase by Patel Darshil

  • 5,730 views
  • 8 comments
  • 15 respects

Electromagnetic Field Detector - Arduino Uno

Project showcase by justin1445

  • 17,693 views
  • 9 comments
  • 22 respects

Food Detector

Project tutorial by crispylel

  • 35,424 views
  • 7 comments
  • 91 respects

Healthcare Skin Pressure Detector

Project tutorial by David Escobar

  • 5,085 views
  • 2 comments
  • 17 respects

Motion Detector Clock

Project in progress by Frazer Reid

  • 1,893 views
  • 0 comments
  • 3 respects

Color Detector for Blind People

Project tutorial by Ahmed Elsagaan

  • 2,015 views
  • 0 comments
  • 4 respects
Add projectSign up / Login