STRUCT HB_HISTORY SWORD HB_XN3 ;x(n-3) SWORD HB_XN2 ;x(n-2) SWORD HB_XN1 ;x(n-1) SWORD HB_YN2 ;y(n-2) SWORD HB_YN1 ;y(n-1) ENDSTRUCT HB_HISTORY ;->IR1:IR0: input sample (signed FP12.4) ; [Z]: pointer to history data for filter instance ;IR1:IR0,RR0::RR3 destroyed .MACRO HALFBAND_IN ldd RR0,Z+HB_XN3+0 ;y = 1 * x(n-3) ldd RR1,Z+HB_XN3+1 ldd RR2,Z+HB_XN2+0 ;get x(n-2) ldd RR3,Z+HB_XN2+1 std Z+HB_XN3+0,RR2 ;save as new x(n-3) std Z+HB_XN3+1,RR3 add RR0,RR2 ;y += 3 * x(n-2) adc RR1,RR3 lsl RR2 rol RR3 add RR0,RR2 adc RR1,RR3 ldd RR2,Z+HB_XN1+0 ;get x(n-1) ldd RR3,Z+HB_XN1+1 std Z+HB_XN2+0,RR2 ;save as new x(n-2) std Z+HB_XN2+1,RR3 add RR0,RR2 ;y += 3 * x(n-1) adc RR1,RR3 lsl RR2 rol RR3 add RR0,RR2 adc RR1,RR3 std Z+HB_XN1+0,IR0 ;save new x(n-1) std Z+HB_XN1+1,IR1 add RR0,IR0 ;y += 1 * x(n) adc RR1,IR1 ldd IR0,Z+HB_YN2+0 ;get y(n-2) ldd IR1,Z+HB_YN2+1 movw RR3:RR2,ZH:ZL ;y += -1/3 * y(n-2) ldi ZH,High(div3ftable) mov ZL,IR0 lpm IR0,Z sub RR0,IR0 clr IR0 sbc RR1,IR0 ldi ZH,High(div3ltable) mov ZL,IR1 lpm IR1,Z sub RR0,IR1 ldi ZH,High(div3htable) lpm IR1,Z sbc RR1,IR1 movw ZH:ZL,RR3:RR2 ldd RR2,Z+HB_YN1+0 ;get y(n-1) ldd RR3,Z+HB_YN1+1 std Z+HB_YN2+0,RR2 ;save as new y(n-2) std Z+HB_YN2+1,RR3 std Z+HB_YN1+0,RR0 ;save new y(n-1) std Z+HB_YN1+1,RR1 .ENDMACRO ;----------------------------------------------------------------------------- ;->[Z]: pointer to history data for filter instance ;<-IR1:IR0: most recent filtered sample (signed FP12.4) ;Z destroyed .MACRO HALFBAND_OUT ldd IR0,Z+HB_YN1+0 ;get most recent y(n) ldd IR1,Z+HB_YN1+1 ldi ZH,High(div3ftable) ;return y(n) / 6 (filter gain!) mov ZL,IR0 lpm IR0,Z ldi ZH,High(div3ltable) mov ZL,IR1 lpm IR1,Z add IR0,IR1 ldi ZH,High(div3htable) lpm IR1,Z clr ZL adc IR1,ZL asr IR1 ror IR0 .ENDMACRO