Classes to produce a computed sound wave on the analog output.

Dependents:   SoundWaveGeneratorTest SoundWaveGeneratorTest

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SineWave.cpp Source File

SineWave.cpp

00001 #include "snd_wave_generator/SineWave.h"
00002 #include <cmath>
00003 
00004 namespace snd_wave_generator {
00005 
00006 void SineWave::prepare(std::size_t sampleRate)
00007 {
00008     std::size_t cycleLength = sampleRate / this->frequency;
00009     this->buffer.resize(cycleLength);
00010 
00011     std::size_t middle = cycleLength / 2;
00012     std::size_t quarter = middle / 2;
00013     
00014     float delta = 6.28 / (float(sampleRate) / float(this->frequency));
00015     for(std::size_t i = 0; i < quarter; ++i) {
00016         float dt = delta * i;
00017         float dv = std::sin(dt) / 2.0;
00018         float posValue = 0.5 + dv;
00019         float negValue = 0.5 - dv;
00020         this->buffer.write(i, posValue);
00021         this->buffer.write(middle - i, posValue);
00022         this->buffer.write(middle + i, negValue);
00023         this->buffer.write(cycleLength - i, negValue);
00024     }
00025     
00026     this->buffer.write(quarter, 1.0);
00027     if (middle - quarter != quarter) {
00028         this->buffer.write(middle - quarter, 1.0);
00029     }
00030     this->buffer.write(cycleLength - quarter, 0.0);
00031     if (middle + quarter != cycleLength - quarter) {
00032         this->buffer.write(middle + quarter, 0.0);
00033     }
00034 }
00035 
00036 } // snd_wave_generator