主要是想大致了解Sigma-delta ADC是怎么工作的,写了个乱七八糟的代码来简单看下。很粗略的解释,主要给自己参考。
successive approximation register adc,简单理解为一个采样开关和采样电容。采样开关定时闭合,忽略暂态,则采样电容上的电压等于采样开关闭合时刻的输入电压。

因此理想的SAR ADC相当于一个采样开关 ,把连续的输入信号变成了离散的采样结果。

或者,另一种画图的方法,就是说,[n*Ts,(n+1)*Ts]期间的采样结果恒定为Vin(n*Ts)

核心是sigma-delta调制,如下图。
1-bit DAC的输出只有两种电压,取决于给它提供的电压基准Vref+和Vref-:
sigma-delta调制的运算过程:
通过sigma-delta调制,输入的模拟量变为了01的调制信号。而且0和1的比例与输入信号幅值有关。举个极端的例子,
DAC的参考Vref+=3V,Vref-=0。输入信号也是2.99V,那么,
第1次运算,误差2.99V,积分器输出2.99V,调制信号1
第2次运算,误差-0.01V,积分器输出2.98V,调制信号1
…
第299次运算,误差-0.01V,积分器输出0.01V,调制信号1
第300次运算,误差-0.01V,积分器输出0.00V,调制信号0
大致可以看出,当输入信号电压高时,调制信号中的1占比就更高。

以上过程转换成matlab代码:
sigma_delta = zeros(1,N_over_sample);
for i = 1:N_over_sample % intput: N samples, output: N sigma_delta values
vfb = vref * out; % 根据上一次比较结果,vfb可能是0,也可能是Vref
err = vin(k*N_over_sample+i) - vfb; % 误差
vint = vint + err; %积分
out = (vint > 0); %再与0比较
sigma_delta(i) = out; %输出的sigma_delta调制结果
end
SigD_result(k+1) = mean(sigma_delta)*vref;
% 对调制后的信号低通滤波,再乘以Vref可以获得最终ADC结果。
% 比如,可以用求平均值实现低通滤波
% ADC results is obtained by averaging the N sigma_delta values and *vref

降低采样频率,便于画图对比两种ADC的区别:

TI视频的这张图解释得更清楚一些:

