论坛风格切换切换到宽版
  • 18224阅读
  • 212回复

方波的采样定理和DDS的问题 [复制链接]

上一主题 下一主题
离线mainstreet
发帖
44
只看该作者 20楼 发表于: 2008-07-28
'
索性做个带正弦波表的dds试验。仅8位输出就比1位的强太多了:
'
70mhz附近的两个刺是谐波吗?
离线bd1es
发帖
2096
只看该作者 21楼 发表于: 2008-07-29
'
70mhz附近的两个刺是谐波吗?
'

不是谐波。我也不知道为什么那里出现两根刺。

这样吧,好久没动已经忘得差不多了,需要复习。这几天我整理资料并贴出来,大家自己尝试尝试。:)
离线小比尔/5
发帖
2582
只看该作者 22楼 发表于: 2008-07-29
如果要减少相位抖动,靠最高位比特肯定不行。
但是如果用高精度的数值比较器,也许可以。
比如说,24位的计数器,当数据过半的时候,为高电平;数据不过半的时候。
000000-7fffff:“h”
800000-ffffff:“l”
但是,无法确定会抖成什么样子。比如说出1/3fs的时候,估计就已经很惨了。
另外,方波不存在采样定理,它不满足狄利贺里条件。所以担心产生的谱波会反折到带内造成干扰。
离线mainstreet
发帖
44
只看该作者 23楼 发表于: 2008-07-30
有兴趣。有兴趣。
离线alchemier
发帖
69
只看该作者 24楼 发表于: 2008-07-30
为什么小比尔做的那个也是8位的dds谐波分量那么大呢?你这个matlab里的8位的正弦波表样点是多少个?
离线alchemier
发帖
69
只看该作者 25楼 发表于: 2008-07-30
能不能把输出波形也贴一下?
离线小比尔/5
发帖
2582
只看该作者 26楼 发表于: 2008-07-30
'
能不能把输出波形也贴一下?
'
我的输出波形已经出来了。
上次有个失误,没把纵坐标轴贴出来。
dac为单电源无源输出接法,无跟随器,5v工作,线性差。
频差是使用11.0592mhz晶振,不能整除所产生的误差造成的。
fft n=65536
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线alchemier
发帖
69
只看该作者 27楼 发表于: 2008-07-30
我是想看bd1es的波形:)
不过小比尔的这个贴出来也好,比较一下,就是图有点看不清楚,不知是示波器的问题还是照相机的问题?这个无源da输出端加滤波器了吗?
离线小比尔/5
发帖
2582
只看该作者 28楼 发表于: 2008-07-30
几天前同学用手机拍的。输出未加滤波器。在示波器上可以明显看到采样点和它们的爬动。

规格:8bit dac,自制512样点正弦表
换了一个好一点的声卡,上一次的声卡输入端截止频率太低,不能更真实地反映性能。
如果用差分输出,可能会抵消掉一些偶次谐波失真。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bd1es
发帖
2096
只看该作者 29楼 发表于: 2008-07-30
小比尔/5的这个波形好棒,那些谐波看上去是声卡的失真,因为正弦波dds是没有谐波的,除非波表做错了,:),所以应该没问题。

我在整理程序了,希望不会让大家失望,但愿但愿, ...
离线小比尔/5
发帖
2582
只看该作者 30楼 发表于: 2008-07-30
'
小比尔/5的这个波形好棒,那些谐波看上去是声卡的失真,因为正弦波dds是没有谐波的,除非波表做错了,:),所以应该没问题。
我在整理程序了,希望不会让大家失望,但愿但愿, [表情] [表情] ...
'

好的,等着你的程序哈~
我的本子现在在瘫痪中,等到把软件装好以后做个方波的试试。
离线mainstreet
发帖
44
只看该作者 31楼 发表于: 2008-07-30
'
小比尔/5的这个波形好棒,那些谐波看上去是声卡的失真,因为正弦波dds是没有谐波的,除非波表做错了,:),所以应该没问题。
我在整理程序了,希望不会让大家失望,但愿但愿, [表情] [表情] ...
'怎么可能呢?dac会有失真的。
离线小比尔/5
发帖
2582
只看该作者 32楼 发表于: 2008-07-30
今天突然想到另外一个原因:
在stc12c5410里,sjmp $是3周期语句,在进入中断的时候,可能会出现周期性延时0、1、2个时钟周期的现象,导致采样频率抖动!!!

