Skip to content

Commit

Permalink
Merge pull request #54 from sonnyhcl/master
Browse files Browse the repository at this point in the history
v1.0
  • Loading branch information
xupsh authored Aug 2, 2018
2 parents cda560a + 2466ffc commit f6b21d9
Show file tree
Hide file tree
Showing 9 changed files with 103 additions and 61 deletions.
2 changes: 1 addition & 1 deletion 02-Finite-Impulse-Response-Filters.md
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ width是1到1024^1^ 之间的整数。例如,ap_int<8>是一个8位有符号

$$ (I_{in}+ j Q_{in})(I_{fir} + j Q_{fir}) = (I_{in} I_{fir} Q_{in} Q_{fir}) + j (Q_{in} I_{fir} + I_{in}Q_{fir}) \quad(2.4)$$

​方程2.4显示了复数FIR滤波器的一个系数与输入复数数据的乘法。方程右侧显示复数FIR滤波器输出实数部分是$ I_{in}I_{fir} - Q_{in}Q_{fir} $,和虚数部分为$ Q_{in}I_{fir} + I_{in}Q_{fir} $。这意味着我们可以将复数FIR过滤器运算拆分为四个实数滤波器,如图2.9所示。
​方程2.4显示了复数FIR滤波器的一个系数与输入复数数据的乘法。方程右侧显示复数FIR滤波器输出实数部分是$$ I_{in}I_{fir} - Q_{in}Q_{fir} $$,和虚数部分为$$ Q_{in}I_{fir} + I_{in}Q_{fir} $$。这意味着我们可以将复数FIR过滤器运算拆分为四个实数滤波器,如图2.9所示。

![complex_fir](/images/complex_fir.jpg)

Expand Down
4 changes: 2 additions & 2 deletions 03-CORDIC.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
\theta# 第三章 CORDIC
# 第三章 CORDIC

## 3.1 概述

Expand Down Expand Up @@ -42,7 +42,7 @@ $$
​ 用矩阵向量的形式 表示

$$
\begin{bmatrix}1 & -1 \\ 1 & 1 \\\end{bmatrix}\begin{bmatrix}x \\ y \\\end{bmatrix}= \begin{bmatrix}x - y \\x + y \\\end{bmatrix} \quad(3.16)
\begin{bmatrix}1 & -1 \\ 1 & 1 \\\end{bmatrix}\begin{bmatrix}x \\ y \\\end{bmatrix}= \begin{bmatrix}x - y \\x + y \end{bmatrix} \quad(3.16)
$$

​ 这个很容易计算,而且不需要任何“困难”的乘法。但这次运算结果是什么呢?结果证明这次运算实现了完美的45度旋转;现在,我们得到了一个高效方式来实现一次45度旋转。但是,这个变换也把矢量以$$\sqrt{2}$$进行了量化。这个矩阵行列式的平方根表明变换量化矢量的大小,即,矢量长度是如何变化的。这里矩阵行列式为1 * 1−(−1) * 1 = 2。因此,这个操作实现角度旋转45度和尺度变化$$\sqrt{2}$$倍。这是CORDIC运算进行的折中;我们可以使旋转运算变得容易,但它的副作用是缩放矢量的长度。根据应用场景不同,这不一定是个问题。但是现在,我们暂时不考虑缩放问题,集中讨论如何推广高效旋转操作。
Expand Down
71 changes: 55 additions & 16 deletions 05-Fast-Fourier-Transform.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,97 +17,110 @@
FFT算法利用DFT计算中的对称性来降低算法的复杂度。为了更好地理解这个问题,让我们首先关注一下DFT算法中的研究点,以2点DFT为例。DFT背景介绍执行一个矩阵向量乘法计算$$G[] = S[][] \cdot g[]$$,其中$$g[]$$是输入向量,$$G[]$$是频域的输出数据,$$S[][]$$DFT参数。我们遵循第4.2章中所述相同的系数矩阵记法以及的输入和输出向量。

对于一个两个样本点的DFT,矩阵S的值为:

$$
S =
\begin{bmatrix}
W^{0 0}_2 & W^{0 1}_2 \\
W^{1 0}_2 & W^{1 1}_2 \\
W^{1 0}_2 & W^{1 1}_2
\end{bmatrix}\quad(5.1)
$$

这里我们使用$$W = e^{-j 2 \pi}$$的概念,其中W的上标表示添加到分子中的值,W的下标表示在复指数的分母值。举个例子,$$W^{2 3}_4 = e^{\frac{-j 2 \pi \cdot 2 \cdot 3}{4}}$$。这和4.2节中讨论的DFT中s的值一样,其中$$s = e^{\frac{-j 2 \pi}{N}}$$,s和W之间的关系为$$s = W_N$$

