论坛风格切换切换到宽版
  • 6938阅读
  • 52回复

做了个MiniDDS,但是杂散大得吓死人了 [复制链接]

上一主题 下一主题
离线小比尔/5
 
发帖
2582
只看楼主 倒序阅读 0楼 发表于: 2008-07-13
输出1khz的时候。d/a用的是只有8位精度的dac0832。
指标:s/(n+i)≈45db,十分爽又十分不爽。
谐波失真是输出电路阻抗不匹配造成的。
频谱图,纵向的单位是db哈,不然就太烂了。
一、二次谐波在频谱上差32db
stc单片机时钟:11.0592mhz,采样频率:100khz
出19khz是没问题的,只是这个杂散实在大得对不起观众。
下一步是把时钟搞上去,争取更高的采样频率和精度。
但是还没办法置频,只能烧写在程序里,这个问题也很头痛。
ba6bf出16khz-26khz,df=1hz的问题可能有望解决,如果不嫌弃这个破频谱的话……
关键是stc比较便宜,呵呵~
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线mike
发帖
198
只看该作者 1楼 发表于: 2008-07-13
虾米芯片做的涅??????
离线小比尔/5
发帖
2582
只看该作者 2楼 发表于: 2008-07-13
'
虾米芯片做的涅??????
'
stc12c5410+dac0832
离线代洪波
发帖
4809
只看该作者 3楼 发表于: 2008-07-13
我也用5410ad
离线小比尔/5
发帖
2582
只看该作者 4楼 发表于: 2008-07-14
我把程序贴上,有兴趣的自己改进吧~
用这段程序在11.0592mhz的极限采样频率大约是200khz~
其实程序很简单。
现在的问题就是改善性能以及和用户通信,不然的话,用stc12c2052就可以搞定了。

我觉得大家应该感兴趣的啊,改一改就可以作为可编程亚音发生器使用了~ -_-|||

;晶振频率11.0592mhz,时钟周期~=1us
;采样频率:约100khz
;令其输出19khz

auxr            equ 8eh            ;定时器速度控制

org 0000h
jmp init

org 000bh
jmp tmr0_svr

org 0100h
init:            mov sp,#7fh
                 call init_t0            ;初始化t0计数器
                 setb pt0
                 setb et0
                 setb ea

                 mov r7,#30h                  ;相位步进值,高位在前
                 mov r6,#0a3h
                 mov r5,#0d6h
                 
                 mov r4,#00h                  ;累计相位值
                 mov r3,#00h
                 mov r2,#00h

                 clr a

                 setb p2.6
                 mov p1,#00h

main:            sjmp $

tmr0_svr:      clr p2.6
                 mov a,r2                  ;使用mov较节约时间
                 add a,r5
                 mov r2,a
                 mov a,r3
                 addc a,r6
                 mov r3,a
                 mov a,r4
                 addc a,r7
                 mov r4,a
                 setb p2.6
                 jb acc.7,tm0
                 mov dptr,#sin_tab      ;查512样点表,减少相噪
                   sjmp tm1
tm0:            mov dptr,#sin_tab_2
tm1:            mov a,r3
                 rlc a
                 mov a,r4
                 rlc a
                 movc a,@a+dptr
                 mov p1,a
                 reti

init_t0:      mov tmod,#02h            ;设置t0为8位自动重装
                 mov tcon,#00h
                 mov th0,#91h
                 mov tl0,#91h
                 mov auxr,#80h            ;设置t0为12倍速
                 setb tr0
                 ret

;<=== 512 样点正弦表 ===>
;<= 本表采用scilab计算 =>
sin_tab:      db 128,129,131,132,134,135,137,138,140,142
                 db 143,145,146,148,149,151,152,154,155,157
                 db 158,160,162,163,165,166,167,169,170,172
                 db 173,175,176,178,179,181,182,183,185,186
                 db 188,189,190,192,193,194,196,197,198,200
                 db 201,202,203,205,206,207,208,210,211,212
                 db 213,214,215,217,218,219,220,221,222,223
                 db 224,225,226,227,228,229,230,231,232,233
                 db 234,234,235,236,237,238,238,239,240,241
                 db 241,242,243,243,244,245,245,246,246,247
                 db 248,248,249,249,250,250,250,251,251,252
                 db 252,252,253,253,253,253,254,254,254,254
                 db 254,255,255,255,255,255,255,255,255,255
                 db 255,255,255,255,255,255,254,254,254,254
                 db 254,253,253,253,253,252,252,252,251,251
                 db 250,250,250,249,249,248,248,247,246,246
                 db 245,245,244,243,243,242,241,241,240,239
                 db 238,238,237,236,235,234,234,233,232,231
                 db 230,229,228,227,226,225,224,223,222,221
                 db 220,219,218,217,215,214,213,212,211,210
                 db 208,207,206,205,203,202,201,200,198,197
                 db 196,194,193,192,190,189,188,186,185,183
                 db 182,181,179,178,176,175,173,172,170,169
                 db 167,166,165,163,162,160,158,157,155,154
                 db 152,151,149,148,146,145,143,142,140,138
                 db 137,135,134,132,131,129

