LLRFLibsPy库中design_notch_filter函数解读

source code: Github

函数 design_notch_filter 用于设计一个陷波滤波器(notch filter)并返回离散滤波器的状态空间。下面是函数的详细解释:

函数参数

  • fnotch: 频率(以赫兹为单位),要被滤除的频率,即陷波(不通过)的中心频率。
  • Q: 陷波滤波器的质量因数,描述了滤波器中心频率的选择性。Q 值越高,滤波器的带宽越窄。
  • fs: 采样频率(以赫兹为单位),信号的采样频率。

函数返回值

  • status: 布尔值,标记滤波器设计是否成功 True 或失败 False
  • Ad, Bd, Cd, Dd: numpy 矩阵,滤波器的离散状态空间表示。它们分别代表状态矩阵 A,输入矩阵 B,输出矩阵 C 和直接传递矩阵 D

函数逻辑

  1. 输入参数检查

    • 检查 fnotchQfs 是否为正值。如果任一参数不符合要求,则返回 False 以及四个 None
  2. 创建陷波滤波器

    • 使用 scipy.signal.iirnotch 函数创建陷波滤波器系数 ba。这个函数会根据给定的中心频率 fnotch 和质量因数 Q 生成滤波器系数。
    • 使用 scipy.signal.dlti 函数将滤波器转换为离散时间线性时不变系统对象 dsys,其中 dt1.0/fs
    • dsys 转换为状态空间表示。dsysdlti 类型,但通过 signal.StateSpace 函数将其转换为状态空间表示,获得状态矩阵 A、输入矩阵 B、输出矩阵 C 和直接传递矩阵 D
  3. 返回值

    • 返回 True 表明滤波器设计成功,同时返回状态矩阵 Ad、输入矩阵 Bd、输出矩阵 Cd 和直接传递矩阵 Dd

总之,这个函数用于设计一个指定中心频率的陷波滤波器,并返回其状态空间表示以便进一步使用。

示例

下面是一个使用该函数 design_notch_filter 的示例。这个示例将设计一个陷波滤波器,并打印出滤波器的状态空间矩阵。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import scipy.signal as signal

def design_notch_filter(fnotch, Q, fs):
'''
Design the notch filter (return a discrete filter).

Parameters:
fnotch: float, frequency to be notched, Hz
Q: float, quality factor of the notch filter
fs: float, sampling frequency, Hz

Returns:
status: boolean, success (True) or fail (False)
Ad, Bd, Cd, Dd: numpy matrix, discrete notch filter
'''
# check the input
if (fnotch <= 0.0) or (Q <= 0.0) or (fs <= 0.0):
return (False,) + (None,)*4

# create the notch filter
b, a = signal.iirnotch(fnotch, Q, fs)
dsys = signal.dlti(b, a, dt = 1.0/fs)
dsys = signal.StateSpace(dsys)
Ad, Bd, Cd, Dd, dt = dsys.A, dsys.B, dsys.C, dsys.D

# filter the data
return True, Ad, Bd, Cd, Dd

# 示例参数
fnotch = 60.0 # 陷波频率 (Hz)
Q = 30.0 # 质量因数
fs = 1000.0 # 采样频率 (Hz)

# 设计陷波滤波器
status, Ad, Bd, Cd, Dd = design_notch_filter(fnotch, Q, fs)

# 打印结果
if status:
print("设计成功!")
print("Ad 矩阵:")
print(Ad)
print("Bd 矩阵:")
print(Bd)
print("Cd 矩阵:")
print(Cd)
print("Dd 矩阵:")
print(Dd)
else:
print("设计失败.")

在上述例子中,我们设计了一个陷波频率为 60 Hz(通常是电源频率噪声)、质量因数为 30、采样频率为 1000 Hz 的陷波滤波器。程序运行后将输出设计后的状态空间矩阵 AdBdCdDd

运行后,你应该能看到类似于如下的输出:

1
2
3
4
5
6
7
8
9
10
11
设计成功!
Ad 矩阵:
[[ 1.84794186 -0.98751193]
[ 1. 0. ]]
Bd 矩阵:
[[1.]
[0.]]
Cd 矩阵:
[[-0.01153861 0.01241009]]
Dd 矩阵:
[[0.99375596]]

这表示你成功设计了一个离散的陷波滤波器,如有问题请确保你已经导入必要的库,例如 numpyscipy.signal