原来ADC采样结果是这样用的

本文通过MATLAB演示了信号采样与重建的过程,使用带限内插方法来从采样序列中恢复原始波形。文章展示了采样序列与原信号的对比,以及重建信号的详细步骤,包括正弦波拟合和信号叠加,最终实现信号的精确重建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用内插从样本重建信号

要做一个示波器,或者用上位机显示信号波形,都要面临一个问题——信号重建。

本文将用MATLAB模拟采样-重建这一过程。文末有全部代码。

1、参考文献


理解AD\DA的工作原理并不困难,如何把数据采集器获取的电压序列显示在屏幕上才是真正让大伙恼火的问题。这个时候,《信号与系统》这本书就很值得再翻一翻了。


在这里插入图片描述
这本书专门有一章名为《采样》,感兴趣的可以去温习一下。

2、效果展示


下图第一栏是原信号波形(红色)和重建信号波形(蓝色)的对比图。可以看到曲线基本一致,重建信号完整地显示出原信号在采样区间上的变化趋势和幅值等特征。

第二栏是采样序列(类似冲击串采样),一个周期内采12个点。


在这里插入图片描述
采样对应代码中的


% set samlpe tic and get sample result as sample[]
ticp = 0:1/sliceP:period;
sample = sin(2*pi*ticp);
stem(ticp,sample);
title('wave of the sample result');

下面这张图第一栏的绿色曲线,是重建信号的波形。该波形由插值得到的各波的波形叠加而成。为更清楚地看到重建结果,将它显示在第二栏中(暗红色曲线)。


在这里插入图片描述

对应代码中的


plot(tics,reBuildSig)
title('wave of rebuild signal')

3、原理说明

用到的方法叫带限内插band-limited interpolation),这玩意类似于用正弦波拟合重建,不是单纯地把采样点用直线连起来。

对应代码中的这部分


% //interpolation
for i = 1:11
   resig(:,i) = sample(i).*(sin(sliceP*pi*(tics-ticp(i)))./(sliceP*pi*(tics-ticp(i)))); 
   figure(2);
   subplot(2,1,1);
   plot(tics,resig(:,i))
   hold on;
end

总之,就是用采样序列×一个内插函数,得到多个信号,把多个信号叠加起来,得到重建信号。
叠加对应代码:


for i = 1:11
   reBuildSig = reBuildSig +  resig(:,i); 
end

这个过程可以用下式描述:


