__atmega168__ 发表于 2009-1-5 11:59:02

老外的音乐发生器原理是什么?【恢复】

老外的音乐发生器原理是什么?

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_572663.JPG
 (原文件名:Image0167.JPG) 

http://elm-chan.org/works/mxb/report.html

本贴被 __atmega168__ 编辑过,最后修改时间:2009-01-05,12:21:07.

zhihuisky 发表于 2009-1-5 12:10:37

DDS

lzf713 发表于 2009-9-22 09:22:44

我也想知道呀。我看了源程序,对应那个中断程序和乘法程序还没有看明白。
乘法是使用一个MULT宏:
; T0 = int8(EL) x .uint8(EH), 32clks
.macro MULT
        mov        T0H, EL
        sbrc        EL, 7
        neg        EL

        clr        T0L
        sbrc        EH, 0
        add        T0L, EL
        lsr        T0L
        sbrc        EH, 1
        add        T0L, EL
        lsr        T0L
        sbrc        EH, 2
        add        T0L, EL
        lsr        T0L
        sbrc        EH, 3
        add        T0L, EL
        clr        T0L
        sbrc        EH, 4
        add        T0L, EL
        lsr        T0L
        sbrc        EH, 5
        add        T0L, EL
        lsr        T0L
        sbrc        EH, 6
        add        T0L, EL
        lsr        T0L
        sbrc        EH, 7
        add        T0L, EL

        lsl        T0H
        mov        T0H, _0
        brcc        PC+3
        neg        T0L
        sbc        T0H, T0H
.endm
我搞不明白到底是什么回事,我调试时候总是得不到正确的结果。后来我编写了一个,不知道功能是否和原来的一样?
.macro MULT
         PUSH AL
        PUSH AH
        PUSH EH
       
        MOV AL,EL
        CLR AH
         CLR T0L
        CLR T0H

        SBRC EH,0
         ADD T0L,AL
        SBRC EH,0
        ADC T0H,AH
         LSL AL
         ROL AH

        LSR EH
        CPI EH,0
         BRNE PC-8
   
         POP EH
         POP AL
        POP AH

.endm

lzf713 发表于 2009-9-22 23:57:44

我搞不明白下面这个程序到底要干什么。是不是实现将两个8位数EL,EH进行相乘,然后将结果保存到T0中(但是我调试结果不对)?请高手指导
; T0 = int8(EL) x .uint8(EH), 32clks
.macro MULT
mov T0H, EL
sbrc EL, 7
neg EL

clr T0L
sbrc EH, 0
add T0L, EL
lsr T0L
sbrc EH, 1
add T0L, EL
lsr T0L
sbrc EH, 2
add T0L, EL
lsr T0L
sbrc EH, 3
add T0L, EL
clr T0L
sbrc EH, 4
add T0L, EL
lsr T0L
sbrc EH, 5
add T0L, EL
lsr T0L
sbrc EH, 6
add T0L, EL
lsr T0L
sbrc EH, 7
add T0L, EL

lsl T0H
mov T0H, _0
brcc PC+3
neg T0L
sbc T0H, T0H
.endm

lcqqcl 发表于 2009-9-23 08:39:35

MARK

lzf713 发表于 2009-9-23 11:56:46

终于弄明白了。
原来是EL存放波表数据,EH存放以指数形式的衰减表数据。T0就要存放EL和EH相乘的结果,这样就是实现调幅。
由于是EH调制EL,所以EL的幅度不能太大。
于是MULT就是T0=EL*(EH/128)。除以128,目的是使得EH衰减128倍。
; T0 = int8(EL) x .uint8(EH), 32clks 不要错过uint8(EH)前面的“.”符号,表示EH是一个小数(用二进制表达)。
乘以一个二进制小数,实现方式就加法和右移动。

lzf713 发表于 2009-9-23 11:59:46

MULT类是C语言的:
int MULT(signed char EL,unsigned char EH)
{
signed int T0;
//T0=EL*(EH/128);
T0=EL*EH/128;
return(TO);
}

wx85105157 发表于 2017-7-8 00:16:46

lzf713 发表于 2009-9-23 11:59
MULT类是C语言的:
int MULT(signed char EL,unsigned char EH)
{


那请问他有6个通道,六个通道之间的数据要怎么融合呢?

xiao_yao 发表于 2017-8-29 07:35:20

这个有点意思,可汇编看不懂

iamseer 发表于 2021-3-31 23:17:06

lzf713 发表于 2009-9-23 11:56
终于弄明白了。
原来是EL存放波表数据,EH存放以指数形式的衰减表数据。T0就要存放EL和EH相乘的结果,这样 ...

感谢分析。
页: [1]
查看完整版本: 老外的音乐发生器原理是什么?【恢复】