我正在完成一本名为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 应用量的频率......