- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
FFT演示程序
Navigation
下一篇
上一篇 |
←切换侧栏(Alt+X) |
用Python做科学计算 ?
17 FFT演示程序?
本章详细介绍如何综合利用之前所学习的numpy,traits,traitsUI和Chaco等多个库,编写一个FFT演示程序。此程序可以帮助你理解FFT是如何将时域信号转换为频域信号的,在开始正式的程序编写之前,让我们来复习一下有关FFT变换的知识,如果你没有学习过FFT,现在就是一个不错的学习机会。
17.1 FFT知识复习?
FFT变换是针对一组数值进行运算的,这组数的长度N必须是2的整数次幂,例如64, 128, 256等等; 数值可以是实数也可以是复数,通常我们的时域信号都是实数,因此下面都以实数为例。我们可以把这一组实数想像成对某个连续信号按照一定取样周期进行取样而得来,如果对这组N个实数值进行FFT变换,将得到一个有N个复数的数组,我们称此复数数组为频域信号,此复数数组符合如下规律:
下标为0和N/2的两个复数的虚数部分为0,
下标为i和N-i的两个复数共轭,也就是其虚数部分数值相同、符号相反。
下面的例子演示了这一个规律,先以rand随机产生有8个元素的实数数组x,然后用fft对其运算之后,观察其结果为8个复数,并且满足上面两个条件:
1
2
3
4
5
6
7
8
9
10 x = np.random.rand(8)
x
array([ 0 0 0 0 0
0 0 0.1588846 ])
xf = np.fft.fft(x)
xf
array([ 30.j , -00,
-01, -00,
00.j , -00,
-01, -00]) FFT变换的结果可以通过IFFT变换(逆FFT变换)还原为原来的值:
np.fft.ifft(xf)
array([ 0+0+00j, 0+1-16j,
0+1-16j, 0-2-16j,
0+0+00j, 0+2-16j,
0-1-16j, 0-2-16j])
注意ifft的运算结果实际上是和x相同的,由于浮点数的运算误差,出现了一些非常小的虚数部分。
FFT变换和IFFT变换并没有增加或者减少信号的数量,如果你仔细数一下的话,x中有8个实数数值,而xf中其实也只有8个有效的值。
计算FFT结果中的有用的数值
由于虚数部共轭和虚数部为0等规律,真正有用的信息保存在下标从0到N/2的N/2+1个虚数中, 又由于下标为0和N/2的值虚数部分为0,因此只有N个有效的实数值。
下面让我们来看看FFT变换之后的那些复数都代表什么意思。
首先下标为0的实数表示了时域信号中的直流成分的多少
下标为i的复数a+b*j表示时域信号中周期为N/i个取样值的正弦波和余弦波的成分的多少, 其中a表示cos波形的成分,b表示sin波形的成分
让我们通过几个例子来说明一下,下面是对一个直流信号进行FFT变换:
x = np.ones(8)
x
array([ 1., 1., 1., 1., 1., 1., 1., 1.])
np.fft.fft(x)/len(x)
array([ 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
0.+0.j])
所谓直流信号,就是其值不随时间变化,因此我们创建一个值全为1的数组x,我们看到它的FFT结果除了下标为0的数值不为0以外,其余的都为0。(为了计算各个成分的能量多少,需要将FFT的结果除以FFT的长度),这表示我们的时域信号是直流的,并且其成分为1。
下面我们产生一个周期为8个取样的正弦波,然后观察其FFT
文档评论(0)