代码之家  ›  专栏  ›  技术社区  ›  Zack Lee

在Arduino上调制脉冲宽度时有奇怪的声音

  •  0
  • Zack Lee  · 技术社区  · 5 年前

    但它发出的声音和我预想的不一样。

    我的代码是:

    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);
    }
    

    由此产生的声音非常怪异和不连贯。

    我的代码怎么了?

    0 回复  |  直到 5 年前