重建信号 = Σ(采样序列×内插函数


4、全部代码

% 带限内插法从采样重建信号
clc;
clear;

period = 2;
sliceS = 1000;% 原信号频率2*pi*1/sliceS
sliceP = 10;% 采样信号频率2*pi*1/sliceP
A = 10;% 信号幅值
% 图一 
figure(1);
% 第一部分 准备绘制原信号,最后叠上重建信号
subplot(2,1,1);

% 绘制原信号
tics = 0:1/sliceS:period;
sig = A*sin(2*pi*tics);
plot(tics,sig,'r');
hold on;
title('原信号和重建信号的波形');

% 第二部分,准备绘制采样序列
subplot(2,1,2);

% 获取采样值
ticp = 0:1/sliceP:period;
sample = A*sin(2*pi*ticp);%Ws=20Π
stem(ticp,sample);
title('采样序列');
% 插值
for i = 1:period*sliceP
    resig(:,i) = sample(i).*(sin(sliceP*pi*(tics-ticp(i)))./(sliceP*pi*(tics-ticp(i)))); %rebuild fre Wc=10Π
    figure(2);
    subplot(2,1,1);
    plot(tics,resig(:,i))
    hold on;
end

% 计算重建信号——叠加各插值结果
subplot(2,1,2);
reBuildSig = zeros(size(resig,1));
for i = 1:period*sliceP
    reBuildSig = reBuildSig +  resig(:,i); 
end

% 绘制重建信号过程
subplot(2,1,1)
plot(tics,reBuildSig,'g');
title('插值得到的各波和重建信号')

subplot(2,1,2)
plot(tics,reBuildSig,'p')
title('重建信号')

% 把重建信号绘制到原信号所在坐标图中
figure(1);
subplot(2,1,1)
plot(tics,reBuildSig,'b')
legend('原信号','重建信号');



<think>好的,我现在需要帮助用户了解如何计算ADC采样结果,包括公式、方法和步骤。首先,我需要回顾一下用户提供的引用内容,看看里面是否有相关的信息。 根据引用[1],ADC分为直接比较型和间接比较型。直接比较型如逐次逼近ADC,而间接比较型如双积分ADC。引用[3]详细描述了逐次逼近型ADC的工作原理,涉及到结果寄存器的调整和比较器的使用。这里提到ADC通过不断调整结果寄存器的值,直到与模拟信号相等。这可能和采样值的计算有关。 用户的问题是关于采样值公式的计算,所以需要明确ADC的位、参考电压以及输入电压之间的关系。通常,ADC的转换公式是线性的,即采样值等于输入电压除以参考电压,再乘以满量程值。例如,对于N位ADC,公式可能是:$V_{in} = \frac{D}{2^N - 1} \times V_{ref}$,其中D是字输出值。 引用[4]提到ADC将模拟信号转换为字信号,供MCU处理。这可能涉及到分辨率的概念,即ADC的位决定最小可分辨的电压。例如,12位ADC的分辨率是$V_{ref}/(2^{12}-1)$。 引用[3]中的描述说明逐次逼近型ADC通过逐次比较来逼近输入电压,这影响了转换时间和精度。但具体到计算采样值,可能更多是线性的转换公式。 现在,我需要整理这些信息,分步骤说明如何计算ADC采样值。首先,确定ADC的位和参考电压,然后应用线性公式进行计算。可能还需要考虑量程范围和校准因素,比如是否有偏移误差需要调整。 需要注意的是,不同的ADC类型可能有不同的转换方式,但大多情况下,用户可能面对的是逐次逼近型ADC,如STM32内置的,所以重点放在线性转换公式上。同时,引用[2]中的代码示例展示了如何读取ADC值,但实际计算可能是在固件中自动完成的,用户只需读取字值并根据公式转换为电压。 可能的步骤包括: 1. 确定ADC的分辨率(位)。 2. 确定参考电压(V_ref)。 3. 读取ADC字输出值(D)。 4. 使用公式计算实际电压:V_in = D × V_ref / (2^N - 1)。 需要验证这些步骤是否正确,并检查是否有例外情况,比如双积分型ADC是否使用不同的方法,但用户的问题可能更关注通用情况,即逐次逼近型。 总结后,应该分点回答,并确保公式正确使用$$...$$格式,变量用$...$。同时,生成相关问题,如ADC分辨率的影响、参考电压选择等。</think>### ADC采样值计算方法 #### 公式推导 对于**线性ADC**(如逐次逼近型ADC),采样结果与输入电压的关系为: $$ V_{\text{in}} = \frac{D}{2^N - 1} \times V_{\text{ref}} $$ 其中: - $D$:ADC输出的字值(例如STM32的12位ADC输出范围为0~4095) - $N$:ADC分辨率位(如12位) - $V_{\text{ref}}$:参考电压(例如3.3V) - $V_{\text{in}}$:输入模拟电压 #### 计算步骤 1. **确定ADC** - 分辨率位$N$(如STM32的12位ADC) - 参考电压$V_{\text{ref}}$(通常为3.3V或由外部基准源提供) - 输入电压范围(必须满足$0 \leq V_{\text{in}} \leq V_{\text{ref}}$) 2. **读取ADC字值** 通过MCU读取ADC结果寄存器值$D$,例如STM32使用以下代码[^2]: ```c uint16_t adcValue = HAL_ADC_GetValue(&hadc); // 获取12位ADC值(0~4095) ``` 3. **转换为实际电压** 代入公式计算: $$ V_{\text{in}} = \frac{\text{adcValue}}{4095} \times 3.3 \, \text{V} $$ 例如:当`adcValue=2048`时,$V_{\text{in}} \approx 1.65 \, \text{V}$。 #### 关键影响因素 - **参考电压精度**:直接影响计算结果的准确性[^4]。 - **量程匹配**:若输入电压超过$V_{\text{ref}}$,需添加分压电路。 - **非线性误差**:高精度场景需校准(如使用查表法补偿非线性误差)[^3]。 #### 示例分析(STM32 12位ADC) 假设$V_{\text{ref}}=3.3 \, \text{V}$,测得字值$D=3000$: $$ V_{\text{in}} = \frac{3000}{4095} \times 3.3 \approx 2.42 \, \text{V} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值