抗混叠
奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该大于等于模拟信号频谱中最高频率的2倍; fs ≥ 2*fin 或 fin ≤ fs/2
如果不能满足上述采样条件,就会发生混叠,简言之就是,如果输入信号大于fs/2,最终会被认为是fs/2频率内的信号(即小于fs/2的信号);
【举例说明】假设采样频率fs=100,如果输入信号频率fin≤50,例如fin=10,因为满足采样定律,不会发生混叠,如果fin=90或fin=210,则不满足采样定律,会发生混叠;
公式角度理解
假设以fs对信号
c
o
s
(
2
π
f
i
n
t
)
cos(2 \pi f_{in} t)
cos(2πfint)采样,t=n/fs,n=0,1,2,3……,则采样后的信号为
c
o
s
(
2
π
f
i
n
f
s
n
)
cos(2 \pi \frac {f_{in}}{f_s} n)
cos(2πfsfinn)
⓵ 利用cos函数对称性,即
c
o
s
(
x
)
=
c
o
s
(
−
x
)
cos(x)=cos(-x)
cos(x)=cos(−x),则有
c
o
s
(
2
π
f
i
n
f
s
n
)
=
c
o
s
(
2
π
−
f
i
n
f
s
n
)
cos(2 \pi \frac {f_{in}}{f_s} n) = cos(2 \pi \frac {-f_{in}}{f_s} n)
cos(2πfsfinn)=cos(2πfs−finn)
【举例说明】如果fin=10,则也可以等效为fin=-10的信号,如fin=90,也可以等效为fin=-90的信号;(先忽略负频率怎么理解!)
⓶ 利用cos函数周期性,即
c
o
s
(
x
)
=
c
o
s
(
x
+
2
π
)
cos(x)=cos(x+2\pi)
cos(x)=cos(x+2π),则有
c
o
s
(
2
π
f
i
n
f
s
n
)
=
c
o
s
(
2
π
f
i
n
+
f
s
f
s
n
)
=
c
o
s
(
2
π
f
i
n
−
f
s
f
s
n
)
cos(2 \pi \frac {f_{in}}{f_s} n) = cos(2 \pi \frac {{f_{in}+f_s}}{f_s} n) = cos(2 \pi \frac {{f_{in}-f_s}}{f_s} n)
cos(2πfsfinn)=cos(2πfsfin+fsn)=cos(2πfsfin−fsn)
【举例说明】如果fs=100,fin=10,则也可以等效为fin=110或210或-90或-190的信号;
……………………………分割线……………………………
结合以上两点:假设fs=100,如果:
❶fin=10,满足采样定律,无需变换,可以得到真实结果:
c
o
s
(
2
π
10
100
n
)
cos(2 \pi \frac {10} {100} n)
cos(2π10010n);
❷fin=210,不满足采样定律,利用cos函数周期性,
c
o
s
(
2
π
210
100
n
)
=
c
o
s
(
2
π
210
−
100
100
n
)
=
c
o
s
(
2
π
210
−
100
−
100
100
n
)
=
c
o
s
(
2
π
10
100
n
)
cos(2 \pi \frac {210} {100} n)=cos(2 \pi \frac {210-100} {100} n)=cos(2 \pi \frac {210-100-100} {100} n)=cos(2 \pi \frac {10} {100} n)
cos(2π100210n)=cos(2π100210−100n)=cos(2π100210−100−100n)=cos(2π10010n),也就是说,这个fin=210的信号会被最终误认为是fin=10的信号;
❸fin=90,不满足采样定律,利用cos函数对称性+周期性,
c
o
s
(
2
π
90
100
n
)
=
c
o
s
(
2
π
−
90
100
n
)
=
c
o
s
(
2
π
−
90
+
100
n
)
=
c
o
s
(
2
π
10
100
n
)
cos(2 \pi \frac {90} {100} n)=cos(2 \pi \frac {-90} {100} n)=cos(2 \pi \frac {-90+100} n)=cos(2 \pi \frac {10} {100} n)
cos(2π10090n)=cos(2π100−90n)=cos(2πn−90+100)=cos(2π10010n) ,这个fin=90的信号会被最终误认为是fin=10的信号;
详见下面仿真结果;
源代码
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号
Fs = 100; # sampling rate 采样频率=100
Ts = 1/Fs; # sampling interval 采样间隔
ff = 10; # 输入信号1,频率=10,小于1/2采样频率
t0 = np.arange(0,0.2,Ts/5)
y0 = np.sin(2*np.pi*ff*t0)
t1 = np.arange(0,0.2,Ts)
y1 = np.sin(2*np.pi*ff*t1)
ff2 = 210; # 输入信号2,频率=210,大于1/2采样频率
t2 = np.arange(0,0.2,Ts/100)
y2 = np.sin(2*np.pi*ff2*t2)
t3 = np.arange(0,0.2,Ts)
y3 = np.sin(2*np.pi*ff2*t3)
ff3 = 90; # 输入信号3,频率=90,大于1/2采样频率
t4 = np.arange(0,0.2,Ts/10)
y4 = np.sin(2*np.pi*ff3*t4)
t5 = np.arange(0,0.2,Ts)
y5 = np.sin(2*np.pi*ff3*t5)
plt.close()
plt.subplot(311)
plt.plot(t0*100,y0,'ob:',t1*100,y1,'or:')
plt.title('输入频率为10,小于fs/2=50,没有混叠')
plt.subplot(312)
plt.plot(t2*100,y2,'ob:',t3*100,y3,'or:')
plt.title('输入频率为210,大于fs/2=50,发生混叠')
plt.subplot(313)
plt.plot(t4*100,y4,'ob:',t5*100,y5,'or:')
plt.title('输入频率为90,大于fs/2=50,发生混叠')
plt.show()
仿真结果
【说明】蓝色是原始信号波形,红色是采样得到波形,因为下面两个输入信号大于fs/2,不满足采样定律,采样最终得到的波形效果等同于fin=10的信号,这时我们无法区别原始信号到底是fin=10还是fin=90或fin=210;
总结
因为混叠的存在,高于fs/2会被误认为是带内即fs/2内的信号,所以在输入信号那里如果加一个低通滤波器,滤除掉大于fs/2的信号,则消除这种影响,所以在很多仪表的输入端都会有一个低通滤波器(如下面频谱仪的原理图);
扩展
输入信号大于fs/2的这种情况,是一种欠采样,合理利用也有其优点,具体参考如下文章:滤波器基础:抗混叠