{% hint style='tip' %}
$$e^{-j 2 \pi}$$ 或者$$W$$经常被称作*旋转因子*,这个术语起源于1966年Gentleman和Sande的论文[27]
{% endhint %}

$$e^{-j 2 \pi}$$ 或者 $$W $$经常被称作*旋转因子*,这个术语起源于1966年Gentleman和Sande的论文[27]


$$
\begin{bmatrix}
G[0] \\
G[1] \\
G[1]
\end{bmatrix} =
\begin{bmatrix}
W^{0 0}_2 & W^{0 1}_2 \\
W^{1 0}_2 & W^{1 1}_2 \\
W^{1 0}_2 & W^{1 1}_2
\end{bmatrix}
\cdot
\begin{bmatrix}
g[0] \\
g[1]\\
g[1]
\end{bmatrix}\quad(5.2)
$$

把这两个等式拓展到2点DFT则有:

$$
\begin{array} {lll}
G[0] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 0 \cdot 0}{2}} + g[1] \cdot e^{\frac{-j 2 \pi \cdot 0 \cdot 1}{2}} \\
& = & g[0] + g[1] \\
& = & g[0] + g[1]
\end{array}\quad(5.3)
$$

由于$$e^{0} = 1$$,所以其中的第二个频率项为:

$$
\begin{array} {lll}
G[1] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 0}{2}} + g[1] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 1}{2}} \\
& = & g[0] - g[1] \\
\end{array}\quad(5.4)
$$

其中$$e^{\frac{-j 2 \pi \cdot 1 \cdot 1}{2}} = e^{-j \pi } = -1$$

图5.1为这个计算提供了两种不同的表示方法。a)部分是2点DFT的数据流图。这是我们熟悉的本书的一种习惯的表达方法。b)部分展示了用于相同计算的蝶形结构。这是数字信号处理中使用的典型结构,特别是用于表示FFT中的计算。

蝴蝶结构是一种更紧凑的表示形式,可用于表示大型数据流图。当两条线合在一起时,这表示一个加法操作。箭头线上的任何标签都表示该标签乘以该线上的值。该图中有两个标签:底部水平线上的'-'标志表示该值应该被否定。此后加上由相交的两条线表示的加法与减法相同。第二个标签是 $$W^0_2$$。虽然这是乘法是不必要的(因为 $$W^0_2$$ = 1,这意味着它乘以值'1'),但是把它表示出来是因为它在多样本点的FFT计算中很常见。

现在让我们考虑一个稍微大一点的DFT——4点DFT,有4个输入、4个输出以及一$$4 * 4$$的S矩阵如式5.5所示:

$$
S=
\begin{bmatrix}
W^{0 0}_4 & W^{0 1}_4 & W^{0 2}_4 & W^{0 3}_4 \\
W^{1 0}_4 & W^{1 1}_4 & W^{1 2}_4 & W^{1 3}_4 \\
W^{2 0}_4 & W^{2 1}_4 & W^{2 2}_4 & W^{2 3}_4 \\
W^{3 0}_4 & W^{3 1}_4 & W^{3 2}_4 & W^{3 3}_4 \\
W^{3 0}_4 & W^{3 1}_4 & W^{3 2}_4 & W^{3 3}_4
\end{bmatrix}\quad(5.5)
$$

![图5.1 a)部分是2点DFT/FFT的数据流图。 b)部分显示了该运算的蝴蝶结构。它是数字信号处理领域中计算FFT的常见表示方法。](images/2pointFFT.jpg)

用于计算频率输出项的DFT方程为:

$$
\begin{bmatrix}
G[0] \\
G[1] \\
G[2] \\
G[3] \\
G[3]
\end{bmatrix} =
\begin{bmatrix}
W^{0 0}_4 & W^{0 1}_4 & W^{0 2}_4 & W^{0 3}_4 \\
W^{1 0}_4 & W^{1 1}_4 & W^{1 2}_4 & W^{1 3}_4 \\
W^{2 0}_4 & W^{2 1}_4 & W^{2 2}_4 & W^{2 3}_4 \\
W^{3 0}_4 & W^{3 1}_4 & W^{3 2}_4 & W^{3 3}_4 \\
W^{3 0}_4 & W^{3 1}_4 & W^{3 2}_4 & W^{3 3}_4
\end{bmatrix}
\cdot
\begin{bmatrix}
g[0] \\
g[1]\\
g[2]\\
g[3]\\
g[3]
\end{bmatrix}\quad(5.6)
$$

