1

我们在带有相量的同一个 gen~ 代码框对象中有两个地方:

wander = phasor(in8/dense);

...some code later...

phas = (triangle(phasor(freq), sharp)*len-rot_x/(2*pi))%1;

我知道这phasor()会产生一个上升的锯齿,输出 0 到 1 的值。我理解的参数phasor()是频率。我不明白的是如何phasor()在给定频率下输出 0 到 1 的值,当您需要随时间推移的频率来产生 0 以外的值时。似乎phasor(frequency)应该始终输出 0,除非以某种方式phasor()跟踪时间和自己的阶段。

如果 phasor 跟踪时间/相位,我们如何phasor()在同一个 gen 代码框中调用两次?我们似乎不可能有两个时间值。除非...

...我们在所有调用之间共享一个时间/相位值,但它是在增加其相位之前设置最终频率phasor()的最后一次调用,这发生在代码块的末尾。phasor()phasor()

我对么?

编辑:不,那不可能,那你为什么要把一个频率放入相量两次?根据我的逻辑,它不会改变输出。

4

1 回答 1

1

根据我的测试,相量确实是一个锯齿波振荡器对象,其中每次调用相量都是一个独特的振荡器,因此,在同一个代码框中调用相量两次将实例化两个对象。

class Phasor
{
public:
    double getSample() 
    { 
        double ret = phase/PI_z_2;
        phase = fmod(phase+phase_inc, TAU); //increment phase
        return ret;
    }
    void setSampleRate(double v) { sampleRate = v; calculateIncrement(); }
    void setFrequency(double v) { frequency = v; calculateIncrement(); }
    void reset() { phase = 0.0; }
protected:
    void calculateIncrement() { phase_inc = TAU * frequency / sampleRate; }
    double sampleRate = 44100.0; 
    double frequency = 1.0;
    double phase = 0.0;
    double phase_inc = 0.0;
    const double TAU = 2*PI;
    const double PI_z_2 = PI/2.0;
};
于 2017-09-08T20:35:41.347 回答