在上一篇文章中,我们了解了几种典型的测试信号(链接如下)。 今天我们就来进行一下快速傅里叶变换(FFT)的实际操作吧! 大家一定要在网站上敲下代码,仔细思考一下。 如有疑问,欢迎评论交流。
人们经常遇到将时域信号转换为频域信号或反之亦然的问题。 傅里叶变换是实现这种转换的一个很好的工具,并且在许多应用中普遍使用。 在信号处理中,时域信号可以是连续的或离散的、非周期性的或周期性的。 这会产生四种类型的傅里叶变换,如表 1.1 所示。
从表 1.1 中我们注意到,当信号在一个域中是离散的时,它在另一域中将是周期性的。 同样,如果信号在一个域中是连续的,则它在另一域中将是非周期性的。
为简单起见,我们的讨论仅限于 DFT,它广泛用作 SciPy() 和 SciPy() 等软件包的一部分。 然而,我们可以使用 DFT 来近似其他变换。
1.2.1 实数和复数DFT
对于上面列出的每个转换,都有一个真实版本和一个复杂版本。 变换的实数版本输入实数并给出两组实数频域点——一组表示余弦基函数上的系数,另一组表示正弦基函数上的系数。 变换的复数版本表示数轴上的正频率和负频率。 复数版本非常灵活,可以处理复值信号和实值信号。 图1.6反映了实DFT和复DFT之间的差异。
图1.6 实数和复数DFT1.2.1.1 实数DFT
考虑 N 点实数 DFT 的例子。 它接收实时域波形 x[n] 的 N 个样本,并给出两个长度为 的数组,每个数组分别投影到余弦和正弦函数上。
这里,时域索引n的范围为0到N,频域索引k的范围为0到N/2。实值时域信号可以通过实值DFT合成为
注意:当使用综合方程时,总和的值必须除以 2。这个问题是由于我们将分析限制为实数而产生的。 此类问题可以通过使用复数版本的 DFT 来避免。
1.2.1.2 复数DFT
考虑 N 点复数 DFT 的情况。 它接收复值时域波形的 N 个样本 x[n],并生成长度为 N 的数组 X[k]。
数组值解释如下:
相应的综合方程(从频域样本重建)是:
从公式 1.18 可以看出,实际 DFT 是通过将信号投影到余弦和正弦基函数上来计算的。 然而,公式 1.20 中的复数 DFT 将输入信号投影到指数基函数上(欧拉公式连接了这两个概念)。
当时域输入信号为实值时,复数DFT在计算过程中对虚值部分进行补零。 这就是它的灵活性,并避免了真正的 DFT 所需的注意事项)。 图 1.7 显示了如何解释计算复数 DFT 的原始 FFT 结果。 接下来我们通过一个例子来讨论具体的内容。
图1.7 复数DFT输出频率解释 1.2.2 快速傅里叶变换(FFT)
FFT在Scipy中实现。 包是 JW 和 JW 于 1965 年发布的一种有效计算 DFT 的算法。在其最简单的实现中,对记录的奇数和偶数索引样本执行并行 DFT 计算,并将结果合并。 如果用于计算的样本数为2的整数次方,则可以递归地进行DFT计算,从而大大减少计算时间。 这称为基 2 FFT。 FFT长度也可以是奇数,用于称为互质因子算法FFT算法的特殊FFT实现中,其中FFT长度是两个互质数。
FFT广泛应用于Scipy、Scipy等软件包中。 Scipy 中的 FFT 实现了 DFT 的复杂版本。 FFT 实现计算复数 DFT,与上面的方程非常相似。 除了缩放因子之外,与上面的方程非常相似。作为比较,FFT 实现计算复数 DFT 及其逆变换
实现上述方程的命令分别是FFT和IFFT。 对应的语法如下:
1.2.3 解释 FFT 结果
我们假设 x[n] 是频率为 的时域余弦信号。 为了在计算机内存中表示它,信号以频率采样(图 1.8)。
图1.8 持续时间为2s的10Hz余弦信号
让我们对离散时间信号 x[n] 应用点 FFT。
注意:FFT 的长度应足以覆盖输入信号的整个长度。 如果N小于输入信号的长度,则在计算FFT时输入信号将被截断。 余弦波 x[n] 的持续时间为 2 秒,将有 640 个点(以 32 倍的过采样因子采样的 10Hz 频率波,在 2 秒记录样本中将有 2×32×10=640 个点)。 由于输入信号 x[n] 是周期性的。 我们可以安全地使用N=256点FFT,无论如何FFT在计算FFT时都会扩展信号。
由于 的索引从 1 开始,因此 FFT 分解的 DC 分量出现在索引 1 处。
请注意,原始 FFT 的索引是从 1→N 的整数,我们需要对其进行处理以将这些整数转换为频率。 这就是采样频率很重要的原因。 FFT输出数组中各点(bin)的间隔即为频率分辨率Δf,计算公式为:
其中 fs 是采样频率,N 是所考虑的 FFT 大小。 因此,在我们的例子中,数组中的每个点都以频率分辨率间隔:
10Hz 余弦信号将在第 8 个样本处产生尖峰 (10/1.25=8) - 图 1.9 中的索引 9。
因此,使用频率分辨率,整个频率轴可以计算为:
现在,绘制 FFT 绝对值与频率的关系图 - 您将得到如图 1.9 所示的结果。
图 1.9 FFT 幅度响应与采样索引(上)和计算频率(下)的关系
在频率轴相对于采样频率进行适当变换后,我们注意到余弦信号在 10Hz 处有一个尖峰。 另外,它还在样本256-8=248处记录了一个尖峰,属于负频率部分。 由于我们知道信号的性质,因此我们可以选择忽略这些负频率。 奈奎斯特频率 (fs/2) 处的样本标志着正频率和负频率之间的边界。
1.2.4
从图1.9中,我们可以看到频率轴从DC开始,然后是正频率项,然后是负频率项。 为了在 X 轴上引入正确的排序,我们可以使用该函数,该函数将频率按顺序排列:负频率 → DC → 正频率。 当N为奇数时,需谨慎使用该函数。
对于偶数 N,FFT 返回的原始顺序如下(注意:这里所有索引都对应 的索引):
将直流分量移至频谱中心。 重要的是要记住,(N/2+1) 索引处的奈奎斯特频率对于正频率和负频率都是相同的。 该命令将奈奎斯特频率置于负频率侧。 这反映在图 1.10 中。
图1.10 N为偶数时对频率重排的影响
因此,当N为偶数时,有序频率轴设置为
当N为奇数时,有序频率轴应设置为
下面的代码片段使用手动方法和命令计算。 这些结果通过相互叠加来绘制。 图 1.11 表明手动方法和方法之间有很好的一致性。 将图 1.9 与图 1.11 中的下图进行比较,我们发现有序频率轴的解释更有意义。
图 1.11 应用 1.2.5 后 FFT 幅度响应与采样指数(上)和计算频率(下)的关系
人们可以通过使用函数来撤销该效果。 该函数恢复原始频率顺序。 如果使用函数对 FFT 输出进行排序,则在执行 IFFT 之前必须将频率分量恢复为其原始顺序。 以下语句是等效的:
1.2.6 关于总和的一些观察
当 N 为奇数时,sum 函数对于任意序列都会产生不同的结果。 但是,当它们串联使用时,会恢复原始顺序。
当 N 为偶数时, and 函数对于任意序列都会产生相同的结果。 当它们串联使用时,将恢复原始顺序。
未完待续,敬请期待!