现在我们逐个写出G[]中每个频域值的方程。G[0]的方程为:

$$
\begin{array} {lll}
G[0] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 0 \cdot 0}{4}} + g[1] \cdot e^{\frac{-j 2 \pi \cdot 0 \cdot 1}{4}} + g[2] \cdot e^{\frac{-j 2 \pi \cdot 0 \cdot 2}{4}} + g[3] \cdot e^{\frac{-j 2 \pi \cdot 0 \cdot 3}{4}}\\
& = & g[0] + g[1] + g[2] + g[3] \\
\end{array}\quad(5.7)
$$

G[1]的方程为:

$$
\begin{array} {lll}
G[1] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 0}{4}} + g[1] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 1}{4}} + g[2] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 2}{4}} + g[3] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 3}{4}}\\
Expand All @@ -116,50 +129,58 @@ G[1] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 1 \cdot 0}{4}} + g[1] \cdot e^{\fr
& = & g[0] + g[1] \cdot e^{\frac{-j 2 \pi}{4}} - g[2] - g[3] \cdot e^{\frac{-j 2 \pi}{4}}\\
\end{array}\quad(5.8)
$$

其中方程简化的依据是$$e^{-j \pi} = -1$$.

G[2]的方程为:

$$
\begin{array} {lll}
G[2] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 2 \cdot 0}{4}} + g[1] \cdot e^{\frac{-j 2 \pi \cdot 2 \cdot 1}{4}} + g[2] \cdot e^{\frac{-j 2 \pi \cdot 2 \cdot 2}{4}} + g[3] \cdot e^{\frac{-j 2 \pi \cdot 2 \cdot 3}{4}}\\
& = & g[0] + g[1] \cdot e^{\frac{-j 4 \pi}{4}} + g[2] \cdot e^{\frac{-j 8 \pi}{4}} + g[3] \cdot e^{\frac{-j 12 \pi}{4}}\\
& = & g[0] - g[1] + g[2] - g[3] \\
& = & g[0] - g[1] + g[2] - g[3]
\end{array}\quad(5.9)
$$

其中方程的运算是通过基于旋转的简化来完成的,例如,$$e^{\frac{-j 8 \pi}{4}} = 1$$ 以及$$e^{\frac{-12 j \pi}{4}} = -1$$ 。这两个例子都运用到了$$e^{-j 2\pi}$$等于1。换句话说,任何具有2π旋转的复指数都是相等的。

最终G[3]的方程为:

$$
\begin{array} {lll}
G[3] & = & g[0] \cdot e^{\frac{-j 2 \pi \cdot 3 \cdot 0}{4}} + g[1] \cdot e^{\frac{-j 2 \pi \cdot 3 \cdot 1}{4}} + g[2] \cdot e^{\frac{-j 2 \pi \cdot 3 \cdot 2}{4}} + g[3] \cdot e^{\frac{-j 2 \pi \cdot 3 \cdot 3}{4}}\\
& = & g[0] + g[1] \cdot e^{\frac{-j 6 \pi}{4}} + g[2] \cdot e^{\frac{-j 12 \pi}{4}} + g[3] \cdot e^{\frac{-j 18 \pi}{4}}\\
& = & g[0] + g[1] \cdot e^{\frac{-j 6 \pi }{4}} - g[2] + g[3] \cdot e^{\frac{-j 10 \pi}{4}}\\
& = & g[0] + g[1] \cdot e^{\frac{-j 6 \pi }{4}} - g[2] - g[3] \cdot e^{\frac{-j 6 \pi}{4}}\\
& = & g[0] + g[1] \cdot e^{\frac{-j 6 \pi }{4}} - g[2] - g[3] \cdot e^{\frac{-j 6 \pi}{4}}
\end{array}\quad(5.10)
$$

我们尚未发现我们的简化和上一个周期有何联系,它由 $$e^{\frac{-j 18 \pi}{4}}$$开始,因为他们相差了$$2\pi$$个旋转周期所以可以简化或者说是等于$$e^{\frac{-j 10 \pi}{4}}$$。旋转$$2\pi$$等于1即$$e^{\frac{-j 8 \pi}{4}}=1$$。最后,再旋转$$\pi$$ 个角度就相当于-1,就变成了$$e^{\frac{-j 6 \pi}{4}}$$。从另一个角度来看这个$$e^{\frac{-j 6 \pi}{4}}.e^{\frac{-j 18 \pi}{4}}$$,其中 $$e^{\frac{-j 4 \pi}{4}}=1$$。我们没有将式5.10彻底简化是为了在以下等式中证明对称性。通过重新排序,我们可以将这四个方程视为:

