【 MATLAB 】MATLAB 实现模拟信号采样后的重建(一)
为了让MATLAB数字信号处理的相关博文能够得到一个梳理,我开通了一个专栏:数字信号处理的MATLAB实现
模拟信号经过采样后得到x(n),从x(n)中重建模拟信号在数学上可用公式来描述:
式中, 是一种内插函数。
对于样本之间的内插,MATLAB提供了几种方法。产生sinc(x)函数在已知有限个样本数之下可用于实现上式,即:
如果已知,并且如果想要在一个很细的栅格(栅格间隔)上内插 ,那么由内插公式,可得:
这就能作为一个矩阵向量乘法运算实现,如下给出MATLAB脚本:
-
-
n = n1:n2;
-
t = t1:Dt:t2;
-
Fs = 1/Ts;
-
nTs = n*Ts;
-
xa = x * sinc( Fs*(ones(length(n),1)*t - nTs' * ones(1,length(t))));
有的人看到这里一定又懵逼了,对于这种向量化的编程不是太明白,为什么可以写成这样?这也是我关于MATLAB数字信号处理的第一篇博文所强调的:专栏,请查看第一篇博文:向量化编程实践
为了弄清楚上面的这个编程思路是如何的,向量化是如何向量化的,我给出了自己的推导,由于输入公式太过于繁琐,我也没多少时间,所以给出了手稿版本:
我不得不说,上面也提到了模拟信号的时间t用栅格间隔的表示方法是为了用MATLAB来近似画出模拟信号,我是默认你读过了我之前的博文:
【 MATLAB 】使用 MATLAB 实现模拟信号的近似及其连续傅里叶变换
这篇博文中给出了一个案例:
下面给出一个案例:
设
使用MATLAB求出并画出它的傅里叶变换。
紧接着下一篇博文,我们又同样使用了这个案例,对这个模拟信号进行了采样,使用不同的采样率采样,观察采样后的信号的DTFT:
【 MATLAB 】模拟信号采样及离散时间傅里叶变换案例分析
这篇博文,我们同样使用上面给出的案例,使用采样样本重建模拟信号,观察不同采样率下重建信号的误差。
模拟信号:
对该信号使用两种不同的采样频率采样。
a. 在 fs = 5000 对信号进行采样
b. 在 fs = 1000 对信号采样
首先讨论第一种情况:
a. 在 fs = 5000 对信号进行采样
直接给出脚本:
-
clc
-
clear
-
close all
-
-
% Analog signal
-
Dt = 0.00005;
-
t = - 0.005:Dt:0.005;
-
xa = exp(-1000 * abs(t));
-
-
subplot(3,1,1);
-
plot(1000*t,xa);
-
title('Analog signal');
-
xlabel('t in msec');
-
ylabel('xa');
-
-
% Discrete-time signal
-
Ts = 0.0002;
-
Fs = 1/Ts;
-
n = -25:25;
-
nTs = n*Ts;
-
x = exp(-1000*abs(nTs));
-
-
subplot(3,1,2)
-
% plot(1000*t,xa);
-
% hold on
-
stem(n*Ts*1000,x);
-
title('Discrete-time signal');
-
% hold off
-
-
% Analog signal reconstruction
-
xa_r = x * sinc( Fs * ( ones(length(n),1) * t - nTs' * ones(1,length(t) ) ));
-
-
subplot(3,1,3);
-
plot(1000*t,xa_r);
-
title('Analog signal reconstruction');
-
xlabel('t in msec');
-
ylabel('xa after reconstruction');
-
hold on
-
stem(n*Ts*1000,x)
-
hold off
-
%check
-
error = max(abs(xa_r - xa ))
-
-
且error = 0.0363
重建的和真正的模拟信号之间的最大误差是0.0363,这是由于模拟信号xa(t)不是严格带限产生的,况且还是一个有限的样本数。重复成这个样子,已经很成功了。
b. 在 fs = 1000 对信号采样
这时候采样间隔为1ms,模拟信号的时间范围是[-5,5]ms,也就是10ms,这时候我们可以得到11个采样间隔点,也就是得到的离散信号的范围为[-5:5],下面直接给出MATLAB脚本:
-
clc
-
clear
-
close all
-
-
% Analog signal
-
Dt = 0.00005;
-
t = - 0.005:Dt:0.005;
-
xa = exp(-1000 * abs(t));
-
-
subplot(3,1,1);
-
plot(1000*t,xa);
-
title('Analog signal');
-
xlabel('t in msec');
-
ylabel('xa');
-
-
% Discrete-time signal
-
Ts = 0.001;
-
Fs = 1/Ts;
-
n = -5:5;
-
nTs = n*Ts;
-
x = exp(-1000*abs(nTs));
-
-
subplot(3,1,2)
-
% plot(1000*t,xa);
-
% hold on
-
stem(n*Ts*1000,x);
-
title('Discrete-time signal');
-
% hold off
-
-
% Analog signal reconstruction
-
xa_r = x * sinc( Fs * ( ones(length(n),1) * t - nTs' * ones(1,length(t) ) ));
-
-
subplot(3,1,3);
-
plot(1000*t,xa_r);
-
title('Analog signal reconstruction');
-
xlabel('t in msec');
-
ylabel('xa after reconstruction');
-
hold on
-
stem(n*Ts*1000,x)
-
hold off
-
%check
-
error = max(abs(xa_r - xa ))
-
-
只是稍微改了几个数据而已。
可见,采样率低了之后,重构的是个嘛呀!
误差:
error =
0.1852
所有的这些都是频谱混叠导致的。
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/83415535
- 点赞
- 收藏
- 关注作者
评论(0)