IDFT

IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单:
x[n]=1N∑k=0N−1X[k]ej2πkn/Nx[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j2\pi kn/N} x[n]=N1​k=0∑N−1​X[k]ej2πkn/N

X[k]X[k]X[k]:离散频率下标为k时的频率大小

x[n]x[n]x[n]: 离散时域信号序列

NNN: 信号序列的长度,也就是采样的个数

对比我们之前讲过的DFT,两者公式类似,但是注意在DFT中指数带负号,而IDFT中不带

从矩阵的角度看IDFT

DFT的矩阵表示

讲IDFT之前,我们先复习DFT的矩阵表示形式:
[s00s01⋯s0N−1⋮⋮⋮⋮sk0sk1⋯skN−1⋮⋮⋱⋮sN−10sN−11⋯sN−1N−1][x[0]x[1]⋮x[n]⋮x[N−1]]=[X[0]X[1]⋮X[k]⋮X[N−1]]\begin{bmatrix} s_0^0 & s_0^1 & \cdots & s_0^{N-1} \\ \vdots & \vdots & \vdots & \vdots\\ s_k^0 & s_k^1 & \cdots & s_k^{N-1} \\ \vdots & \vdots & \ddots & \vdots\\ s_{N-1}^0 & s_{N-1}^1 & \cdots & s_{N-1}^{N-1} \\ \end{bmatrix} \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[n] \\ \vdots \\ x[N-1] \end{bmatrix} = \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[k] \\ \vdots \\ X[N-1] \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎡​s00​⋮sk0​⋮sN−10​​s01​⋮sk1​⋮sN−11​​⋯⋮⋯⋱⋯​s0N−1​⋮skN−1​⋮sN−1N−1​​⎦⎥⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​x[0]x[1]⋮x[n]⋮x[N−1]​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​X[0]X[1]⋮X[k]⋮X[N−1]​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​
SSS矩阵中的每一行都是一个SkS_kSk​向量,Sk=e−j2πkn/N,n=0,1,⋯ ,N−1S_k = e^{-j2\pi kn/N}, n=0,1,\cdots,N-1Sk​=e−j2πkn/N,n=0,1,⋯,N−1,进一步简化上面的表示,得到:
[⋯S0⋯⋮⋯Sk⋯⋮⋯SN−1⋯][x[0]x[1]⋮x[n]⋮x[N−1]]=[X[0]X[1]⋮X[k]⋮X[N−1]]\begin{bmatrix} \cdots & S_0 & \cdots \\ & \vdots & \\ \cdots & S_k & \cdots \\ & \vdots & \\ \cdots & S_{N-1} & \cdots \\ \end{bmatrix} \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[n] \\ \vdots \\ x[N-1] \end{bmatrix} = \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[k] \\ \vdots \\ X[N-1] \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎡​⋯⋯⋯​S0​⋮Sk​⋮SN−1​​⋯⋯⋯​⎦⎥⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​x[0]x[1]⋮x[n]⋮x[N−1]​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​X[0]X[1]⋮X[k]⋮X[N−1]​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​

IDFT的矩阵表示

从IDFT的公式,可以看出,其实IDFT和DFT表示是一样的,只是对象发生了变化。具体来说,有两个变化:

  • 由于指数部分不再有符号,SkS_kSk​进行了共轭操作,得到Sk∗S_k^*Sk∗​
  • 输入是频率信息X[k]

因此,矩阵表示变成了下面这样:
[⋯S0∗⋯⋮⋯Sk∗⋯⋮⋯SN−1∗⋯][X[0]X[1]⋮X[n]⋮X[N−1]]=[x[0]x[1]⋮x[k]⋮x[N−1]]\begin{bmatrix} \cdots & S_0^* & \cdots \\ & \vdots & \\ \cdots & S_k^* & \cdots \\ & \vdots & \\ \cdots & S_{N-1}^* & \cdots \\ \end{bmatrix} \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[n] \\ \vdots \\ X[N-1] \end{bmatrix} = \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[k] \\ \vdots \\ x[N-1] \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎡​⋯⋯⋯​S0∗​⋮Sk∗​⋮SN−1∗​​⋯⋯⋯​⎦⎥⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​X[0]X[1]⋮X[n]⋮X[N−1]​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​x[0]x[1]⋮x[k]⋮x[N−1]​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​

Talk is cheap, show me the code

接下来就简单多了,我们将先介绍如何使用scipy中ifft,然后自己动手实现一份ifft

导入必要的包

import numpy as np
from scipy.fftpack import fft, ifftimport matplotlib.pyplot as plt%matplotlib notebook

生成信号用于测试

def generate_sine(N, A, fs, f0, phi):'''N : number of samplesA : amplitudefs: sample ratef0: frequencyphi: initial phase'''T = 1/fsn = np.arange(N)x = A*np.cos( 2*np.pi*f0*n*T + phi )return x# generate signal
N = 501
A = 0.8
fs = 44100
f0 = 1000
phi = 0.0x = generate_sine(N, A, fs, f0, phi)plt.figure()
plt.plot(x)
plt.show()

使用scipy中的ifft

# fft the signal
N = 512                       # fft size
X = fft(x, N)
mX = np.abs(X)
pX = np.angle(X)freq_axis = np.arange(N)/N * fs
plt.figure(figsize=(10, 12))
ax = plt.subplot(3,1,1)
plt.plot(freq_axis, mX)
ax.set_title('Magnitude')ax = plt.subplot(3,1,2)
plt.plot(freq_axis, pX)
ax.set_title('Phase')# ifft it
ifft_x = ifft(X)
ax = plt.subplot(3,1,3)
plt.plot(ifft_x)
ax.set_title('Synthesise')plt.show()

