27 #include "../../math/mathtools.h"
28 #include "../../system/log.h"
43 mIn(mWaveformSize/2+1),
68 EptAssert(numberOfKeys > 0 and numberOfKeys < 256,
69 "Number of keys out of range");
70 EptAssert(samplerate>0 and samplerate<50000,
71 "Range of sample rate invalid");
107 if (spectrum.size()==0)
return;
109 mQueue[keynumber] = spectrum;
154 int index =
static_cast<int> (realindex);
156 return leftvalue + (realindex-index)*(W[(index+1)%
mWaveformSize]-leftvalue);
198 LogI(
"Waveform generator thread started");
200 std::default_random_engine generator;
201 std::uniform_real_distribution<double> distribution(0.0,
MathTools::PI*2);
211 auto element =
mQueue.begin();
212 keynumber = element->first;
213 spectrum = element->second;
219 if (keynumber >= 0 and keynumber<=
mNumberOfKeys and spectrum.size()>0)
221 if (counter == 0)
LogI(
"Waveform generator starting in background")
224 for (
auto &partial : spectrum) norm += partial.second;
228 for (
auto &partial : spectrum)
230 const double frequency = partial.first;
231 const double intensity = sqrt(partial.second / norm);
235 std::complex<double> phase(0,distribution(generator));
236 mIn[k] = exp(phase) * intensity;
247 if (counter > 0)
LogI(
"Waveform generator stops after %d waveforms.",counter);
void msleep(double milliseconds)
Sleep function for staying idle.
static void setThreadName(std::string s)
Specify the name of the thread.
bool cancelThread() const
Cancel-flag getter method, thread-safe.
void calculateFFT(const FFTRealVector &in, FFTComplexVector &out)
Foward FFT, mapping a real vector with size N to a complex one with size N/2+1.