求教delta-sigma adc?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教delta-sigma adc?相关的知识,希望对你有一定的参考价值。

问下你delta-sigma adc数字部分是怎样将1/0高速、低精度的位流转换成低速、高精度的数字输出的? 譬如说怎么就把1位变成16位了,时域和频域是怎么分析的?

“将1/0高速、低精度的位流转换成低速、高精度的数字输出”是delta-sigma adc中“抽样滤波器”造成的。抽样滤波器又由两部分组成,分别是“数字滤波器”和“抽样环节”。在频域上分析,假定fs为抽样滤波器输入信号的采样频率,该数字滤波器是个低通滤波器,其在0到fs/2区间上把输入信号乃奎斯特频率外的成分消除,由于数字信号以-fs/2到fs/2镜像分布在频率上,所以再经过“抽样环节”降低采样频率为乃奎斯特频率时,抽样滤波器的输出信号在其带宽内基本无变化,但实现了采样频率的降低。
在时域上分析,你可以想象一下,抽样滤波器的数字滤波器部分由延时环节、加法器、乘法器等构成,其输出的每一个点都是由以前若干个0或1的点组合而成的,就可得到“1位变成16位”。追问

如果将降采样滤波器写成verilog的话,那么输入是1位,输出是16位(out[15:0]),因为verilog中这个位数是先就定好了,那是不是根据计算能达到多少位的精度之后再设计verilog中输出的位数?

抽样环节是不是根据降采样率进行简单的几个数据选一个数据的过程?

追答

1、是的。
2、是的。
抽样滤波器有很多设计方法,如果条件允许,你可以在IEEE数据库上下点文章了解下。

追问

再问下你,如果将抽样滤波器分成几级来实现,那么第一级输出的verilog实现时位数怎么确定?还是从第一级出来就16位了?
每一级的滤波器系数实现定点化的字长怎么确定?
我看delta-sigma 调制器出来的信号有些是说单比特信号1/0直接进入后面抽样滤波器,有些做法又是转化成两位的有符号数11(-1)、01(+1),这个是怎么回事?

追答

抽样滤波器的设计方法很多,实现方法更多。如果抽样滤波器架构没有设计好的话,不用急着用verilog实现。
1、抽样滤波器分析时把数字滤波器和抽样环节分开分析,但是实际实现时很多情况是合并的。
2、如果抽样滤波器是级联实现的,每一级的输入信号和输出信号的位宽要按其实际的动态范围确定。
3、字长的确定不是凭空想的,要在架构设计的时候考虑的。16位的滤波器系统也有18位字长的,只不过最后又转换为16位的。
4、delta-sigma 调制器内部含有量化器,其量化器位数不都是1位的,其中也有多位的,用于提高信噪比。

参考技术A 1bit输出经过CIC滤波、半带滤波器滤波,CIC滤波输入为1比特,输出的字长Bmax为M*log2(N)+Bin-1,其中M表示级联积分梳妆滤波器的阶数,N是抽取系数,Bin输入字长(为1)。只要级联CIC的字长不小于Bmax,这个系统的滤波性能不会受到字长影响。也就是说,单比特(1,-1)的值经过Bmax字长的CIC滤波器运算,输出自然变成多比特了。

使用头文件自学 - 求教

【中文标题】使用头文件自学 - 求教【英文标题】:Self-taught by using header files - Seeking advices 【发布时间】:2016-10-27 14:54:16 【问题描述】:

我正在自学如何将头文件与 .cpp 文件一起使用。我一直在研究这个问题一段时间,无法弄清楚。有人能帮我解决两个错误吗?谢谢你:)

驱动程序.cpp

#include <cstdlib>

using namespace std;
#include "F.h"
#include "G.h"


int main()


    FMMoore::hello();
    GMMoore::hello();

    system("pause");
    return 0;

F.cpp

#include <iostream>
using std::cout; 
#include "F.h"

namespace FMMoore

    void hello()
    
        cout << "hello from f.\n";
    

F.h

#ifndef F_H
#define F_H

namespace FMMoore

    class FClass
    
    public:
        void hello();
    ;


#endif // F_H

G.cpp

#include <iostream>
using std::cout; 
#include "G.h"

namespace GMMoore

    void hello()
    
        cout << "hello from g.\n";
    

G.h

#ifndef G_H
#define G_H

namespace GMMoore

    class GClass
    
    public: 
        void hello();
    ;


#endif // G_H

错误是“你好”不是“FMMoore”的成员并且“GMMoore”尚未声明。

我也一直在检查拼写错误和其他事情。我不知道为什么它没有宣布。

【问题讨论】:

你需要一本 C++ 书籍。 是的,我有一本书,但不是一本真正有用的书 您错过了指定命名空间范围。 您真的应该阅读教程。这没有你在做什么的结构。您的hello 每次都在课堂内。所以你需要学习如何定义一个类的函数。然后你有非静态方法,所以你还需要对象的实例化。 ...一本教程/书会很有帮助。 @blacklune:试试these 之一。 【参考方案1】:

F.h中,hello被声明为FClass成员函数FMMoore命名空间下定义:

#ifndef F_H
#define F_H

namespace FMMoore

    class FClass
    
    public:
        void hello();
    ;


#endif // F_H

但是,在F.cpp 中,您在FMMoore 命名空间下实现了函数hello,但该函数不是FClass 的成员函数:

namespace FMMoore

    void hello()
    
        cout << "hello from f.\n";
    

G.h/G.cpp 也是如此。

基于您在driver.cpp 中的代码:

FMMoore::hello();
GMMoore::hello();

听起来你想要一个免费函数hello(不是类成员函数),所以你应该修复标题,例如对于F.h

#ifndef F_H
#define F_H

namespace FMMoore

    // hello is a free function under the FMMoore namespace
    void hello();


#endif // F_H

【讨论】:

以上是关于求教delta-sigma adc?的主要内容,如果未能解决你的问题,请参考以下文章

虚心求教:stm32使用hal库中adc采样频率如何查看和修改?

ITM-LINUX求教

求教DATASTAGE中MERGE,JOIN和LOOKUP三者之间的区别

求教DFN封装和QFN封装的区别

C++ SOCKET编程,如何监听多个端口,比如监听两个端口,关键代码该怎么写,求教求教,求代码!

求教:最大更新深度超过的原因