$$
\begin{array} {lll}
G[0] & = & (g[0] + g[2]) + e^{\frac{-j 2 \pi 0}{4}} (g[1] + g[3])\\
G[1] & = & (g[0] - g[2]) + e^{\frac{-j 2 \pi 1}{4}} (g[1] - g[3])\\
G[2] & = & (g[0] + g[2]) + e^{\frac{-j 2 \pi 2}{4}} (g[1] + g[3])\\
G[3] & = & (g[0] - g[2]) + e^{\frac{-j 2 \pi 3}{4}} (g[1] - g[3])\\
G[3] & = & (g[0] - g[2]) + e^{\frac{-j 2 \pi 3}{4}} (g[1] - g[3])
\end{array}\quad(5.11)
$$

从式5.11可以看出,几种不同的对称性开始出现。首先,我们可以将输入数据划分为偶数和奇数元素,即,对元素g[0]和g[2]进行类似的操作,对于奇数元素g[1]和g[3]也是如此。此外,我们可以看到在这些偶数和奇数元素上存在加法和减法对称性。在计算输出频率G[0]和G[2]期间,将偶数和奇数元素相加在一起。在计算频率G[1]和G[3]时,将偶数和奇数元素减。最后,每个频率项中的奇数元素乘以常数复指数 $$W^i_4$$,其中i表示频率输出,即G[i]

我们来看一下括号里面的项,可以发现有2点FFT。比如,我们先考虑一下括号里面的偶数输入项g[0]和g[2]。如果我们对这些偶数项用2点FFT展开,那么低频分量(直流分量)就是g[0]+g[2](参见式5.3),高频分量计算结果为g[0]-g[2](参见式5.4)。2点FFT同样适用于奇数项输入g[1]和g[3]

我们在这些等式上做更多的变换。

$$
\begin{array} {lll}
G[0] & = & (g[0] + g[2]) + e^{\frac{-j 2 \pi 0}{4}} (g[1] + g[3])\\
G[1] & = & (g[0] - g[2]) + e^{\frac{-j 2 \pi 1}{4}} (g[1] - g[3])\\
G[2] & = & (g[0] + g[2]) - e^{\frac{-j 2 \pi 0}{4}} (g[1] + g[3])\\
G[3] & = & (g[0] - g[2]) - e^{\frac{-j 2 \pi 1}{4}} (g[1] - g[3])\\
G[3] & = & (g[0] - g[2]) - e^{\frac{-j 2 \pi 1}{4}} (g[1] - g[3])
\end{array}\quad(5.12)
$$

最后两个等式里的旋转变化是由$$e^{\frac{-j 2 \pi 2}{4}} = -e^{\frac{-j 2 \pi 0}{4}}$$$$e^{\frac{-j 2 \pi 3}{4}} = -e^{\frac{-j 2 \pi 1}{4}}$$两个等式得来的。我们可以跨两个等式,共享乘法项系数,进一步降低了矩阵乘法的复杂度。

图5.2显示了四点FFT的蝶形图。 我们可以看到第一阶段是对偶数(顶部蝶形)和奇数(底部蝶形)输入值执行的两个2点FFT运算。通过使用公式5.12中所示的简化方式,将奇数的2点FFT输出乘以适当的旋转因子,可以用于所有四个输出项。
Expand All @@ -178,25 +199,32 @@ $$
G[k] = \displaystyle\sum\limits_{n=0}^{N-1} g[n] \cdot e^{\frac{-j 2 \pi k n}{N}} \text{ for } k = 0, \ldots, N-1
\quad(5.13)
$$

我们可以把这个公式分为两部分,一部分是偶数部分,一部分是奇数部分。

$$
G[k] =\displaystyle\sum\limits_{n=0}^{N/2-1} g[2n] \cdot e^{\frac{-j 2 \pi k (2n)}{N}} + \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n+1] \cdot e^{\frac{-j 2 \pi k (2n+1)}{N}}
\quad(5.14)
$$

该等式的第一部分处理偶数输入,是g[]和e的指数中的2n项。第二部分对应于两个部分的2n+1的奇数输入。还要注意的是在两种情况下,由于我们将它分为两个部分所以每个公式的求和总和现在变为N/2-1。

我们将公式5.14转换为如下:

$$
G[k] = \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n] \cdot e^{\frac{-j 2 \pi k n}{N/2}} + \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n+1] \cdot e^{\frac{-j 2 \pi k (2n)}{N}} \cdot e^{\frac{-j 2 \pi k}{N}}
\quad(5.15)
$$

