1. 什么是吉布斯(Gibbs)现象?

  在信号处理中,有很多很有意思的现象,比如由于栅栏效应引起的频谱泄露,和我们这一讲要讲到的吉布斯现象。

  吉布斯现象和频谱泄露多少有些相像,频谱泄露是因为进行DFT时对时域信号进行了截断;而吉布斯现象则是对频域信号进行了截断。

  先来看下维基百科上的解释,吉布斯现象是由Henry Wilbraham于1848年最先提出,并由约西亚·吉布斯于1899年证明。在工程应用时常用有限正弦项正弦波叠加逼近原周期信号。所用的谐波次数N的大小决定逼近原波形的程度,N增加,逼近的精度不断改善。但是由于对于具有不连续点的周期信号会发生一种现象:当选取的傅里叶级数的项数N增加时,合成的波形虽然更逼近原函数,但在不连续点附近会出现一个固定高度的过冲,N越大,过冲的最大值越靠近不连续点,但其峰值并不下降,而是大约等于原函数在不连续点处跳变值的9%,且在不连续点两侧呈现衰减振荡的形式。

  简单来说,就是我们对信号进行分析时,无论是对模拟信号还是数字信号,都无法分析无限大的频谱区间,我们只能截取频谱的一部分来分析,这就导致了对频谱产生了截断。比如一个矩形波信号(门函数)的傅里叶变换是Sinc函数,且频谱的区间是无线大的。

  我们在进行分析时,只会取频谱中的一部分,假设我们取下图中的红框之内的部分。

如果我们再对截取后的信号做逆傅里叶变换,就会发现时域信号并非之前的矩形信号,而是在棱角处会有一个过冲。

当频域截断的带宽更大时,过冲的最大值越靠近不连续点,但其峰值并不下降。

2. 吉布斯现象的数学原理

  说到吉布斯现象,必须要提到傅里叶,大名鼎鼎的傅里叶在1807年向法国科学学会提交了《热的传播》论文,里面提到一个当时很有争议的观点:任何连续周期信号可以由一组适当的正弦曲线组合而成。这其实就是傅里叶级数(下面的公式),但拉格朗日却表示质疑,他认为傅里叶的方法无法表示带有棱角的信号,比如我们上面提到的矩形信号。科学学会鉴于拉格朗日的威望,拒绝了傅里叶的论文。
sN(x)=A02+∑n=1NAn⋅cos⁡(2πnxP−φn)s_{N}(x)=\frac{A_{0}}{2}+\sum_{n=1}^{N} A_{n} \cdot \cos \left(\frac{2 \pi n x}{P}-\varphi_{n}\right) sN​(x)=2A0​​+n=1∑N​An​⋅cos(P2πnx​−φn​)

  他们两个的说法谁对谁错呢?

  首选拉格朗日肯定是对的,傅里叶级数的每一项都是连续光滑函数,因此它们的组合不可能表示一个带有棱角的信号。

  傅里叶也是对的,虽然无法精确表示,但我们可以用正弦曲线的组合来逼近的表示一个带有棱角的信号,逼近到这两个信号不存在能量差别;但这并不代表可以点点收敛,因此才有了吉布斯效应。在傅里叶级数中,我们取的项数越多(N越大),对应到上一节中我们选取的带宽就越大。

3. 如何用Python复现吉布斯现象?

  可以分如下几步进行:

1.产生矩形信号;

