要做一个示波器,或者用上位机显示信号波形,都要面临一个问题——信号重建。
本文将用MATLAB模拟采样-重建这一过程。文末有全部代码。
理解AD\DA的工作原理并不困难,如何把数据采集器获取的电压序列显示在屏幕上才是真正让大伙恼火的问题。这个时候,《信号与系统》这本书就很值得再翻一翻了。
下图第一栏是原信号波形(红色)和重建信号波形(蓝色)的对比图。可以看到曲线基本一致,重建信号完整地显示出原信号在采样区间上的变化趋势和幅值等特征。
第二栏是采样序列(类似冲击串采样),一个周期内采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')
用到的方法叫带限内插(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
这个过程可以用下式描述:
重建信号
= Σ(采样序列
×内插函数
)
% 带限内插法从采样重建信号
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('原信号','重建信号');