热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

FFT变换学习笔记

1.多项式相乘怎么来表示两个多项式相乘呢?(1)在线性代数里面我们是可以用多项式的系数来表示一个多项式,两个多项式的相乘也就

1.多项式相乘

        怎么来表示两个多项式相乘呢?

       (1) 在线性代数里面我们是可以用多项式的系数来表示一个多项式,两个多项式的相乘也就是两个多项式的系数分别乘上彼此的系数(交叉相乘求和),最终得到的就是两个多项式相乘的系数所表示的多项式,这样可以确定唯一的多项式。

       (2)还有一种表示方法就是用点来确定,叫做值表示法,比如我们所知的两个点确定一条一阶直线,三个点可确定一条二阶曲线,那么推广开来:d+1个点就可以确定d阶的曲线,这样也是唯一确定的。

        所以在计算两个多项式相乘结果的时候我们可以采用(1)中的系数相乘法,这样结果的计算复杂度为o(n^{2}),而采用(2)用n+1个点来确定的话那么只需要在两个多项式里面分别取n+1个点然后对应相乘,此时只相乘了n+1次就可得到n+1个点,从而确定两个多项式相乘结果的多项式,并且计算的复杂度为o(n)。

         所以现在我们的思路就是通过两个多项式A、B的系数,然后从两个多项式中取点,求出点的值,然后根据求出来的值和取的点反推回C的系数,就这样多项式相乘的结果就出来了。那么在求值的过程中就是FFT要做的事情(卷积过程),在反推系数的过程中就是IFFT做的事情(卷积逆运算)。

        那么是不是在计算C(x)=A(x)*B(x)时,就从A(x)和B(x)取n+1个x带入到A(x)与B(x)中然后求出n+1个点相乘?

        当然不是这么简单的去取点,如果这样做的话最终复杂度还是o(n^{2}),因为每个点的计算复杂度都是o(n),然后又有n个点,最终复杂度还是 o(n^{2})。

2.怎么取点

        如果要计算n个点的值,我们是否需要取n个点,然后求n次值呢,当然是不需要的,从下图可以看出,当点具有奇偶性时我们就只需要取一半的点就可以得到所有的值。

 

 所以根据以上的理论基础我们可以先将一个多项式的奇数项写一起,偶数项写一起:

A(x)=a_{0}+a_{1}x+...+a_{n-1}x^{n-1} =a_{0}+a_{2}x^{2}+...+a_{n-2}x^{n-2}+a_{1}x+a_{3}x^{3}+...+a_{n-1}x^{n-1}

A_{1}(x)=a_{0}+a_{2}x+...+a_{n-2}x^{n/2-1}

 A_{2}(x)=a_{1}x+a_{3}x^{2}...+a_{n-1}x^{n/2-1}

所以:

A(x)=A_{1}(x^{2})+xA_{2}(x^{2})

A(-x)=A_{1}(x^{2})-xA_{2}(x^{2})

        如果我们有n-1阶多项式需要取n个点,那么根据奇偶性我们只需要取n/2-1个点,而每部分都是n/2-1阶。现在变成求  n/2-1个点的n/2-1 阶的多项式的值, 那么我们又怎么求这 n/2-1 阶的多项式的值呢,当然还是用同样的方法,再把关于x^2的多项式根据奇偶拆分,一直拆分.........,一直分到最后只求1个点的值,因为一个点的值比较好算,所以我们得到一个点的值再反推回去,那么就可以得到n个点开n次方的值,就可以得到这个多项式的n个点所有值了。

        到这里之后就很像是递归的算法了,但是目前还有一个问题就是第一次分奇偶自变量可以取±x得出来A(x),A(-x),然而在第二次分的时候原式子中全是x^2的多项式怎么能将自变量取成一正一负的形式呢,所以为了使得递归成立,FFT引入了复数,如果令x1=1的话:

         可见有了复数的加入递归算法就成立了,那么整个计算的复杂度为o(nlogn),因为一直在做对半分的操作,所以在取FFT的点数的时候尽量取2^n个,对于不够的则补零。也可以看出我们所需要取的点就是1开n次方后的n个值,我们要求这n个值是n/2对相反数。

3.单位根

        由上文我们知道需要取的点就是1开n次方后呈互为相反数的n个点,所以FFT又引入了单位圆复平面,因为1的n次方根可以解释为复平面上沿着单位圆等距排布的一系列点。

 设幅角为正且最小的复数为\omega _{n},这就是n次单位根,表达式为(由欧拉公式推):

