加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【转载】使用Simulink构建一个3阶MASH调制器

(2019-05-27 19:13:13)
分类: 信号处理
使用Simulink构建一个3阶MASH调制器
 

在Delta Sigma调制器结构中,MASH(Multi stAge noise SHaping)结构由于其稳定性最佳,是最常见的噪声整形电路。现在我们就开始使用Simulink构建一个16位3阶的MASH调制器。

无限精度的MASH调制器仿真的模块的连接方法如下图所示,因为所有模块都是数学建模,仿真精度可以达到Matlab内部设定的最高精度。

【转载】使用Simulink构建一个3阶MASH调制器

从图中可以看出,我们需要以下几个模块:

3个小数加法器:构建方法在下面详细介绍

5个单位延迟:Discrete|Unit Delay

2个Sum:Commonly Used Block|Sum,双击Sum图标,更改Block Parameters窗口Main标签中的List of Signs选项

1个常数发生器:Commonly Used Block|Constant,重命名为Fractional N,双击图标,更改Block Parameters窗口Main标签中的Constant Value为测试小数

1个时域示波器:Sinks|Scope

1个频域示波器:Signal Processing Blockset|Signal Processing Sinks|Spectrum Scope

1. 构建一个理想的小数加法器

【转载】使用Simulink构建一个3阶MASH调制器

如图所示,一个理想的小数加法器实现的功能包括A和B两个数相加,取整作为进位位输出Cout,两数和与进位位输出相减得到小数和输出Sout。

两数相加减使用Math Operations|Sum实现,取整使用Math Operations|Rounding Function实现。

2. 整体仿真

【转载】使用Simulink构建一个3阶MASH调制器

将整个模块连接好之后就可以进行整体仿真了,需要注意的是第一个小数加法器的构建有些不同,如图所示,需要加上一个最低位的dither信号。

实际电路是有精度限制的。我们将小数N看作是二进制数列来处理,因为加法器使用电路实现,所以有精度限制,一个16位精度的仿真模块连接图如下图所示。

【转载】使用Simulink构建一个3阶MASH调制器

从图中可以看出,我们需要以下几个模块:

1个小数译码器:输入是一个小数,输出是16位二进制数列

3个16位全加器:构建方法可以参考:http://hi.baidu.com/critever/blog/item/960225e9b0eb9f3fb80e2d99.html

5个单位延迟:Discrete|Unit Delay

2个1位加法器:Commonly Used Block|Sum,双击Sum图标,更改Block Parameters窗口Main标签中的List of Signs选项

2个常数发生器:Commonly Used Block|Constant,一个重命名为Fractional N,双击图标,更改Block Parameters窗口Main标签中的Constant Value为测试小数;一个重命名为dither,用来偏置最低位加法器的进位位至1,产生的dither信号,将Constant Value设定位[1 0]

1个时域示波器:Sinks|Scope

1个频域示波器:Signal Processing Blockset|Signal Processing Sinks|Spectrum Scope

1. 构建小数译码器

首先我们需要构建一个小数译码器。小数译码器的基本思想是将一个小数除以0.5,得到的商取整作为最高位输出,余数除以0.5的一半即0.25,得到的商取整作为第2位输出。如此反复直到得到第16位输出为止。这样我们可以先构造一个译码器单元,如图所示。

【转载】使用Simulink构建一个3阶MASH调制器

其中,Din是输入位,Cin表示除数位,因为每级的除数都要减小0.5,所以从Cin至Cout中间加入一个Gain模块(Math Operations|Gain),将参数Gain设定为0.5。Drem表示余数输出,mod模块实现取余功能(Math Operations|Math Function),将参数Function设定为mod。Dout表示商取整输出,使用Divide(Math Operations|divide)和Rounding Function模块(Math Operation|Rounding|Function)来实现,将Rounding Function的Function参数设定为floor。

到此为止我们完成了1位译码器的构建,可以创建一个名为Decoder_Cell的子系统了。

【转载】使用Simulink构建一个3阶MASH调制器

如图所示,将四个Decoder_Cell连接起来。将四个Decoder_Cell的输出经过一个Mux(Commonly Used Blocks|Mux)汇集成一条总线输出。这样一个4位的译码器构建完成,可以创建一个名为Decoder_4bit的子系统了。

【转载】使用Simulink构建一个3阶MASH调制器

有了4位的Decoder,我们就可以重复上述方法构建一个16位的Decoder了。连接方法如图所示,注意第一个Decoder _4bit的Cin连接到常数1,最后一个Decoder_4bit的输出Drem和Cout连接到Terminator(Commonly Used Blocks)。完成后构建一个名为Decoder_16bit的子系统了。

2. 整体仿真

将所有的模块连接好以后,我们就可以对MASH调制器进行仿真了。需要注意的是在仿真之前要将Spectrum Scope的Block Parameters窗口Scope Properties标签中的Buffer input前面的勾选上,不然仿真的时候会报错,同时将Buffer size设定的大一些(如2048),这样可以提高输出波形的精度。

将仿真时间设定的长一些,运行仿真我们就可以看到MASH调制器输出的时域波形和频谱了。

【转载】使用Simulink构建一个3阶MASH调制器
【转载】使用Simulink构建一个3阶MASH调制器

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有