Time for some code. We will create a tone by sampling a sine wave. This is not the most efficient way to generate a sine wave, since we are calculating sine for each sampling point, but it works and is simple.
A sine wave as a function of time (t):
\(
y(t) = A sin(2{\pi}ft+\varphi)
\)
where:
\(A\), amplitude
\(f\), frequency (Hertz)
\(\varphi\), phase
The formula to get the sine wave samples looks like this. We assume that phase is 0, so we ignore it.
\(
y_i = Asin(\frac{2{\pi}fi}{f_s})
\)
where:
\(A\), amplitude
\(i\), sampling point
\(f\), frequency (Hertz)
\(f_s\), sample rate (samples/second)
Here is a function that generates the sine wave an writes the samples to a float* buffer. If we want some harmonics, we can double and triple etc. the frequency and add it while lowering the amplitude (it’s in comments in the code below).
#define _USE_MATH_DEFINES #include <cmath> // Create a sine tone // buf - array to write samples to // frequency - in Hertz, for example 440 // numFrames - number of samples, also minimum size of buffer // sampleRate - in samples/second, for example 44100 void createTone(float* buf, int frequency, int numFrames, int sampleRate) { for (int i = 0; i < numFrames; i++) { float sample = 0.0; // Generate a sample value. Samples are normalized [-1.0, 1.0] // Multiplication with 0.30 descreases the amplitude sample += 0.3 * sin(2 * M_PI * i * frequency / sampleRate); // Here we can add som harmonics if we want. // Double the frequency //sample += 0.25 * sin(2 * M_PI * i * 2 * frequency / sampleRate); // Triple the frequency //sample += 0.20 * sin(2 * M_PI * i * 3 * frequency / sampleRate); // Etc. //sample += 0.15 * sin(2 * M_PI * i * 4 * frequency / sampleRate); //sample += 0.10 * sin(2 * M_PI * i * 5 * frequency / sampleRate); // Write sample to the buffer *buf++ = sample; } }
I have some working code that generates a sine wave and writes it to a WAV file. Check my GitHub account tgranat in the repository DSPbasics.
I you haven’t, check Part 1 with some C++ code snippets to manipulate audio data.