\omega _{n}=cos\frac{2\pi }{n}+isin\frac{2\pi }{n}

而所有的单位根的表达式为:

\omega _{n}^{k}=cos\frac{2k\pi }{n}+isin\frac{2k\pi }{n}

单位根有一些性质:

(1)折半引理

\omega _{n}^{2k}=\omega _{n}^{k}

  \omega _{n}^{k+\frac{n}{2}}=-\omega _{n}^{k}

(2)

 \omega _{n}^{0}=\omega _{n}^{n}

(3)加法引理

 \omega _{n}^{i}*\omega _{n}^{j}=\omega _{n}^{i+j}

(4)消去引理

\omega _{dn}^{dk}=\omega _{n}^{k}

        由上式(1)可见在单位圆上所有的点的取值都有存在其相反数,点平方后还是和原复数相等,当单位圆上的点平方后点数减半,但依旧满足所有点存在相反数。

4.FFT实现

        以上的单位根的性质正好满足咱们所需要的点的要求,所以将所取的点换成\omega _{n}^{k}。 

那么此时第一部分多项式:

A(\omega _{n}^{k})=A_{1}(\omega _{n}^{2k})+\omega _{n}^{k}A_{2}(\omega _{n}^{2k})

折半引理后:

A(\omega _{n}^{k})=A_{1}(\omega _{\frac{n}{2}}^{k})+\omega _{n}^{k}A_{2}(\omega _{\frac{n}{2}}^{k}) , k\epsilon [0,\frac{n}{2}-1]

第二部分多项式:

A(\omega _{n}^{k+\frac{n}{2}})=A_{1}(\omega _{n}^{k+\frac{n}{2}})+\omega _{n}^{k+\frac{n}{2}}A_{2}(\omega _{n}^{k+\frac{n}{2}})

折半引理后:

A(\omega _{n}^{k})=A_{1}(\omega _{\frac{n}{2}}^{k})-\omega _{n}^{k}A_{2}(\omega _{\frac{n}{2}}^{k}) , k\epsilon [\frac{n}{2},n-1]

最后不断递归就可以求出最终的值了,这个过程也就是FFT变换。

5.IFFT变换

        FFT变换就是快速的DFT变换,DFT变换时是由一个多项式系数矩阵乘以DFT变换矩阵得到的一堆多项式值的矩阵。FFT则是当x_{k}=\omega^{k}(\omega =e^{\frac{2\pi i}{n}})时的变换。

        

        而IFFT则是跟FFT一样的原理,此时我们需要根据给出的多项式值求出多项式系数,将DFT变换矩阵求逆,然后乘上值向量最终得到多项式系数矩阵。而且在对DFT矩阵求逆后矩阵里的x_{k}=\omega^{-k}\omega =\frac{1}{n}e^{\frac{-2\pi i}{n}}),那么我们就可以使用FFT同样的方式来进行IFFT变换了。

以上分享均是自己在学习时的笔记,相关视频链接发出来被和谐,自行上某站搜索FFT 。

如有侵权,请联系我删除哈~~~~


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 关键词:塞尔达旷传说野之息、switch、cemu设置、Wii U、租赁、游戏机 ... [详细]
  • 本文讨论了同事工资打听的话题,包括同工不同酬现象、打探工资的途径、为什么打听别人的工资、职业的本质、商业价值与工资的关系,以及如何面对同事工资比自己高的情况和凸显自己的商业价值。故事中的阿巧发现同事的工资比自己高后感到不满,通过与老公、闺蜜交流和搜索相关关键词来寻求解决办法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何配置小米wifi放大器来增强家庭无线路由器信号?
    本文介绍了如何通过配置小米wifi放大器来增强家庭无线路由器信号的方法。通过打开米家APP,选择设备添加,搜索并选择需要添加的wifi放大器,根据系统提示进行下一步操作即可完成配置。配置完成后,家庭无线路由器信号将得到增强。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • 本文介绍了新款奇骏的两个让人上瘾的功能,分别是智能互联系统和BOSE音响。通过对新款奇骏的配置和功能进行评测,探讨了这两个新增功能的使用体验和优势。此外,还介绍了新款奇骏的其他配置和改进,如增加的座椅和驾驶辅助系统,以及内饰的舒适性提升。对于喜欢音响的消费者来说,BOSE音响的升级也是一个亮点。最后,文章提到了BOSE音响的数字还原能力,以及7座版无法配备BOSE音响的原因。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
author-avatar
kenan0072010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有