diff --git a/content-zh/filters.rst b/content-zh/filters.rst new file mode 100644 index 0000000..292ccb8 --- /dev/null +++ b/content-zh/filters.rst @@ -0,0 +1,756 @@ +.. _filters-chapter: + +############# +滤波器 +############# + +在本章中,我们将学习使用Python的数字滤波器。我们将介绍滤波器的类型(FIR/IIR和低通/高通/带通/带阻)、滤波器的数字表示方法以及设计方法。最后,我们将介绍脉冲整形,并在 :ref:`pulse-shaping-chapter` 一章中进一步探讨。 + +************************* +滤波器基础知识 +************************* + +滤波器应用于许多学科。例如,图像处理大量使用二维滤波器,此时输入和输出都是图像。你每天早上煮咖啡时可能会用到“滤波器”,它可以过滤掉液体中的固体。在数字信号处理中,滤波器主要用于: + +1. 分离已合并的信号(例如,提取所需的信号) +2. 接收信号后去除多余噪声 +3. 恢复以某种方式失真的信号(例如,音频均衡器就是一种滤波器) + +当然,滤波器还有其他用途,但本章旨在介绍这一概念,而不是解释所有可能用到的过滤器。 + +也许你会认为我们只关心数字滤波器,毕竟本书探讨的是数字信号处理。但实际上很多滤波器都是模拟的,比如我们的SDR中位于接收端模数转换器 (ADC) 之前的那些滤波器。下图并列显示了模拟滤波器的电路原理图和数字滤波算法的流程图。 + +.. image:: ../_images/analog_digital_filter.png + :scale: 70 % + :align: center + :alt: Analog vs digital filters + +在数字信号处理中,输入和输出都是信号,每个滤波器都有一个输入信号和一个输出信号: + +.. tikz:: [font=\sffamily\Large, scale=2] + \definecolor{babyblueeyes}{rgb}{0.36, 0.61, 0.83} + \node [draw, + color=white, + fill=babyblueeyes, + minimum width=4cm, + minimum height=2.4cm + ] (filter) {Filter}; + \draw[<-, very thick] (filter.west) -- ++(-2,0) node[left,align=center]{Input\\(time domain)} ; + \draw[->, very thick] (filter.east) -- ++(2,0) node[right,align=center]{Output\\(time domain)}; + :libs: positioning + :xscale: 80 + +所以,一个滤波器不能输入两个不同的信号,除非先将这两个信号相加或进行其他操作。同样,输出始终是一个信号,即一维数组。 + +滤波器有四种基本类型:低通、高通、带通和带阻。每种类型的滤波器都会改变信号,使其集中在不同的频率范围内。下面的图展示了每种类型的滤波器会怎样滤除信号中的频率,首先展示的是对正频率区间的处理(这更容易理解),然后是对负频率区间的处理。 + +.. image:: ../_images/filter_types.png + :scale: 70 % + :align: center + :alt: Filter types, including low-pass, high-pass, band-pass, and band-stop filtering in the frequency domain + + +.. START OF FILTER TYPES TIKZ +.. raw:: html + +
+ +.. This draw the lowpass filter +.. tikz:: [font=\sffamily\large] + \draw[->, thick] (-5,0) -- (5,0) node[below]{Frequency}; + \draw[->, thick] (0,-0.5) node[below]{0 Hz} -- (0,5) node[left=1cm]{\textbf{Low-Pass}}; + \draw[red, thick, smooth] plot[tension=0.5] coordinates{(-5,0) (-2.5,0.5) (-1.5,3) (1.5,3) (2.5,0.5) (5,0)}; + :xscale: 100 + +.. raw:: html + + | + +.. this draws the highpass filter +.. tikz:: [font=\sffamily\large] + \draw[->, thick] (-5,0) -- (5,0) node[below]{Frequency}; + \draw[->, thick] (0,-0.5) node[below]{0 Hz} -- (0,5) node[left=1cm]{\textbf{High-Pass}}; + \draw[red, thick, smooth] plot[tension=0.5] coordinates{(-5,3) (-2.5,2.5) (-1.5,0.3) (1.5,0.3) (2.5,2.5) (5,3)}; + :xscale: 100 + +.. raw:: html + + |
+ +.. this draws the bandpass filter +.. tikz:: [font=\sffamily\large] + \draw[->, thick] (-5,0) -- (5,0) node[below]{Frequency}; + \draw[->, thick] (0,-0.5) node[below]{0 Hz} -- (0,5) node[left=1cm]{\textbf{Band-Pass}}; + \draw[red, thick, smooth] plot[tension=0.5] coordinates{(-5,0) (-4.5,0.3) (-3.5,3) (-2.5,3) (-1.5,0.3) (1.5, 0.3) (2.5,3) (3.5, 3) (4.5,0.3) (5,0)}; + :xscale: 100 + +.. raw:: html + + | + +.. and finally the bandstop filter +.. tikz:: [font=\sffamily\large] + \draw[->, thick] (-5,0) -- (5,0) node[below]{Frequency}; + \draw[->, thick] (0,-0.5) node[below]{0 Hz} -- (0,5) node[left=1cm]{\textbf{Band-Stop}}; + \draw[red, thick, smooth] plot[tension=0.5] coordinates{(-5,3) (-4.5,2.7) (-3.5,0.3) (-2.5,0.3) (-1.5,2.7) (1.5, 2.7) (2.5,0.3) (3.5, 0.3) (4.5,2.7) (5,3)}; + :xscale: 100 + +.. raw:: html + + |