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

利用内插从样本重建信号

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

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

1、参考文献


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


原来ADC采样结果是这样用的_第1张图片
这本书专门有一章名为《采样》,感兴趣的可以去温习一下。

2、效果展示


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

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


原来ADC采样结果是这样用的_第2张图片
采样对应代码中的


% 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');

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


原来ADC采样结果是这样用的_第3张图片

对应代码中的


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('原信号','重建信号');



你可能感兴趣的:(从物理定律到编程语言,matlab,信号处理,示波器,信号与系统,数采)