什么是动态脉宽调制?

信息处理 调制 C
2022-02-07 07:26:25

我正在完成一本名为The Audio Programming Book的书中的练习,并且近 300 页的内容还不错,但只是卡住了。(我是音乐家,不是程序员或音频专家顺便说一句,如果这是一个愚蠢的问题,我很抱歉......)

我了解什么是脉宽调制,并且我设法编写了一些 C 代码将其应用于方波。本书建议使用包含频率参数的函数原型;我假设这与方波的频率相同。但现在我在想这个频率参数可能适用于不断改变脉宽调制水平的 LFO。动态脉宽调制是否暗示了由 LFO 控制的不断变化的脉宽调制水平?本书中的下一个练习要求对这个函数进行“断点”控制——但输入的值取决于脉宽调制的频率是变化的,还是仅仅是脉宽调制的变化。

我怀疑到目前为止我可能已经为方波的静态脉宽调制进行了编码。

编辑:这里有一些代码......

以下结构包含振荡器信息,它来自书中的代码(尽管我添加了 curPWMod):

typedef struct t_oscil
{
    double twoPiOvrSR;
    double curFreq;
    double curPWMod;
    double curPhase;
    double incr;
} OSCIL;

如果传递给函数的频率值发生变化,则以下宏会更新值(我将其写成书中的练习,最初的代码在每个函数中):

#define UPDATE_FREQ \
        if (p_osc->curFreq != freq) \
            do { \
                p_osc->curFreq = freq; \
                p_osc->incr = p_osc->twoPiOvrSR * freq; \
            } while (0)

以下函数来自书中,用于为方波创建值(最初设置的值是 1.0,我更改为 0.99,因为我的音频文件正在剪辑):

double squareTick(OSCIL *p_osc, double freq)
{
    double val;
    UPDATE_FREQ;
    if (p_osc->curPhase <= M_PI) {
        val = 0.99; // to avoid clipping
    } else {
        val = -0.99; // to avoid clipping
    }
    p_osc->curPhase += p_osc->incr;
    if (p_osc->curPhase >= TWO_PI) {
        p_osc->curPhase -= TWO_PI;
    }
    if (p_osc->curPhase < 0.0) {
        p_osc->curPhase += TWO_PI;
    }
    return val;
}

这是我返回脉宽调制方波值的类似函数(使用常数值 0.02,因为 pwMod 值 50 应该给出方波):

// the next function is for pulse-width-modulated square wave
double pwmTick(OSCIL *p_osc, double freq, double pwMod)
{
    // this should BASICALLY be the same as the square wave function, but adjusting for the pwMod input
    double val;
    UPDATE_FREQ;
    if (p_osc->curPWMod != pwMod) {
        p_osc->curPWMod = pwMod;
        if (p_osc->curPWMod < 1.0) {
            p_osc->curPWMod = 1.0;
        }
        if (p_osc->curPWMod > 99.0) {
            p_osc->curPWMod = 99.0;
        }
    } // only changed if pwMod value has changed

    if (p_osc->curPhase <= (M_PI * p_osc->curPWMod * 0.02)) {
        val = 0.99; // to avoid clipping
    } else {
        val = -0.99;
    }

    // the next 7 lines are the same in every function - so should probably be replaced with a macro
    p_osc->curPhase += p_osc->incr;
    if (p_osc->curPhase >= TWO_PI) {
        p_osc->curPhase -= TWO_PI;
    }
    if (p_osc->curPhase < 0.0) {
        p_osc->curPhase += TWO_PI;
    }

    return val;
}

这个功能完全符合我的预期,但我不知道这是否是书中的练习要求我做的!这是动态脉宽调制吗?我的解决方案使用不同的振荡器(和振荡器函数),而不是对传递给此函数的 pwMod 参数应用另一个振荡器(正弦?)和振荡器函数(我怀疑我应该这样做......)

这本书之前没有提到脉宽调制,也没有解释它是什么;我不介意,这需要读者自己查找信息,但这很辛苦!本书给出的关于这个练习需要什么的唯一线索是给定的函数原型:

double pwmtick(OSCIL* p_osc, double freq, double pwmod);

正如我上面所说,我已经设法使用这个原型编写了一个函数,但现在不确定 freq 参数是否与上面的方波函数中的频率相同(这是我解释它的方式),或者如果它应该被解释为改变 pwMod 应用量的频率......

0个回答
没有发现任何回复~