Click here to Skip to main content
15,867,594 members
Articles / Desktop Programming / Windows Forms

FFT Guitar Tuner

Rate me:
Please Sign up or sign in to vote.
4.95/5 (76 votes)
10 Aug 2010MIT4 min read 543.5K   30.2K   228   143
Using a Fast Fourier Transform to calculate the fundamental frequency of the captured audio sound

Introduction

This article shows how to use a Fast Fourier Transform (FFT) algorithm to calculate the fundamental frequency of a captured audio sound. Also, we will see how to apply the algorithm to analyze live sound to build a simple guitar tuner: the code provides a solution to the problem of calculation of the fundamental frequency of the played pitch.

Background

The computer can capture live sound/music using a microphone that is connected to the sound card. Modern sound cards can capture digital signals. A digital signal is a set of quantized sound values that were taken in uniformly spaced times. The digital signal does not provide any information about frequencies that are present in the sound. To determine that, the data need to be analyzed.

The Short-Time Fourier Transform (STFT) makes representation of the phase and magnitude of the signal. The result of the STFT can be used to produce the spectrogram of the signal: the magnitude squared over time and frequencies. We will use a Fast Fourier Transform (FFT) to generate the spectrogram of the signal of short periods of time. After the spectrogram is calculated, the fundamental frequency can be determined by finding the index of the maximum value of the magnitude squared. The improved algorithm finds several such places, candidate frequency bins, with the magnitude squared in the top of the maximum values, and further analyzes them to verify the candidate fundamental frequencies by using the signal data.

When a note is played on a musical instrument, the sound waves are generated by strings, air, or the speaker - an instrument generates a musical note. One of the characteristics of a musical note is a pitch (fundamental frequency). Traditionally musical alphabet frequencies are divided by octaves, and then by semitones. An octave has 12 named pitches: C (prime), C#, D, D#, E, F, F#, G, G#, A, A#, and B. Octaves also have names: great, small, one-lined, two-lined, etc. The "standard pitch" (A one-lined or A4) has a fundamental frequency of its sound waves equals to 440 Hz. The frequencies of two neighboring notes are different by 21/12, and frequencies of the notes with the same name in two neighboring octaves are different by 2.

Table: Notes and Their Fundamental Frequencies
Note NameTraditional Octave Names (Scientific), Hz
Great (2)Small (3)One-lined (4)Two-lined (5)
C65.4064130.8128261.6256523.2511
C#69.2957138.5913277.1826554.3653
D73.4162146.8324293.6648587.3295
D#77.7817155.5635311.1270622.2540
E82.4069164.8138329.6276659.2551
F87.3071174.6141349.2282698.4565
F#92.4986184.9972369.9944739.9888
G97.9989195.9977391.9954783.9909
G#103.8262207.6523415.3047830.6094
A110.0000220.0000440.0000880.0000
A#116.5409233.0819466.1638932.3275
B123.4708246.9417493.8833987.7666

The typical (six string) guitar normally plays pitches of great through two-lined octaves. The pitches of the open strings (E2, A2, D3, G3, B3, and E4) are selected in the table in bold.

Using the Code

The solution contains three projects: the main windows application (FftGuitarTuner), the sound analysis library (SoundAnalysis), and the sound capture library (SoundCapture). The heart of the solution and the SoundAnalysis project is the FFT algorithm (see the Calculate method of the SoundAnalysis.FftAlgorithm class):

C#
// bit reversal
ComplexNumber[] data = new ComplexNumber[length];
for (int i = 0; i < x.Length; i++)
{
    int j = ReverseBits(i, bitsInLength);
    data[j] = new ComplexNumber(x[i]);
}

// Cooley-Tukey 
for (int i = 0; i < bitsInLength; i++)
{
    int m = 1 << i;
    int n = m * 2;
    double alpha = -(2 * Math.PI / n);

    for (int k = 0; k < m; k++)
    {
        // e^(-2*pi/N*k)
        ComplexNumber oddPartMultiplier = 
           new ComplexNumber(0, alpha * k).PoweredE();

        for (int j = k; j < length; j += n)
        {
            ComplexNumber evenPart = data[j];
            ComplexNumber oddPart = oddPartMultiplier * data[j + m];
            data[j] = evenPart + oddPart;
            data[j + m] = evenPart - oddPart;
        }
    }
}

// calculate spectrogram
double[] spectrogram = new double[length];
for (int i = 0; i < spectrogram.Length; i++)
{
    spectrogram[i] = data[i].AbsPower2();
}

The data for the algorithm is provided from the sound card capture buffer. The abstract SoundCapture.SoundCaptureBase utility class is an adapter for DirectSound's Capture and CaptureBuffer classes, that helps to encapsulate buffering and setting up the audio format parameters. The application requires Microsoft DirectX 9 runtime components for the live sound capture from the microphone.

