我正在查看相位累加器的代码,我一定是个傻瓜,因为我不明白。代码很简单:
每个时钟滴答做: 累加 = 累加 + NCO_param; 返回累积;
accum 是一个 32 位的寄存器。显然,在某些时候它会翻转。
我的问题真的是:这与灵态有何关系?
我正在查看相位累加器的代码,我一定是个傻瓜,因为我不明白。代码很简单:
每个时钟滴答做: 累加 = 累加 + NCO_param; 返回累积;
accum 是一个 32 位的寄存器。显然,在某些时候它会翻转。
我的问题真的是:这与灵态有何关系?
这篇文章可能会有所帮助。
在运行步骤中,计数器(适当地称为相位累加器)被指示在频率参考的每个脉冲上按一定的增量前进。相位累加器(相位)的输出用于依次选择数据表中的每一项。最后,DAC 将此数据序列转换为模拟波形。
在运行步骤中,计数器(适当地称为相位累加器)被指示在频率参考的每个脉冲上按一定的增量前进。相位累加器(相位)的输出用于依次选择数据表中的每一项。最后,DAC 将此数据序列转换为模拟波形。为了生成周期性波形,电路被设置为通过表格所花费的时间等于波形的周期。例如,如果参考频率为 1 MHz,表格包含 1000 个条目,则以 1 的相位增量完整通过表格将需要 1000 / 1 MHz = 1 ms,因此输出波形的频率将为1/(1 毫秒) = 1 kHz。
该系统可以简单地通过增加相位增量来产生更高的输出频率,以便计数器更快地通过表格。在上面的示例中,相位增量等于 1,因此通过将增量设置为 2 来获得下一个可能的频率,从而使输出频率增加一倍。为了获得比这更精细的频率控制,可以将标准相位增量设置为例如 10。这样就允许稍高或稍低的输出频率。例如,将增量增加到 11 将使输出频率增加 10%,将其减少到 9 将按相同比例降低输出频率。频率所需的精度越高,计数器中需要的位就越多。
在回答我自己的问题时,我在网上找到了另一篇有趣的文章,描述了用于频率合成的相位累加器。
以下是我对相位累加器工作原理的理解:
累加器寄存器实际上代表 360 度。因此,值 0 表示 0 度,值 2^32 表示 360 度。
相位累加器在每个时钟节拍加一个值 (M)。这表示围绕圆移动 (M/2^32) 度的角度。当寄存器溢出时,我们只是循环了一个完整的 360 度并重新开始。
公式是这样的:
使用具有波形 (x) 周期 = x(0-1) 而不是 x(0-2Pi) 周期的振荡器的示例
每个音频流有一个变量,称为 acc/accumulator,
每个样本,通过 accadd 累加:
var accadd = 1.0/( sampleRate / p2freq( note ) ) ;
acc+= accadd;
acc = acc%1.0;// not sure to do this as accurately using if statement. can reset acc every noteOn
如果您使用 2pi 周期的经典 Sin,请使用 2pi 而不是 1.0
像这样,波形将以每秒 p2freq(note) 周期从 0-1 运行。