我正在查看相位累加器的代码,我必须是一个简单的因为我没有得到它。 代码很简单:
Every Clock Tick do: accum = accum + NCO_param; return accum;
accum是一个32位寄存器。显然,在某些时候它会翻滚。
我的问题是:这与阶段有什么关系?
答案 0 :(得分:3)
This article可能有所帮助。
在运行步骤中,指示计数器(适当地称为相位累加器)在来自频率参考的每个脉冲上前进一定的增量。相位累加器的输出(相位)用于依次选择数据表中的每个项目。最后,DAC将此数据序列转换为模拟波形。
在跑步中,计数器 (适当地称为阶段 累加器)被指示前进 通过每个脉冲的一定增量 来自频率参考。该 相位累加器的输出( 阶段)用于选择每个项目 数据表依次。最后, DAC将此数据序列转换为 模拟波形。 要生成周期性波形, 电路设置为一次通过 通过表花费时间相等 到波形的周期。对于 例如,如果参考频率是 1 MHz,表包含1000 条目,然后完整通过 相位增量为1的表 将需要1000/1 MHz = 1 ms,所以 输出波形的频率 是1 /(1 ms)= 1 kHz。
这个系统可以产生更高的效果 输出频率只需增加即可 相位增量使得 计数器更多地贯穿整个表格 很快。在上面的例子中, 相位增量等于1,所以 下一个可能的频率是通过 将增量设置为2,结果 在输出频率加倍。至 获得更好的频率控制 比这更标准的阶段 增量可以设置为,比方说,10 然后允许稍高或稍低 输出频率。例如, 将增量增加到11会 将输出频率提高10%, 并将其减少到9会减少 输出频率相同 比例。精度越高 要求超过频率,越多 计数器需要位。
答案 1 :(得分:3)
回答我自己的问题,我发现了另一篇有趣的文章online,描述了频率合成的相位累加器。
以下是我对相位累加器如何工作的理解:
累加器寄存器实际上代表360度。因此,值0表示0度,值2 ^ 32表示360度。
相位累加器在每个时钟周期添加一个值(M)。这表示围绕圆移动的角度为(M / 2 ^ 32)度。当寄存器溢出时,我们只需循环完整的360度并重新开始。
答案 2 :(得分:0)
公式如下:
使用周期为波形(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(音符)周期的0-1运行。