sin_tab_2:      db 128,126,124,123
                 db 121,120,118,117,115,113,112,110,109,107
                 db 106,104,103,101,100,98,97,95,93,92
                 db 90,89,88,86,85,83,82,80,79,77,76
                 db 74,73,72,70,69,67,66,65,63,62,61
                 db 59,58,57,55,54,53,52,50,49,48,47
                 db 45,44,43,42,41,40,38,37,36,35,34
                 db 33,32,31,30,29,28,27,26,25,24,23
                 db 22,21,21,20,19,18,17,17,16,15,14
                 db 14,13,12,12,11,10,10,9,9,8,7,7
                 db 6,6,5,5,5,4,4,3,3,3,2,2,2
                 db 2,1,1,1,1,1,0,0,0,0,0,0,0
                 db 0,0,0,0,0,0,0,0,1,1,1,1,1
                 db 2,2,2,2,3,3,3,4,4,5,5,5,6
                 db 6,7,7,8,9,9,10,10,11,12,12,13
                 db 14,14,15,16,17,17,18,19,20,21,21
                 db 22,23,24,25,26,27,28,29,30,31,32
                 db 33,34,35,36,37,38,40,41,42,43,44
                 db 45,47,48,49,50,52,53,54,55,57,58
                 db 59,61,62,63,65,66,67,69,70,72,73
                 db 74,76,77,79,80,82,83,85,86,88,89
                 db 90,92,93,95,97,98,100,101,103,104
                 db 106,107,109,110,112,113,115,117,118,120
                 db 121,123,124,126

end
离线yuhang
发帖
1803
只看该作者 5楼 发表于: 2008-07-14
多漂亮的杂散啊, 杂散信号很有用的
离线小比尔/5
发帖
2582
只看该作者 6楼 发表于: 2008-07-14
'
多漂亮的杂散啊, 杂散信号很有用的
'
比如?举个例子?
刻度标示仪? -_-|||
离线MF35_
发帖
179
只看该作者 7楼 发表于: 2008-07-14
'
多漂亮的杂散啊, 杂散信号很有用的
'

杂散专业户
离线小比尔/5
发帖
2582
只看该作者 8楼 发表于: 2008-07-14
今天又修改了一下,可以用手键出rtty了。
fsk 1955hz, 2125hz
有码元发生器就爽了。
离线一异
发帖
868
只看该作者 9楼 发表于: 2008-07-14
输出阻抗不匹配?
没听说过这种低频小信号电路还有阻抗匹配问题,除非采用了无源滤波器。
离线小比尔/5
发帖
2582
只看该作者 10楼 发表于: 2008-07-15
[quote=一异]输出阻抗不匹配?
没听说过这种低频小信号电路还有阻抗匹配问题,除非采用了无源滤波器。[/quote]

因为dac用的基准电压使用电阻分压得到的,内阻比较大
声卡的输入阻抗比较低,可能会影响到d/a转换的精确度
所以这部分电路要改
离线代洪波
发帖
4809
只看该作者 11楼 发表于: 2008-07-15
可以把5410的频率提高到35mhz看看!
离线小比尔/5
发帖
2582
只看该作者 12楼 发表于: 2008-07-15
[quote=代洪波]可以把5410的频率提高到35mhz看看![/quote]
我的片子只能上35mhz,计划尝试用32.768mhz的晶振,相位步进会好算一些。
Δφ=fout/32768000*16777215

<--- 上面写错了 --->
应该是:Δφ=fout/fsample*16777215
fsample=32768000/n

stc12c的mov rn,#direct太慢了,要3个周期
想用msp430了…… -_-|||
离线小比尔/5
发帖
2582
只看该作者 13楼 发表于: 2008-07-16
用软件仿真了一下,看来出现的谐波分量不仅和输出电路的非线性有关,也和d/a的位数有关
电路的性能与仿真还是较为接近,当然略差
这些离散谱靠过取样都很难消除
要减少离散谱线就要做噪声整形,一整形后,噪声反而变大了
而且单片机好像算不过来的样子~
离线alchemier
发帖
69
只看该作者 14楼 发表于: 2008-07-16
有一点不太明白,正弦样表一共才512点,而相位分辨率为24位,16.8m个点,理论上说应该用至少16.8m个样点的正弦表才能达到理想的正弦输出效果,那么用512个样点的根据是什么?采用dds的方法,谐波的产生随频率的增加而增加是必然的,只有增加每个周期的采样点数才能弥补这个缺陷,是不是这个道理?
离线小比尔/5
发帖
2582
只看该作者 15楼 发表于: 2008-07-16
'
有一点不太明白,正弦样表一共才512点,而相位分辨率为24位,16.8m个点,理论上说应该用至少16.8m个样点的正弦表才能达到理想的正弦输出效果,那么用512个样点的根据是什么?采用dds的方法,谐波的产生随频率的增加而增加是必然的,只有增加每个周期的采样点数才能弥补这个缺陷,是不是这个道理?
'

