【问题标题】:DDS Interpolation - 8bit Atmel AVR ASM to 12 bit DACDDS 插值 - 8 位 Atmel AVR ASM 到 12 位 DAC
【发布时间】:2012-11-13 12:44:27
【问题描述】:

我刚刚在使用 ASM 的 Atmel AVR 上完成了一个 DDS 项目,得出的结论是 8 位查找表和 8 位 DAC 在低频下会产生过多的量化失真;由于缺乏更好的措辞,我在我的示波器上得到了一个带有梯形效果的正弦波。

显然,如果我用大 LPF 平滑波形,我会遇到高频振幅问题。

理论上,从 8 位 DAC 升级到 12 位 DAC 并使用 4 个最低有效位的插值应该允许我将滤波器的截止点提高到足够显着的量,以缓解较高频率下的波形幅度问题。我的问题是我不知道如何做到这一点,或者是否有更简单的方法来消除拉链效果。也许是 12 位查找表?

到目前为止,我已经创建了一个无限循环,每次循环完成一个循环时,都会根据与查找表相关的指针的位置向 DAC 发送一个值。这就是我感到困惑的地方。我已经阅读了大量有关此的信息,但仍然没有找到一个可行的示例。如果我有一个无限循环,我应该如何在表查找值之间填充插值?关于我能想到的最好的事情是 (a + b) /2;我可能可以实现这一点并获得额外的位或相当于 512 点查找表,但我想认为有一种更简单的方法或一些可能会产生更好结果的方法。我不知道 C 或如何使用它,但如果它是谨慎的,我会尝试它。

目前,我的时钟是 1MHZ,如果需要,我可能会转到 16MHZ。

这是我的代码示例:

;将正弦波输出设为默认

    ldi     ZH, High(sine*2); setup Z pointer hi
    ldi     ZL, Low(sine*2) ; setup Z pointer lo

;清空累加器

    clr     r29             ; clear accumulator

;设置加法器寄存器

    ldi     r24,0x50        ; Fine adder value change register
    ldi     r25,0x08        ; Middle adder value change register
    ldi     r26,0x00        ; Coarse adder value change register

循环1:

    add     r28,r24         ; 1  Adder values carry over to higher registers.  Higher registers raise freq. in larger steps 
    adc     r29,r25         ; 1
    adc     r30,r26         ; 1  r30 is database address pointer for Z register
    lpm     r0, Z           ; 3  (Load Program Memory) Reads byte from database into the destination register based on Z pointer
    out     PORTD,r0


    rjmp    LOOP1           ; 2 => 9 cycles

【问题讨论】:

    标签: c assembly embedded microcontroller avr


    【解决方案1】:

    如果您的 LUT 有 256 个条目,您可以首先使用寄存器 r29(显然从 0 到 255)作为两个连续样本之间的比例因子。

    Output = (LUT[r30] * (256 - r29) + LUT[r30+1] * r29) >> 8;

    Also this thread 讨论了正弦波生成的许多实用替代方案。

    EDIT公式实现教科书线性插值

    y = a*(1-t) + b*t, with 0<=t<1
    

    所以 y=a,当 t=0 和 y=b,当 t=1。移位 8 表示插值项 t 在乘法后除以 256。在表达式 LUT[r30+1] 中,我假设隐式模 256 算术,因为 r30 是 8 位(不是吗?)。

    LUT 扩展到 12 位必须单独完成,因为除以 4 只会增加 LUT 中的量化误差。

    插值总是相对于 LUT 中的整数索引发生,无论是否有许多样本落入同一范围,例如。 LUT2 和 LUT[3]。数学上 Lut[R], LUT[R+1] 比 [R-1], [R] 更正确,但在现实生活中没有区别,因为人类的听觉系统没有绝对参考相位。

    【讨论】:

    • 感谢您的回答。不过我不明白。为什么要右移 8 位?等式的第一部分很容易溢出寄存器。 LUT[r30+1] 不会改变波形的相位,不会前进到指针的下一个时间敏感步长吗?查询上一个指针步骤不是更有意义吗?
    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多