【摘要】
- 使用Python进行信号处理
- 参考书目:《数字信号处理——原理、算法与应用》第四版
- 这是一个笔记,不一定全面
- 本文主题:数字信号基本知识
目录
- 1. 信号的数学表达
- 1.1 连续时间正弦信号
- 1.2 离散时间正弦信号
- 2. 复指数信号与谐波
- 2.1 连续时间复指数信号
- 2.2 离散时间复指数信号
- 3. 采样、模数/数模转换
- 3.1 采样频率与信号频率之间的关系
- 3.2 采样定理
- 4. 实验代码
- 4.1 软件包
- 4.2 代码
1. 信号的数学表达 1.1 连续时间正弦信号
图1 模拟正弦信号及其参数
给定一个连续信号
x
a
(
t
)
=
A
cos
(
Ω
t
+
θ
)
x_a(t)=Atext{cos}(Omega t+theta)
xa(t)=Acos(Ωt+θ)它由三个参数完全表征:幅度
A
A
A、频率
Ω
Omega
Ω、相位
θ
theta
θ,而下标
a
a
a表示模拟信号。其中,
Ω
=
2
π
F
Omega=2pi F
Ω=2πF
F
F
F为正弦函数周期的倒数(周期/秒),
F
=
1
/
T
p
F=1/{T_p}
F=1/Tp,
T
p
{T_p}
Tp为基本周期,如图1所示。此时有,
x
a
(
t
)
=
A
cos
(
2
π
F
t
+
θ
)
x_a(t)=Atext{cos}(2pi Ft+theta)
xa(t)=Acos(2πFt+θ)
利用欧拉恒等式(
j
=
−
1
j=sqrt{-1}
j=−1
)
e
±
j
ϕ
=
cos
(
ϕ
)
±
j
sin
(
ϕ
)
e^{pm jphi}=text{cos}(phi)pm jtext{sin}(phi)
e±jϕ=cos(ϕ)±jsin(ϕ)
得到信号的复指数形式
x
a
(
t
)
=
A
2
e
j
(
Ω
t
+
θ
)
+
A
2
e
−
j
(
Ω
t
+
θ
)
x_a(t)=frac{A}{2}e^{j(Omega t+theta)}+frac{A}{2}e^{-j(Omega t+theta)}
xa(t)=2Aej(Ωt+θ)+2Ae−j(Ωt+θ)
离散时间正弦信号 注意:这里的频率
ω
omega
ω是弧度/样本(rad/sample),而
θ
theta
θ的单位是弧度(rad)。 定义 图2显示了频率
ω
=
π
/
6
rad
/
s
omega=pi/6 text{rad}/s
ω=π/6rad/s(f=1/12周期/样本),相位
θ
=
π
/
3
theta=pi/3
θ=π/3的正弦信号。 离散时间信号特点: 从图3可以看出,随着频率的增加,信号震荡逐渐加快。但是频率
ω
=
π
omega=pi
ω=π时,震荡不在增加,此时
f
=
1
/
2
f=1/2
f=1/2,即每两个相邻样本之间经历半个周期。 与频率
Ω
0
Omega_0
Ω0相关的连续时间谐波指数信号可以记为 设离散周期复指数序列的周期为
N
N
N,则频率为
f
0
=
1
/
N
f_0=1/N
f0=1/N,谐波相关复指数为 模数转换(A/D): 数模转换(D/A): 设模拟信号的频率为
F
F
F(或
Ω
Omega
Ω),考虑正弦形式 采样定理:如果包含在某个模拟信号中
x
a
(
t
)
x_a(t)
xa(t)中的最高频率是
F
max
=
B
F_{text{max}}=B
Fmax=B,而信号以采样速率
F
s
>
2
F
max
=
2
B
F_s>2F_text{max}=2B
Fs>2Fmax=2B采样,那么
x
a
(
t
)
x_a(t)
xa(t)可以从样本值准确恢复,插值函数为sinc函数:
x
(
n
)
=
A
cos
(
ω
n
+
θ
)
,
−
∞
<
n
<
∞
x(n)=Atext{cos}(omega n+theta),quad -infty
ω
=
2
π
f
omega=2pi f
ω=2πf
则信号表示为
x
(
n
)
=
A
cos
(
2
π
f
n
+
θ
)
,
−
∞
<
n
<
∞
x(n)=Atext{cos}(2pi f n+theta),quad -infty
频率能不能更快呢?不行。离散信号本质上都是对连续信号采样的结果,根据奈奎斯特采样定理,采样频率至少为信号频率的2倍才能恢复信号。很明显,一个正弦波周期内,至少要两个点才能确定其周期大小。
s
k
(
t
)
=
e
j
k
Ω
0
t
=
e
j
2
π
k
F
0
t
,
k
=
±
1
,
±
2
,
⋯
s_k(t)=e^{jk Omega_0 t}=e^{j2pi k F_0 t},quad k=pm 1,pm 2,cdots
sk(t)=ejkΩ0t=ej2πkF0t,k=±1,±2,⋯
其基本周期为
1
/
(
k
F
0
)
=
T
p
/
k
1/(kF_0)=Tp/k
1/(kF0)=Tp/k,基本频率为
k
F
0
kF_0
kF0。构造谐波相关的复指数信号的线性组合
x
a
(
t
)
=
∑
−
∞
∞
c
k
s
k
(
t
)
=
∑
−
∞
∞
c
k
e
j
k
Ω
0
t
x_a(t)=sum_{-infty}^{infty}c_ks_k(t)=sum_{-infty}^{infty}c_ke^{jk Omega_0 t}
xa(t)=−∞∑∞cksk(t)=−∞∑∞ckejkΩ0t
其中
c
k
c_k
ck是任意复常数。上式为信号
x
a
(
t
)
x_a(t)
xa(t)的傅里叶级数展开,信号
s
k
(
t
)
s_k(t)
sk(t)称为第
k
k
k次谐波。
s
k
(
n
)
=
e
j
2
π
k
f
0
n
,
k
=
±
1
,
±
2
,
⋯
s_k(n)=e^{j2pi kf_0n },quad k=pm 1,pm 2,cdots
sk(n)=ej2πkf0n,k=±1,±2,⋯
基本周期为
N
N
N的信号
x
(
n
)
x(n)
x(n)可以表示成傅里叶级数的形式
x
(
n
)
=
∑
k
=
0
N
−
1
c
k
s
k
(
n
)
=
∑
k
=
0
N
−
1
c
k
e
j
2
π
k
n
/
N
x(n)=sum_{k=0}^{N-1}c_ks_k(n)=sum_{k=0}^{N-1}c_ke^{j2pi kn/N}
x(n)=k=0∑N−1cksk(n)=k=0∑N−1ckej2πkn/N
其中,复常数
{
c
k
}
{c_k}
{ck}为傅里叶系数。
举一个简单的例子:零阶保持数模转换
3.1 采样频率与信号频率之间的关系
x
a
(
t
)
=
A
cos
(
2
π
F
t
+
θ
)
x_a(t)=Atext{cos}(2pi Ft+theta)
xa(t)=Acos(2πFt+θ)
采样(
t
=
n
T
t=nT
t=nT)后为
x
(
n
T
)
=
A
cos
(
2
π
F
n
T
+
θ
)
=
A
cos
(
2
π
F
n
F
s
+
θ
)
x(nT)=Atext{cos}(2pi FnT+theta)=Atext{cos}(frac{2pi Fn}{F_s}+theta)
x(nT)=Acos(2πFnT+θ)=Acos(Fs2πFn+θ)
因此
3.2 采样定理
连续时间 离散时间信号
Ω
=
2
π
F
Omega=2pi F
Ω=2πF,弧度/秒,Hz
ω
=
2
π
f
omega=2pi f
ω=2πf,弧度/样本,周期数/样本
{}
f
=
F
/
F
s
f=F/F_s
f=F/Fs
{}
ω
=
Ω
T
omega=Omega T
ω=ΩT
{}
−
π
≤
ω
≤
π
-pi le omega le pi
−π≤ω≤π
{}
−
1
2
≤
f
≤
1
2
-frac{1}{2} le fle frac{1}{2}
−21≤f≤21
−
∞
≤
Ω
≤
∞
-infty le Omegale infty
−∞≤Ω≤∞
−
π
T
≤
Ω
≤
π
T
-frac{pi}{T} le Omegale frac{pi}{T}
−Tπ≤Ω≤Tπ
−
∞
≤
F
≤
∞
-infty le Fle infty
−∞≤F≤∞
−
F
s
2
≤
ω
≤
F
s
2
-frac{F_s}{2} le omegale frac{F_s}{2}
−2Fs≤ω≤2Fs
g
(
t
)
=
sin
(
2
π
B
t
)
2
π
B
t
g(t)=frac{text{sin}(2pi Bt)}{2pi Bt}
g(t)=2πBtsin(2πBt)
而
x
a
(
t
)
x_a(t)
xa(t)可以表示为
x
a
(
t
)
=
∑
n
=
−
∞
∞
x
a
(
n
F
s
)
g
(
t
−
n
F
s
)
x_a(t)=sum_{n=-infty}^{infty}x_aleft(frac{n}{F_s}right)gleft(t-frac{n}{F_s}right)
xa(t)=n=−∞∑∞xa(Fsn)g(t−Fsn)
其中
x
a
(
n
/
F
s
)
=
x
a
(
n
T
)
=
x
(
n
)
x_a(n/F_s)=x_a(nT)=x(n)
xa(n/Fs)=xa(nT)=x(n)是
x
a
(
t
)
x_a(t)
xa(t)的样本。 采样频率
F
N
=
2
B
=
2
F
max
F_N=2B=2F_text{max}
FN=2B=2Fmax称为奈奎斯特频率。
4. 实验代码
4.1 软件包
4.2 代码
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 10))
a1 = plt.subplot2grid((3, 2), (0, 0), colspan=2)
a2 = plt.subplot2grid((3, 2), (1, 0))
a3 = plt.subplot2grid((3, 2), (1, 1))
a4 = plt.subplot2grid((3, 2), (2, 0))
a5 = plt.subplot2grid((3, 2), (2, 1))
ax = [a1, a2, a3, a4, a5]
n = np.linspace(-15, 15, 31) # 信号样点
f = np.array([0, 1 / 16., 1 / 8., 1 / 4., -1 / 4.]) # 每个样点的基本周期
w = 2 * np.pi * f # 角频率
for i in range(len(w)):
y = np.cos(w[i] * n) # 不同频率的信号
ax[i].stem(n, y) # 画图
ax[i].set_ylabel('$omega=$' + str(f[i] * 2) + '$pi$')
plt.show()
plt.figure(figsize=(10, 5.5))
t = np.linspace(-5, 5, 501)
sinc = np.sin(2 * np.pi * t) / (2 * np.pi * t)
plt.plot(t, sinc, 'b', linewidth=3)
plt.xlabel('time($s$)', fontsize=20)
plt.ylabel("$g(t)$", fontsize=20)
plt.text(1, 0.4, r'$ g(t)=dfrac{sin(2pi t)}{2pi t}} $', fontsize=20)
plt.grid(True)
plt.tight_layout()
plt.show()