看来要干这个,最好用risc结构的cpu!
离线bd1es
发帖
2096
只看该作者 33楼 发表于: 2008-07-30
'
怎么可能呢?dac会有失真的。
'

是呀,用声卡能到-40db的失真度已经很不错了, 。各种器件都有失真,所以总会比理想的情况差一些,

程序整理出来了,在附件里,有两个主要文件:
1、main.cpp:dds软算法,有波表和dds序列生成两部分。其中有一个波表算法是搞笑的,免得同志们做实验太枯燥。
2、fft_test.m:matlab的fft分析程序,可以生成功率谱。现在加了汉宁窗,那蓝头发好看些了。

说明:
1、c的程序用mingw编译就行了。因为经常要修改参数做实验,建议加上eclipse做ide。
2、matlab程序需要运行于7版以上的平台,我用2006b。老版本不知有问题没有。
3、现在写的是32位dds,波表的宽度是8位,长度是512,

都一年多了,俺还是没好好学matlab,有什么不对的地方请大伙一块儿改吧,

明天上些图片,做详细说明...。基本上,波表很重要!!
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线小比尔/5
发帖
2582
只看该作者 34楼 发表于: 2008-07-31
挺好的啊,您太谦虚了。
不过我这里还没搞mingw,明天用c free看看。
离线mainstreet
发帖
44
只看该作者 35楼 发表于: 2008-07-31
我写的。谐波比我预想的低得多,是不是有什么错?

close all;
clear all;

m=10; wave=sin(2*pi*(1:2^m)'/2^m); % 1024-entry wave table
n=8-1; wave=round(wave*2^n)/2^n; % truncated to 8-b

f0=0.1*exp(1)/2.7; % normalized frequency is 0.1
phase0=0; % initial phase
k=16; phase1(1:2^k)=phase0+2*pi*f0*(0:2^k-1); % phase
phase2=mod(phase1,2*pi)/2/pi; % phase between 0 and 2*pi
phase3=round(phase2*(2^m-1)+1); % phase as wave table indices

x=wave(phase3); % wave table output
x=x.*hanning(2^k); % windowed
y=fft(x);
y2=abs(y(1:2^k/2)).^2;
y2=y2/max(y2); % normalized
plot((1:2^k/2)/2^k,20*log10(y2));
axis([0 0.5 -150 0]);
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bd1es
发帖
2096
只看该作者 36楼 发表于: 2008-07-31
发现您波表有点儿小问题,2^n应该是2^n-1,否则会出现128这个值,就不是8位了。但这基本上不影响输出啊,不明白为什么信噪比如此高。

我是为了避免matlab的双精度计算而改用c写dds的,这样dds核心是整数运算,相位舍入与实际硬件是一样的,而且我不会用matlab写整数运算,:) :)。

个人感觉8位输出的dds不该有如此高的信噪比,所以估计问题出在相位累加的双精度运算问题上。猜测而已。
离线alchemier
发帖
69
只看该作者 37楼 发表于: 2008-07-31
我猜测是因为
1.频率低0.1hz
2.波表细1024位
把频率调高到一定程度谐波就会大了
离线bd1es
发帖
2096
只看该作者 38楼 发表于: 2008-07-31
贴几张图:

w01.gif:头50个采样点
s01.gif:频谱图,调用标准c库生成的8x1024波表
s02.gif:频谱图,模拟vb中4舍6入5取双所生成的8x1024波表

可见波表对输出的影响是不小,特别是杂散的分布上

程序参考前两贴的附件。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线小比尔/5
发帖
2582
只看该作者 39楼 发表于: 2008-07-31
这是我今天做的:
截断误差比dac的精度误差影响更大
当地址线位数增大后,截断误差引起的杂散频谱f轴上变稀,幅值变小
采样频率与精度也是一对矛盾,需要权衡
若要高频、高速、高质量,只有同时增加采样频率和累加器位数
如果频率不是采样频率的公因子,杂散也会急剧变多

我用来模仿截断误差的方法是,让累加器除以一个系数,然后用fix截断小数点(就是效率没有左右移高,可是我不知道怎么左右移)
让累加器过一个modulo取模,就可以处理溢出的情况了.

下面的程序使用scilab编写,如需在matlab上运行,可能要略加修改。
程序尚未优化,采样点太多时,有可能造成内存溢出。
程序见附件(under gpl).
本主题包含附件,请 登录 后查看, 或者 注册 成为会员