查到ADI官网上有个教程,里面可以一步一步演示Sigma-delta调制过程,可以参考下。
Sigma-Delta ADC Tutorial | Design Center | Analog Devices
TI有个视频,介绍两种ADC的基本原理。
https://youtu.be/U_Yv69IGAfQ
画各个图的代码:
close all;
clear;
f0 = 1e3; % frequency of the input signal
T = 1/f0; % period
dt = 1e-8; % time step
t = 0:dt:T;
vin = 1+sin(2*pi*f0*t)+0.3*sin(2*pi*3*f0*t); % input signal
Fs = 20e3; % sample rate
Nt = round((1/Fs)/dt); % 每Nt个点中取一个作为理想SAR ADC的采样结果
SAR_result = vin(1:Nt:length(vin)); % SAR结果
SAR_t_instance = t(1:Nt:length(vin)); % SAR采样时刻
figure(1)
plot(t,vin,SAR_t_instance,SAR_result,'*');
grid
% 换种方式来画SAR ADC的图,就是说,[n*Ts,(n+1)*Ts]期间的采样结果恒定为Vin(n*Ts)
v_sar = vin;
sample = vin(1);
for i = 1:length(vin)
if mod(i,Nt) == 0 % From Ns*100 points, take Ns samples, thus 1 out of 100
sample = vin(i);
end
v_sar(i) = sample;
end
figure(2)
plot(t,vin,t,v_sar)
grid
% 换种方式来画SAR ADC的图
% Sigma-delta ADC
vref = 3; %这里Vref_P=3V Vref_N = 0V
Fs_sigma = 20e3;
N_over_sample = round((1/Fs_sigma)/dt); %例如,sigma delta 对1000次采样进行运算,输出1个最终结果
N_sample = round(length(vin)/N_over_sample);
%例如采样周期是dt=100MHz,每1000个
SigD_t_instance = zeros(1,N_sample);
SigD_result = zeros(1,N_sample);
for k = 0:N_sample-1
sigma_delta = zeros(1,N_over_sample);
vint = 0;
out = 0;
for i = 1:N_over_sample % intput: N samples, output: N sigma_delta values
vfb = vref * out; % 根据上一次比较结果,vfb可能是0,也可能是Vref
err = vin(k*N_over_sample+i) - vfb; % 误差
vint = vint + err; %积分
out = (vint > 0); %再与0比较
sigma_delta(i) = out; %输出的sigma_delta调制结果
end
SigD_result(k+1) = mean(sigma_delta)*vref;
% 对调制后的信号低通滤波,再乘以Vref可以获得最终ADC结果。
% 比如,可以用求平均值实现低通滤波
% ADC results is obtained by averaging the N sigma_delta values and *vref
SigD_t_instance(k+1) = t((k+1)*N_over_sample);
end
figure(3)
plot(t,vin,SigD_t_instance,SigD_result,'*')
grid
figure(4)
plot(t,vin,t,v_sar)
hold on
plot(SigD_t_instance, SigD_result,'*')
grid
文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat
前言 Slowloris攻击是我在李华峰老师的书——《MetasploitWeb 渗透测试实战》里面看的,感觉既简单又使用,现在这种攻击是很容易被防护的啦。不过我也不敢真刀实战的去试,只是拿个靶机玩玩罢了。 废话还是写在结语里面吧。(划掉)结语可以不看(划掉)Slowloris攻击的原理 Slowloris是一种资源消耗类DoS攻击,它利用部分HTTP请求进行操作。也叫做慢速攻击,这里的慢速并不是说发动攻击慢,而是访问一条链接的速度慢。Slowloris攻击的功能是打开与目标Web服务器的连接,然后尽可能长时间的保持这些连接打开。如果由多台电脑同时发起Slo
目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式 2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置 3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一
例如,我一直看到称为String#split的方法,但从未见过String.split,这似乎更合乎逻辑。或者甚至可能是String::split,因为您可以认为#split位于String的命名空间中。当假定/隐含类(#split)时,我什至单独看到了该方法。我知道这是ri中识别方法的方式。哪个先出现?例如,这是为了区分方法和字段吗?我还听说这有助于区分实例方法和类方法。但这从哪里开始呢? 最佳答案 不同之处在于您如何访问这些方法。类方法使用::分隔符来表示消息可以发送到类/模块对象,而实例方法使用#分隔符表示消息可以发送到实例对
1、为什么压缩的原始数据一般采用YUV格式(1)利用人对图片感觉的生理特性,对于亮度信息比较敏感,对于色度信息不太敏感,所以视频编码是将Y分量和UV分量分开来编码,并且可以减少UV分量.2、视频压缩原理(1)空间冗余:图像相邻像素之间的相关性,比如一帧图片被划分成多个16x16的块之后,相邻的块之间有很多明显的相似性。(2)时间冗余:时间相差较近的两张图片变化较小。(3)视觉冗余:我们的眼睛对某些细节不太敏感,对图像中的高频信息的敏感度小于低频信息,可以去除一些高频信息。(4)编码冗余:一幅图片中不同像素出现的概率是不同的,对于出现次数较多的像素,用少的位数来编码,对于出现次数较少的像素,用多
Python程序运行原理Python是一种脚本语言,编辑完成的程序,也称源代码,可以直接运行。从计算机的角度看,Python程序的运行过程包含两个步骤:解释器将源代码翻译成字节码(即中间码),然后由虚拟机解释执行。Python程序文件的扩展名通常为.py。在执行时,首先由Python解释器将.py文件中的源代码翻译成中间码,这个中间码是一个扩展名为.pyc的文件,再由Python虚拟机(PythonVirtualMachine,PVM)逐条将中间码翻译成机器指令执行。需要说明的是,pyc文件保存在Python安装目录的pycache文件夹下,如果Python无法在用户的计算机上写人字节码,字节
我正在学习Rails数据库连接池概念。在Rails应用程序中,我将池大小定义为5。我对连接池大小的理解如下。当服务器启动时,rails会自动创建n个在database.yml文件中定义的连接。在我的例子中,它将创建5个连接,因为池大小为5。在每个http请求上,如果需要访问数据库,rails将使用连接池中的可用连接来处理请求。但我的问题是,如果我一次达到1000个请求,那么大部分请求将无法访问数据库连接,因为我的连接池大小只有5个。我上面对rails连接池的理解对吗??谢谢, 最佳答案 目的:数据库连接不是线程安全的;所以Activ
ElasticSearch——刷盘原理流程刷盘原理流程名词和操作解释相关设置刷盘原理流程整个过程会分成几步:数据会同时写入buffer缓冲区和translog日志文件buffer缓冲区满了或者到时间了(默认1s),就会将其中的数据转换成新的segment并写入系统文件缓存,这一步叫refresh其中后台会自动合并小的segment成大的segment;这一步叫段合并当translog达到大小的阈值(默认512M)或者flush默认时长(30m),则会执行flush操作:内存中数据写入新的segment放入缓存(清空内存区)一个commitpoint写入磁盘,表示哪些segment已写入磁盘将缓
此代码取自ActiveRecord2.3.14的gem类ConnectionHandlerdefestablish_connection(name,spec)@connection_pools[name]=ConnectionAdapters::ConnectionPool.new(spec)end似乎每次ruby在模型上调用establish_connection时,它都会创建一个新的连接池。我的问题:如果我有5个模型使用establish_connection连接到同一个数据库,Rails是否足够智能以选择一个已经存在的池而不是创建一个具有相同连接凭据的新池?如果我的5个模型是
实验中我们使用的是52单片机目录前言一、单片机是什么?二、实验步骤1.独立键盘检测1.2代码如下(示例):1.3图片1.4视频2.矩阵键盘检测2.2代码如下(示例):2.3图片2.4视频总结:以上就是今天要讲的内容,本文仅仅简单介绍了单片机键盘检测的应用实现,而单片机键盘检测相关理论可以参考教材进行学习前言文章内主要概念引自郭天祥老师《新概念51单片机C语言版》一书主要展示郭天祥老师书中第四章键盘检测原理及应用实现。分为仿真、实体两部分。一、单片机是什么?单片机就是在一块硅片上集成了微处理器、存储器及各种输入/输出接口的芯片,这样一块芯片就具有了计算机的属性,因而被成为单片微型计算机,简称单片