📄 sine.asm
字号:
;
; sine.asm - 2nd-order resonator as sinewave generator
;
; It works better in the range of f/Fs=[0.125-0.975]
; Initialization condition:
; A = cos(2*PI*f/Fs)
; w[0] = sin(2*PI*f/Fs)
; w[1] = 0
;
; prototype: void sinewave_gen(int *x, unsigned int N, int *x, int cos_w)
;
; Entry: x[i] - AR0: output sinewave sample buffer
; wd[i] - AR1: delay-line
; N - T0: number of samples
; cos_w - T1: coefficient controls sinewave frequency
;
;
.def _sine
.text
_sine
pshm ST1_55 ; Save ST1, ST2, and ST3
pshm ST2_55
pshm ST3_55
sub #1,T0
mov mmap(T0),BRC0
bset FRCT
bset SATD
bset SMUL
mpym *AR1+,T1,AC0 ; AC0=cos(w)*w[0]
|| rptb sine_loop-1 ; for(i=0;i<N;i++)
sub *AR1-<<#16,AC0,AC1 ; AC1=cos(w)*w[0]-w[1]
add AC0,AC1 ; AC1=2*cos(w)*w[0]-w[1]
|| delay *AR1 ; w[1]=w[0]
mov rnd(hi(AC1)),*AR1 ; w[0]=y[i]
mov rnd(hi(AC1)),*AR0+ ; y[i]=2*cos(w)*w[0]-w[1]
|| mpym *AR1+,T1,AC0 ; AC0=cos(w)*w[0]
sine_loop
popm ST3_55 ; Restore ST1, ST2, and ST3
popm ST2_55
popm ST1_55
ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -