信号处理趣学D5——利用仿真教你理解周期混叠和采样定理

小虎最近发现了很有意思的采样定理,它是用来解决混叠失真的一个方法,这里小虎就用MATLAB带大家来理解一下这两个概念。

什么是周期混叠和采样定理

混叠失真

对于带限信号 x ( t ) x(t) x(t),如果对信号的采样频率不够大的话,将会出现混叠失真,一旦出现混叠失真,那么采样将不能够完美重构信号。

采样定理

采样定理(Nyqust and Shannon sampling theorem)是指,当采样频率 ω s \omega_s ωs大于等于信号最高频率 ω m a x \omega_{max} ωmax的两倍时,采样后的频谱不会产生混叠失真
ω s ≥ 2 ω m a x \omega_s\ge 2\omega_{max} ωs2ωmax

采样函数

采样周期为 T s T_s Ts,采样函数为 x t ( s ) x_t(s) xt(s),则采样函数的表达式如下。
x t ( s ) = x ( t ) δ T ( t ) = x ( t ) ∑ i = − ∞ ∞ δ ( t − n T s ) x_t(s)=x(t)\delta_T(t)=x(t)\sum_{i=-\infin}^\infin \delta(t-nT_s) xt(s)=x(t)δT(t)=x(t)i=δ(tnTs)
当且仅当 t = n T s t=nT_s t=nTs时,后面一项不等于0。故
x t ( s ) = ∑ i = − ∞ ∞ x ( n T s ) δ ( t − n T s ) x_t(s)=\sum_{i=-\infin}^\infin x(nT_s) \delta(t-nT_s) xt(s)=i=x(nTs)δ(tnTs)
将我们的采样频率 f s f_s fs代入即可求出采样函数。
例如 x t = s i n ( 80 π t ) + 3 ∗ s i n ( 180 π t ) x_t=sin(80\pi t)+3*sin(180\pi t) xt=sin(80πt)+3sin(180πt)的采样函数是 x s = s i n ( 80 π n / f s ) + 3 ∗ s i n ( 180 π n / f s ) ; xs=sin(80\pi n/f_s)+3*sin(180\pi n/f_s); xs=sin(80πn/fs)+3sin(180πn/fs);

错误的采样函数

比如下面这个,不管采样点和采样频率怎么取,采样结果很大程度地偏离了原始信号。采样函数仅存在于模拟仿真,实际采样中,注意的参数是采样频率。
在这里插入图片描述

仿真结果

在这里插入图片描述

物理意义

1.这里的采样点数量总共只有11个,这11个点已经足够描述一个周期的信号,所以对分析结果没有影响。
2. 当采样频率低于 2 ω m a x = 180 H z 2\omega_{max}=180Hz 2ωmax=180Hz时,采样得到的信号与原信号由于混叠失真无法很好构建原信号,而且 ω s \omega_s ωs越小,偏离越严重,可以从上面图1~3看到。原因是采样的间隔太宽了,在这么宽的间隔中已经经过了好几个信号的周期,取得点相对于原信号密度十分低,这样得到一个新的信号规律将是片面的新点连接
3. 当采样频率大于 2 ω m a x = 180 H z 2\omega_{max}=180Hz 2ωmax=180Hz时,可以从上面图4看到,采样得到的点连接后,但是很好的拟合出原始信号。

代码分析

自变量范围-0.1~0.1s。

t=-0.1:0.001:0.1;

画出原始信号。

x_t=sin(2*pi*40*t)+3*sin(2*pi*90*t);
plot(t,x_t);
hold on;

设采样点数量和采样频率。

n=-5:5;
fs=300;

在与原信号同一图幅上画出它的采样函数。

xs=sin(2*pi*40*n/fs)+3*sin(2*pi*90*n/fs);
stem(n/fs,xs,'r--');
plot(n/fs,xs,'r--');
xlabel('t');
ylabel('x_4(t)');
legend('x_4(t)','recovery');

完整代码

t=-0.1:0.001:0.1;
x_t=sin(2*pi*40*t)+3*sin(2*pi*90*t);
plot(t,x_t);
hold on;
n=-5:5;
fs=300;
xs=sin(2*pi*40*n/fs)+3*sin(2*pi*90*n/fs);
stem(n/fs,xs,'r--');
plot(n/fs,xs,'r--');
xlabel('t');
ylabel('x_4(t)');
legend('x_4(t)','recovery');

更多

信号处理趣学D0——系列专栏的说明与目录

posted @   狂小虎  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示