自己动手写ifft

只有两个地方要注意:

  • 不要忘记乘上 1/N
  • Sk∗S_k^*Sk∗​是SkS_kSk​向量的共轭后的结果。反映在代码中,就是Sk∗S_k^*Sk∗​不要共轭操作之间返回
def generate_complex_sinusoid(n, N):'''n : time index (or frequency index)N : number of sample'''k = np.arange(N)c_sin = np.exp(1j*2*np.pi*k*n/N)return c_sin# ifft loop
ifft_x = np.array([])for i in range(N):s = generate_complex_sinusoid(i, N)ifft_x = np.append(ifft_x, 1/N * np.sum(X*s))plt.figure()
plt.plot(ifft_x)
plt.show()

总结

通过自己动手,我们发现IDFT的原来和实现很简单,几乎与DFT一模一样,唯一需要注意的点就是Sk∗S_k^*Sk∗​

IDFT的python实现相关推荐

  1. 第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角

    目录 二维DFT和IDFT的一些性质 傅里叶频谱和相角 二维DFT和IDFT的一些性质 傅里叶频谱和相角 F(u,v)=R(u,v)+jI(u,v)=∣F(u,v)∣ejϕ(u,v)(4.86)F(u ...

  2. 第4章 Python 数字图像处理(DIP) - 频率域滤波6 - 二维DFT和IDFT的一些性质 - 平移和旋转、周期性、对称性

    目录 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 平移和旋转 周期性 对称性 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 Δu=1MΔT(4.69)\Delta u = \ ...

  3. 第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

    目录 二维DFT和IDFT的一些性质 二维离散卷积定理 二维离散傅里叶变换性质的小结 二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式: (f⋆h)(x,y)=∑m=0M−1∑n= ...

  4. 基于python物流管理系统毕业设计-长白高校邦数据科学通识课【Python基础语法】答案...

    长白高校邦数据科学通识课[Python基础语法]答案it8p 长白高校邦数据科学通识课[Python基础语法]答案 关注公众号{帅搜}即可查询答案 支持:网课,智慧树,知到,超星,尔雅,学习通,选修课 ...

  5. python代码块所属关系的语法-天元高校邦数据科学通识课【Python基础语法】答案...

    天元高校邦数据科学通识课[Python基础语法]答案it8p 天元高校邦数据科学通识课[Python基础语法]答案 关注公众号{帅搜}即可查询答案 支持:大学网课,智慧树,知到,超星,尔雅,学习通,选 ...

  6. python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

  7. Python中OpenCV2. VS. CV1

    OpenCV的2.4.7.版本生成了python的CV2模块,可以直接载入: 有兴趣的可以参考这个教程:http://blog.csdn.net/sunny2038/article/details/9 ...

  8. python傅里叶变换库_python的numpy库和cv2库实现图像傅里叶变换

    码字不易,如果对您有所帮助,记着点赞哦! 一. 图像傅里叶变换原理: 对二维图像进行傅里叶变换用如下公式进行: 图像长M,高N.F(u,v)表示频域图像,f(x,y)表示时域图像.u的范围为[0,M- ...

  9. Python+OpenCV:傅里叶变换(Fourier Transform)

    Python+OpenCV:傅里叶变换(Fourier Transform) ############################################################# ...

最新文章

  1. 永州科技学院有计算机专业吗,永州科技学院有哪些专业
  2. SAP SD基础知识之订单中装运相关的功能 I
  3. Office2019 Word 新建文档豆沙绿背景色失效零时解决方案
  4. 如何将视频网站中的视频插入到博客中
  5. android app增加内存大小,android – 增加分配给应用程序的内存
  6. php+mysqli实现批量执行插入、更新及删除数据的方法
  7. setxor--求两个集合交集的非(异或)
  8. 全民创业时代,谁在大潮退去前“活”下来?
  9. linux压缩与解压缩命令
  10. comboBox.DataSource绑定
  11. OpenGL多线程实例
  12. .NET:如何让线程支持超时?
  13. 工作簿长时间空闲时自动关闭
  14. html 像素跟百分比,html – 将百分比宽度与边距(以像素为单位)组合起来
  15. java 网络编程学习笔记
  16. vs2010 导出创建dll 导入使用dll 导出有命名空间的类 函数 外部函数
  17. c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象
  18. 我的blog终于开张啦 :)
  19. 电脑大小写怎么切换_小白买了Mac pro电脑学会基本操作
  20. undo歌词中文音译_Undo - Sanna nielsen帮我看看这歌词翻译对么

热门文章

  1. python函数定义时参数相当于占位符_python中函数的参数
  2. python统计行号_用Python实现两个文件的不同行的编号
  3. Python3小程序:把连续的16进制UTF8编码转换为字符串
  4. python len命令_python命令行参数
  5. php持久对象,php-在理论中具有两个外来身份的持久对象
  6. arduino温湿度计库文件_arduino学习笔记八 温湿度计
  7. php全选帖子删除,用PHP实现全选全删
  8. cglib和asm相关的文章
  9. Java学习笔记:进程与线程、BIO、NIO、Selector
  10. 大数据学习笔记37:Hive - 复杂数据类型