Я пытаюсь сгенерировать звук с широтно-импульсной модуляцией, используя Arduino Nano.
Но он генерирует странный звук в отличие от моих ожиданий.
Вот мой код:
class Phasor
{
public:
Phasor(const float frequency)
:frequency(frequency)
,phase(1.0f)
,lastTimeMicros(0){};
virtual ~Phasor(){};
void setFrequency(const float frequency)
{
this->frequency = frequency;
}
float process()
{
const unsigned long currentTimeMicros = micros();
if (phase == 1.0f) lastTimeMicros = currentTimeMicros;
const unsigned long elapsedTimeMicros = currentTimeMicros - lastTimeMicros;
const unsigned long cycleDurationMicros = static_cast<unsigned long>(1000.0f / frequency) * 1000;
if (elapsedTimeMicros < cycleDurationMicros)
phase = static_cast<float>(elapsedTimeMicros) / static_cast<float>(cycleDurationMicros);
else
phase = 1.0f;
return phase;
}
private:
float frequency;
float phase;
unsigned long lastTimeMicros;
};
class PulseOsc
{
public:
PulseOsc(const float frequency, const float pulseWidth)
:phasor(frequency)
,pulseWidth(pulseWidth){};
virtual ~PulseOsc(){};
void setFrequency(const float frequency)
{
this->phasor.setFrequency(frequency);
}
void setPulseWidth(const float pulseWidth)
{
this->pulseWidth = pulseWidth;
}
float process()
{
const float phase = phasor.process();
if (phase <= pulseWidth)
return 1.0f;
else
return -1.0f;
}
private:
Phasor phasor;
float pulseWidth;
};
Phasor *phasorLFO;
PulseOsc *pulseOsc;
void setup()
{
Serial.begin(9600);
pinMode(9, OUTPUT);
phasorLFO = new Phasor(0.1f);
pulseOsc = new PulseOsc(440.0f, 0.5f);
}
void loop()
{
pulseOsc->setPulseWidth(phasorLFO->process());
int outVal = LOW;
if (pulseOsc->process() > 0.0f) outVal = HIGH;
digitalWrite(9, outVal);
}
Результирующий звук очень странный и сбойный.Он отлично работает, когда я фиксирую значение ширины импульса.(без LFO)
Что не так с моим кодом?Как я могу это исправить?Буду признателен за любой совет.