Main Application Form

Figure: Main Application Form

After the application is started, select the sound device and play a note. The application will capture the live sound and will calculate the current fundamental frequency of the signal. The information can be used to tune the guitar.

Points of Interest

To calculate the Fast Fourier Transform, the Cooley-Tukey algorithm was used. It gives good performance for the required task. To challenge the algorithm, the application analyses about 22,000 sample blocks in real time: the sound is captured at a 44,100 Hz rate and a 16 bits sample size, and the analysis is performed twice a second.

The sound analysis library can be used for tone, background noise, sound, or speech detection. Series of the spectrogram of the continued sound can be displayed as a 2D (or 3D) image to present it visually.

References

  1. "Musical Note", Wikipedia
  2. "Short-Time Fourier Transform", Wikipedia
  3. "Fast Fourier Transform", Wikipedia
  4. "Cooley-Tukey FFT Algorithm", Wikipedia

History

  • 1st January, 2009: Initial version
  • 2nd January, 2009: Added algorithm code snippet
  • 3rd August, 2010: Corrected article typos; new frequency detection algorithm

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Software Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionvc hb g Pin
Ewoud Wijnstra5-Oct-20 7:32
Ewoud Wijnstra5-Oct-20 7:32 
QuestionSetup Pin
Member 1295200216-Jan-17 0:13
Member 1295200216-Jan-17 0:13 
AnswerRe: Setup Pin
ProcopioPi29-Oct-18 21:16
ProcopioPi29-Oct-18 21:16 
QuestionPoint FFT Pin
Member 1167218922-May-15 21:12
Member 1167218922-May-15 21:12 
QuestionFFT Guitar Tuner not work in win7 64bit & visual studio 2010 Pin
lpln85211-Aug-14 21:00
lpln85211-Aug-14 21:00 
AnswerRe: FFT Guitar Tuner not work in win7 64bit & visual studio 2010 Pin
Member 106723433-Jun-15 9:28
Member 106723433-Jun-15 9:28 
QuestionProject within a project Pin
Member 1053139926-Apr-14 6:07
Member 1053139926-Apr-14 6:07 
GeneralMy vote of 1 Pin
Fabrizio Stellato12-Jan-14 3:28
Fabrizio Stellato12-Jan-14 3:28 
QuestionHow hard it would be to redo this project for java ? Pin
YuriyKravets25-Nov-13 6:00
YuriyKravets25-Nov-13 6:00 
AnswerGot it working on XP x64 under .NET 4.0 PinPopular
bmac20-Jul-13 5:54
bmac20-Jul-13 5:54 
GeneralRe: Got it working on XP x64 under .NET 4.0 Pin
Achmad Rahman M10-Apr-17 7:30
Achmad Rahman M10-Apr-17 7:30 
GeneralRe: Got it working on XP x64 under .NET 4.0 Pin
PerryCodes12-Oct-22 21:36
PerryCodes12-Oct-22 21:36 
GeneralMy vote of 4 Pin
saddam Escape2-Apr-13 10:51
saddam Escape2-Apr-13 10:51 
GeneralMy vote of 5 Pin
Abdullatif M. Abu Al Rub2-Mar-13 0:31
Abdullatif M. Abu Al Rub2-Mar-13 0:31 
GeneralMy vote of 5 Pin
vard9912-Jan-13 13:06
vard9912-Jan-13 13:06 
QuestionBuilding as 4.0 Pin
theney11-Dec-12 7:04
theney11-Dec-12 7:04 
AnswerRe: Building as 4.0 Pin
Member 869236731-Jan-13 8:52
Member 869236731-Jan-13 8:52 
GeneralRe: Building as 4.0 Pin
bmac20-Jul-13 5:58
bmac20-Jul-13 5:58 
GeneralRe: Building as 4.0 Pin
PerryCodes12-Oct-22 21:34
PerryCodes12-Oct-22 21:34 
This save my arse tonight! THANK YOU bmac!
QuestionProblem with Fft Algorithm Pin
Member 963903729-Nov-12 1:14
Member 963903729-Nov-12 1:14 
Question? Windows 7 Pin
rspercy6528-Nov-12 4:19
rspercy6528-Nov-12 4:19 
AnswerRe: ? Windows 7 Pin
lalitsrana3-Jan-13 20:46
lalitsrana3-Jan-13 20:46 
GeneralRe: ? Windows 7 Pin
Member 869236731-Jan-13 8:41
Member 869236731-Jan-13 8:41 
GeneralRe: ? Windows 7 Pin
bmac20-Jul-13 5:58
bmac20-Jul-13 5:58 
QuestionRequest Help on using this code to measure bicycle spoke tesnion Pin
Member 934224119-Aug-12 15:37
Member 934224119-Aug-12 15:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.