n = 4096
n_ones = 40
sig = np.zeros(n,)
sig[n//2-n_ones//2:n//2+n_ones//2] = 1

2.对矩形进行做FFT变换到频域;

sig_fft = np.abs(np.fft.fftshift(np.fft.fft(sig)))

3.产生频域的矩形窗信号;

4.对频域的矩形窗信号做IFFT得到时域的Sinc信号;

5.将时域矩形信号与Sinc信号卷积得到过冲的矩形信号;

6.该矩形信号与频域截取后的信号是傅里叶变换对

具体过程可以参考下图:

欢迎关注微信公众号:Quant_Times

如何用Python复现吉布斯现象?相关推荐

  1. 如何用Python处理自然语言?(Spacy与Word Embedding)

    本文教你用简单易学的工业级Python自然语言处理软件包Spacy,对自然语言文本做词性分析.命名实体识别.依赖关系刻画,以及词嵌入向量的计算和可视化. (由于微信公众号外部链接的限制,文中的部分链接 ...

  2. 如何用python画世界地图,并用不同的颜色展现每个国家的数据?

    以下的图来自 iMeta 期刊文章,使用此代码,请引用文章: Yong-Xin Liu, Chun-Lin Shi, Tengfei Ma, Wubin Ding, Danyi Li, Tong Ch ...

  3. 如何用python读取文本中指定行的内容

    如何用python读取文本中指定行的内容 搜索资料 我来答 分享 新浪微博 QQ空间 浏览 5284 次 查看全文 http://www.taodudu.cc/news/show-64036.ht ...

  4. python判断素数的函数_如何用python求素数

    如何用python求100以内的素数? 质数(primenumber)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,如:2.3.5.7.11.13.1 ...

  5. 怎么用python画个电脑_python语言还是java如何用python画爱心

    用python绘制爱心的基本步骤如下: 002pc.com对<python语言还是java如何用python画爱心>总结来说,为我们学习Python很实用. 首先先下载安装好python程 ...

  6. python怎么读_如何用Python读写文件

    前面我们已经介绍了很多Python相关的基础知识,大家是不是对Python已经有了进一步认识了呢?作为人工智能时代的热门编程语言,开始接触并学习Python的孩子越来越多,家长们都不想让自己的孩子落于 ...

  7. 如何用Python批量提取PDF文本内容?

    本文为你展示,如何用Python把许多PDF文件的文本内容批量提取出来,并且整理存储到数据框中,以便于后续的数据分析. 问题 最近,读者们在后台的留言,愈发五花八门了. 写了几篇关于自然语言处理的文章 ...

  8. 如何用Python实现超级玛丽的人物行走和碰撞检测?

    作者 | marble_xu 编辑 | 郭芮 出品 | CSDN博客 在<如何用 Python 实现超级玛丽的界面和状态机?>这篇文章中我们讲解如何用代码实现界面和状态机,本文详解人物行走 ...

  9. 如何用Python和BERT做中文文本二元分类?| 程序员硬核评测

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 作者 | 王树义 来源 | 王树芝兰(ID:nkwangshuyi) 兴奋 去年, Google 的 B ...

最新文章

  1. python3基础知识点总结_python基础知识点总结
  2. 4个做管理后才知道的秘密
  3. 可信计算 沈昌祥_沈昌祥院士在南宁开展网络安全前沿知识讲座
  4. 引用用户控件图片无法
  5. c语言 二级菜单_收下计算机二级秘笈,考场上说好不哭!
  6. C 库函数 - vprintf()
  7. Leetcode: Binary Tree Maximum Path Sum
  8. web developer tips (74):在 Visual Studio 2008设计器里添加或移除AJAX Extenders
  9. 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】
  10. SAP OData编程指南
  11. mysql 查外键关联关系 (指定被引用表,查哪些表对其有外键引用)
  12. VMware中linux硬盘空间不足的解决方法
  13. 华硕笔记本 X550JD4710HQ
  14. PHP微信公众号开发常用功能
  15. Go基础:切片的地址和扩容
  16. ipad降级系统无法接通服务器,红雪0.9.14b2基带降级图文教程
  17. 利用二维向量的叉乘判断凹凸多边形
  18. C语言——恶搞关机小程序
  19. php 导出excel 进度条显示
  20. Catia V5-6R2016软件安装教程——附下载地址

热门文章

  1. windows10linux主题,这不是Win10!Linux Mint迎来扁平主题
  2. 如何使用python中的取整floor函数?
  3. linux TTY子系统 --- bug来了,稍候再整理
  4. tcpdump命令详解
  5. 基于Vue和NodeJs摄影网站的设计与实现
  6. 机器学习面试必知:偏差-方差分析
  7. android输入日期格式,android – 当用户输入时,如何格式化信用卡到期日期(mm / yy)...
  8. java202302java学习笔记第十五天-罗马数字的两种写法2
  9. python的静态变量和静态方法
  10. win7能装HTML5年吗,十年老电脑装xp还是win7比较好