【 MATLAB 】MATLAB 实现模拟信号采样后的重建(一)

举报
李锐博恩 发表于 2021/07/15 06:29:30 2021/07/15
【摘要】 为了让MATLAB数字信号处理的相关博文能够得到一个梳理,我开通了一个专栏:数字信号处理的MATLAB实现 模拟信号经过采样后得到x(n),从x(n)中重建模拟信号在数学上可用公式来描述:              式中, 是一种内插函数。 对于样本之间的内插,MATLAB提供了几种方法...

为了让MATLAB数字信号处理的相关博文能够得到一个梳理,我开通了一个专栏:数字信号处理的MATLAB实现


模拟信号经过采样后得到x(n),从x(n)中重建模拟信号x_a(t)在数学上可用公式来描述:

x_a(t)= \sum_{n = -\infty}^{\infty}x(n)sinc[F_s(t - n T_s)]            

式中,sinc(x)= \frac{sin(\pi x)}{\pi x} 是一种内插函数。

对于样本之间的内插,MATLAB提供了几种方法。产生sinc(x)函数在已知有限个样本数之下可用于实现上式,即:

x_a(t)= \sum_{n = -\infty}^{\infty}x(n)sinc[F_s(t - n T_s)]

如果\left \{ x(n),n_1 \leq n \leq n_2 \right \}已知,并且如果想要在一个很细的栅格(栅格间隔\Delta t)上内插 x_a(t),那么由内插公式,可得:

x_a(m\Delta t)\approx \sum_{n = n_1}^{n_2}x(n)sinc[F_s(m \Delta t - n T_s)],t_1 \leq t \leq t_2

这就能作为一个矩阵向量乘法运算实现,如下给出MATLAB脚本:


  
  1. n = n1:n2;
  2. t = t1:Dt:t2;
  3. Fs = 1/Ts;
  4. nTs = n*Ts;
  5. xa = x * sinc( Fs*(ones(length(n),1)*t - nTs' * ones(1,length(t))));

有的人看到这里一定又懵逼了,对于这种向量化的编程不是太明白,为什么可以写成这样?这也是我关于MATLAB数字信号处理的第一篇博文所强调的:专栏,请查看第一篇博文:向量化编程实践

为了弄清楚上面的这个编程思路是如何的,向量化是如何向量化的,我给出了自己的推导,由于输入公式太过于繁琐,我也没多少时间,所以给出了手稿版本:


我不得不说,上面也提到了模拟信号的时间t用栅格间隔的表示方法是为了用MATLAB来近似画出模拟信号,我是默认你读过了我之前的博文:

【 MATLAB 】使用 MATLAB 实现模拟信号的近似及其连续傅里叶变换

这篇博文中给出了一个案例:

下面给出一个案例:

x_a(t) = e^{-1000\left |t \right |}

使用MATLAB求出并画出它的傅里叶变换。

紧接着下一篇博文,我们又同样使用了这个案例,对这个模拟信号进行了采样,使用不同的采样率采样,观察采样后的信号的DTFT:

【 MATLAB 】模拟信号采样及离散时间傅里叶变换案例分析


这篇博文,我们同样使用上面给出的案例,使用采样样本重建模拟信号,观察不同采样率下重建信号的误差。

模拟信号:

x_a(t) = e^{-1000\left |t \right |}

对该信号使用两种不同的采样频率采样。

a. 在 fs = 5000 对信号进行采样

b. 在 fs = 1000 对信号采样

首先讨论第一种情况:

a. 在 fs = 5000 对信号进行采样

直接给出脚本:


  
  1. clc
  2. clear
  3. close all
  4. % Analog signal
  5. Dt = 0.00005;
  6. t = - 0.005:Dt:0.005;
  7. xa = exp(-1000 * abs(t));
  8. subplot(3,1,1);
  9. plot(1000*t,xa);
  10. title('Analog signal');
  11. xlabel('t in msec');
  12. ylabel('xa');
  13. % Discrete-time signal
  14. Ts = 0.0002;
  15. Fs = 1/Ts;
  16. n = -25:25;
  17. nTs = n*Ts;
  18. x = exp(-1000*abs(nTs));
  19. subplot(3,1,2)
  20. % plot(1000*t,xa);
  21. % hold on
  22. stem(n*Ts*1000,x);
  23. title('Discrete-time signal');
  24. % hold off
  25. % Analog signal reconstruction
  26. xa_r = x * sinc( Fs * ( ones(length(n),1) * t - nTs' * ones(1,length(t) ) ));
  27. subplot(3,1,3);
  28. plot(1000*t,xa_r);
  29. title('Analog signal reconstruction');
  30. xlabel('t in msec');
  31. ylabel('xa after reconstruction');
  32. hold on
  33. stem(n*Ts*1000,x)
  34. hold off
  35. %check
  36. error = max(abs(xa_r - xa ))

且error = 0.0363

重建的和真正的模拟信号之间的最大误差是0.0363,这是由于模拟信号xa(t)不是严格带限产生的,况且还是一个有限的样本数。重复成这个样子,已经很成功了。


b. 在 fs = 1000 对信号采样

这时候采样间隔为1ms,模拟信号x_a(t)的时间范围是[-5,5]ms,也就是10ms,这时候我们可以得到11个采样间隔点,也就是得到的离散信号的范围为[-5:5],下面直接给出MATLAB脚本:


  
  1. clc
  2. clear
  3. close all
  4. % Analog signal
  5. Dt = 0.00005;
  6. t = - 0.005:Dt:0.005;
  7. xa = exp(-1000 * abs(t));
  8. subplot(3,1,1);
  9. plot(1000*t,xa);
  10. title('Analog signal');
  11. xlabel('t in msec');
  12. ylabel('xa');
  13. % Discrete-time signal
  14. Ts = 0.001;
  15. Fs = 1/Ts;
  16. n = -5:5;
  17. nTs = n*Ts;
  18. x = exp(-1000*abs(nTs));
  19. subplot(3,1,2)
  20. % plot(1000*t,xa);
  21. % hold on
  22. stem(n*Ts*1000,x);
  23. title('Discrete-time signal');
  24. % hold off
  25. % Analog signal reconstruction
  26. xa_r = x * sinc( Fs * ( ones(length(n),1) * t - nTs' * ones(1,length(t) ) ));
  27. subplot(3,1,3);
  28. plot(1000*t,xa_r);
  29. title('Analog signal reconstruction');
  30. xlabel('t in msec');
  31. ylabel('xa after reconstruction');
  32. hold on
  33. stem(n*Ts*1000,x)
  34. hold off
  35. %check
  36. error = max(abs(xa_r - xa ))

只是稍微改了几个数据而已。

可见,采样率低了之后,重构的是个嘛呀!

误差:

error =

    0.1852

所有的这些都是频谱混叠导致的。

 

 

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/83415535

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。