你说的非常有道理,这就是为什么我要把表从256样点增加到512样点的原因。
这样做的目的其实只是工程上的一种近似方法,因为stc12c5410只有10k的内存,主程序就有500多字节,把整个表都放进去是不现实的,也是不可能的。目前的程序要占用约50个机器周期,表项太多,程序的复杂度会变高,stc里的直接寻址命令效率不高,担心会影响到采样频率的实现,而且对8位的d/a来说,改善也不大。
以你的数据做个假设吧。如果我要输出0.5hz,那么16.8m个样点是不是就不够了?
即便只存储1/4t的样点,采用一定的算法输出一个周期,那么,16.8m个样点最多也只能保证0.25hz频率的准确性。
因此,为了实现方便,就只能用表的截短形式。于是,截短的表就相当于对原来的正弦进行
了周期性的调相,所以就会出现谐波。
事实上,即便采用16.8m个样点,如果采样频率与输出频率不满足整数比,输出也会有谐波杂散。
另一方面,我的d/a的参考电压是无源器件得到的,输出也是无源的,所以在接测量声卡的时候,声卡的输入阻抗非常低,只有600欧,对d/a的整个线性度产生了非常不好的影响,因此这一部分非线性失真也产生了谐波。
昨天,我有一条汇编语言的位置写“错”了,这条语句的目的是向d/a送输出允许信号,在它之前有判断分支,两个分支的时序似不平衡。修改后,输出允许信号不抖动了,但是输出的杂散却变多了。由此可以看到,对输出的相位进行抖动,有助于减少谐波分量。在电脑上的仿真实验证明,不管用矩形、三角形,还是高斯抖动,都可以消除谐波分量。但是,输出的底噪变大。在锁相环应用中,运用抖动可以减少锁相环失锁、错锁在谐波上的概率,但作为信号源,c/(n+i)指标却下降了。如果能过采样,并通过抖动,把量化噪声集中到接近nyquist频率的位置,输出通过低通滤波器把这些噪声滤除,那么不管是对底噪还是谐波,都有很大改善,可惜,目前我的单片机的运算速度不够,加上理论功底的限制,还做不到这一点。
离线一异
发帖
868
只看该作者 16楼 发表于: 2008-07-16
'
有一点不太明白,正弦样表一共才512点,而相位分辨率为24位,16.8m个点,理论上说应该用至少16.8m个样点的正弦表才能达到理想的正弦输出效果,那么用512个样点的根据是什么?采用dds的方法,谐波的产生随频率的增加而增加是必然的,只有增加每个周期的采样点数才能弥补这个缺陷,是不是这个道理?
'

对于8bit的dac,有效数据只有8bit。
根据正弦曲线在原点的斜率,可以计算出采样数据表最多需要2×π×128≈804.25,也就是说需要的数据表数据量为804个数据。
如果数据表的采样数据太多,那么数据表中必然出现大量相等连续数据。比如:当数据表的大小为1608,那么相邻的两个数据一定是相等的。
当然,804这个数据在实际应用中肯定不太合适。如果不想损失精度,那么我们可以把数据表的大小定为1024,或者1000(十进制系统)。考虑到1024或1000都不是804的整倍数,为了避免增加额外的截断误差,可以把数据表的大小适当增加,比如增加到2048/2000,甚至在多一些。

但可以肯定的是:16.8m个采样点的数据表是绝对没有必要的
离线alchemier
发帖
69
只看该作者 17楼 发表于: 2008-07-18
感谢两位的解答!
主要可能是我对dds的相位步进还不太理解,按照上面的程序看似乎是把Δφ作为地址增量,加上零点值,然后作为正弦样表的地址,查出对应地址的8bit数据,再通过dac输出。可是相位步进值有那么多,很快就会超过512,这剩下的值是不是就循环调用正弦样表了?这样的话又怎么能保证出来的正弦波周期和我要求的输出频率周期相等呢?
离线alchemier
发帖
69
只看该作者 18楼 发表于: 2008-07-18
按照我的理解,比如我用16.8m的晶振,16.8m的样表,那么当我每个时钟周期读一个值时,输出就是1hz的正弦波,当我依次递增Δφ(1,2,3,4,5。。。)时,输出频率就会相应增加,直到8.4m,但是当样点减少的时候,这个相位还用得着这么细吗?是不是也因该相应的减少,对应的输出频率分辨率是不是也应该相应变低?也就是说512的样表就只有256个频率?
离线alchemier
发帖
69
只看该作者 19楼 发表于: 2008-07-18
我有点明白了,这个是不是和测量高频的频率计的方法是相似的?