在第一个求和(偶数输入)中,我们只需将2移动到分母中,使其现变为N/2。第二个求和(奇数输入)使用幂规则来分离+1,留下两个复数指数。我们可以进一步表达这个等式为:

$$
G[k] = \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n] \cdot e^{\frac{-j 2 \pi k n}{N/2}} + e^{\frac{-j 2 \pi k}{N}} \cdot \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n+1] \cdot e^{\frac{-j 2 \pi k n}{N/2}}
\quad(5.16)
$$

这里我们只修改第二个求和。首先,我们在求和之外拉出一个不依赖于n的复数指数。我们也将第二个移动到分母中,就像我们在第一次求和中所做的那样。请注意,这两个求和现在具有相同的复指数$$e^{\frac{-j 2 \pi k n}{N/2}}$$。最后,我们将其简化为

$$
G[k] = A_k + W_N^k B_k \quad(5.17)
$$
Expand All @@ -206,32 +234,43 @@ $$
让我们假设只用公式5.17来计算前N/2项,即G[0]到G[N/2-1],再使用另一个等式导出剩余的N/2项,即从G[N/2]到G[N-1]的项。虽然这可能看起来很愚蠢(为什么要做更多的数学计算而且是不必要的?),但你会发现这将使我们能够利用更加对称的方式,得到一种我们在4点FFT研究中看到的那种计算模式。

为了计算更高频率G[N/2]到G[N-1],让我们推导出相同的方程,但这次使用k=N/2,N/2+1,...,N/2-1。因此,我们希望计算:

$$
G[k + N/2] = \displaystyle\sum\limits_{n=0}^{N-1} g[n] \cdot e^{\frac{-j 2 \pi (k + N/2) n}{N}} \text{ for } k = 0, \ldots, N/2 - 1\quad(5.18)
$$

这类似于具有不同指数的公式5.13,即我们用公式5.13代替k,其中k+N/2。用我们之前执行的相同变换集,我们可以将它直接移动到等式5.16,但用k+N/2替换k,可得:

$$
G[k + N/2] = \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n] \cdot e^{\frac{-j 2 \pi (k + N/2) n}{N/2}} + e^{\frac{-j 2 \pi (k + N/2)}{N}} \cdot \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n+1] \cdot e^{\frac{-j 2 \pi (k + N/2) n}{N/2}} \quad(5.19)
$$

我们可以减少求和中的复指数,如下所示:

$$
e^{\frac{-j 2 \pi (k + N/2) n}{N/2}} = e^{\frac{-j 2 \pi k n}{N/2}} \cdot e^{\frac{-j 2 \pi (N/2) n}{N/2}} = e^{\frac{-j 2 \pi k n}{N/2}} \cdot e^{-j 2 \pi n} = e^{\frac{-j 2 \pi k n}{N/2}} \cdot 1\quad(5.20)
$$

第一次简化使用了幂规则来分割指数。第二次简化取消了在第二指数中的N/2项。最后的简化使用n是非负整数的事实,因此$$e^{-j2\pi n}$$将始终是2π的倍数的旋转。这意味着该项始终等于1。

现在让我们来处理第二个复指数:

$$
e^{\frac{-j 2 \pi (k + N/2)}{N}} = e^{\frac{-j 2 \pi k }{N}} \cdot e^{\frac{-j 2 \pi N/2 }{N}} = e^{\frac{-j 2 \pi k }{N}} \cdot e^{-j \pi} = - e^{\frac{-j 2 \pi k }{N}}\quad(5.21)
$$

第一次简化使用幂规则分割指数。第二次对第二个指数进行了一些简化。我们通过等式$${e^{-j\pi n}=-1}$$得到了最终形式。

![图5.3:从两个N/2点FFT构建N点FFT。在偶数输入上执行上N/2点FFT; 较低的N/2点FFT使用奇数输入。](images/NptFFT.jpg)

通过将式5.20和式5.21代入式5.19.我们得到

$$
G[k + N/2] = \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n] \cdot e^{\frac{-j 2 \pi k n}{N/2}} - e^{\frac{-j 2 \pi k}{N}} \cdot \displaystyle\sum\limits_{n=0}^{N/2-1} g[2n+1] \cdot e^{\frac{-j 2 \pi k n}{N/2}} \quad(5.22)
$$

注意到它和式5.16很相似,我们把它带入式5.16可以得到:

$$
G[k + N/2] = A_k - W_N^k B_k\quad(5.23)
$$
Expand Down
Loading

0 comments on commit f6b21d9

Please sign in to comment.