常用函数的傅里叶变换_傅里叶变换简介

傅里叶变换是一种线性积分变换,用于信号在时域和频域之间的表示,在数学、物理、数字信号处理等领域有重要应用。

我们常看到傅里叶级数、傅里叶变换、离散时间傅里叶变换、离散傅里叶变换等概念,本文对这些概念进行简单的梳理和介绍。

1. 傅里叶级数

考虑一个在区间 上可积的函数 ,其傅里叶级数 (Fourier Series - FS) 为

其中

说明 为了简化括号,我们把, 简写为,,下文以此类推。

由欧拉公式 得

代入可得

则可以得到傅里叶级数的复数形式

根据,可写成如下形式:

2. 傅里叶变换

傅里叶变换 (Fourier Transform - FT) 可以看作傅里叶级数的连续形式。

首先考虑定义在 上的函数的傅里叶级数展开:

其中

根据上式,我们也可以把理解为关于的一个函数, 即

其中是一个常数,令

我们有

注意到

下面把用表示,我们有

当 时,,, 中的求和变为积分

相应地, 变为

称为傅里叶变换,记作 ; 称为傅里叶变换的逆变换,记作 。在信号分析中, 称为信号的时域表示, 称为信号的频域表示。

需要明确的是,不管是用时域还是用频域来表示一个信号,它们代表的都是同一个信号。可以从线性空间的角度理解这一点。同一个信号在不同的表象(或者说基向量)下具有不同的坐标。

同一个向量在不同表象下的坐标可以通过一个线性变换联系起来。如果是有限维的空间,这个线性变换可以表示为一个矩阵。而傅里叶变换则是无限维空间不同表象之间的一种变换。举例来说,在量子力学中,一个波函数的坐标表象到动量表象间的变换就是一个傅里叶变换。

也可以将角频率 替换为自然频率 ,有 ,则

3. 离散时间傅里叶变换

一般情况下,我们处理的信号都是离散的。取 在时间上的离散采样

是采样的时间间隔。

傅里叶变换只能作用在连续函数上,为此我们引入

其中

为 Dirac 函数。 注意:Dirac函数是广义函数。换句话说,找不到满足上述条件的经典函数。我们可以把它理解为分布,具有如下性质:

式中的第二部分 称为 Dirac 梳子(亦称 Shah 分布),是一个采样函数,常用在数字信号处理和离散时间信号分析中。

对 做傅里叶变换即可得到离散时间傅里叶变换 (Discrete-time Fourier Transform - DTFT)的形式。

下面简单介绍一下采样定理

若原信号 不包含高于 的频率,即 ,则只要采样频率 ,时域采样就能完全重建原信号。

将 在 上展开为傅里叶级数

其中

注意到 时 ,而 ,故 时 。因此, 可改写为

代入 ,得

这里 。说明原信号的傅里叶变换可以由采样信号确定,进而可以利用傅里叶逆变换重建原信号。

此外,不难发现

是一个周期为 的周期函数。离散傅里叶变换可以看作原信号连续傅里叶变换的周期延拓,时域的离散化造成了频域的周期化。

4. 离散傅里叶变换

离散时间傅里叶变换在频域上仍然是连续的。如果把频域也离散化,就得到了离散傅里叶变换 (Discrete Fourier Transform - DFT)。

也可以写成矩阵形式

其中 。

离散傅里叶变换的逆变换为

5. 快速傅里叶变换

直接根据定义计算离散傅里叶变换的复杂度是 。快速傅里叶变换 (Fast Fourier Transform - FFT) 是计算离散傅里叶变换及其逆变换的算法。FFT 基于分治法 (Divide and Conquer) 把计算复杂度降低到 。

在 Python 中可以利用 scipy.fftpack 进行快速傅里叶变换。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from scipy.fftpack import fft, ifft

x = np.linspace(0, 2*np.pi, 200) # 采样频率为 200Hz
y = np.cos(5*x) + 0.5*np.sin(25*x) + 0.3*np.cos(75*x) # 根据采样定理,信号中不能包含超过 100Hz 的频率成分
plt.figure(figsize=(10,12))
ax1 = plt.subplot(311)
ax1.plot(x, y, 'r')
ax1.set_title('original signal in time domain')

Y = fft(y) # 快速傅里叶变换,得到频域
ax2 = plt.subplot(323)
ax2.plot(range(200), abs(Y))
ax2.set_title('original signal in frequency domain')

Y[10:-9] = 0 # 滤波
ax3 = plt.subplot(324)
ax3.plot(range(200), abs(Y))
ax3.set_title('filtered signal in frequency domain')

filtered = ifft(Y).real # 逆变换,得到滤波后的时域信号
ax4 = plt.subplot(313)
ax4.plot(x, filtered, 'g')
ax4.set_title('filtered signal in time domain')

常用函数的傅里叶变换_傅里叶变换简介_第1张图片

参考

  1. A.Boggess, F.J. Narcowich. 小波与傅里叶分析基础(第二版), 芮国胜,康健(译),电子工业出版社,2017.6
  2. Fourier transform, Wikipeida. https://en.wikipedia.org/wiki/Fourier_transform
  3. Discrete-time Fourier transform, Wikipedia. https://en.wikipedia.org/wiki/Discrete-time_Fourier_transform
  4. Discrete Fourier transform, Wikipedia. https://en.wikipedia.org/wiki/Discrete_Fourier_transform
  5. https://docs.scipy.org/doc/scipy/reference/fftpack.html

作者介绍

肖伟集,硕士,毕业于北京大学。2018年加入网易严选算法团队负责销量预测、补货决策、智能营销、异常检测等项目的技术研发。

你可能感兴趣的:(常用函数的傅里叶变换,常见函数傅里叶变换表)