SciPy提供了fftpack模块,包含了傅里叶变换的算法实现。

傅里叶变换把信号从时域变换到频域,以便对信号进行处理。傅里叶变换在信号与噪声处理、图像处理、音频信号处理等领域得到了广泛应用。

如需进一步了解傅里叶变换原理,可以参考相关资料。

快速傅里叶变换

计算机只能处理离散信号,使用离散傅里叶变换(DFT) 是计算机分析信号的基本方法。但是离散傅里叶变换的缺点是:计算量大,时间复杂度太高,当采样点数太高的时候,计算缓慢,由此出现了DFT的快速实现,即快速傅里叶变换FFT。

快速傅里叶变换(FFT)是计算量更小的离散傅里叶变换的一种实现方法,其逆变换被称为快速傅里叶逆变换(IFFT)。

示例

先对数据进行fft变换,然后再ifft逆变换。

importnumpy as np#从fftpack中导入fft(快速傅里叶变化)和ifft(快速傅里叶逆变换)函数

from scipy.fftpack importfft,ifft#创建一个随机值数组

x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])#对数组数据进行傅里叶变换

y =fft(x)print('fft:')print(y)print('\n')#快速傅里叶逆变换

yinv =ifft(y)print('ifft:')print(yinv)print('\n')

输出

fft:

[4.5 +0.j 2.08155948-1.65109876j -1.83155948+1.60822041j

-1.83155948-1.60822041j 2.08155948+1.65109876j]

ifft:

[1. +0.j 2. +0.j 1. +0.j -1. +0.j 1.5+0.j]

可以看到fft,ifft返回的都是复数。ifft返回的结果中,复数的虚部都是0,实部与原始数据x一致。

这些点的频率无法计算,因为没有设置这N个点的时间长度。如不理解,不必深究,后面会介绍。

理解fft变换结果

我们知道,傅里叶变换把时域信号变为频域信号。在离散傅里叶变换中,频域信号由一系列不同频率的谐波(频率成倍数)组成。fft返回值是一个复数数组,每个复数表示一个正弦波。通常一个波形由振幅,相位,频率三个变量确定,可以从fft的返回值里,获取这些信息。

假设a是时域中的周期信号,采样频率为Fs,采样点数为N。如果A[N] = fft(a[N]),返回值A[N]是一个复数数组,其中:

A[0]表示频率为0hz的信号,即直流分量。

A[1:N/2]包含正频率项,A[N/2:]包含负频率项。正频率项就是转化后的频域信号,通常我们只需要正频率项,即前面的n/2项,负频率项是计算的中间结果(正频率项的镜像值)。

每一项的频率计算:假设A[i]为数组中的元素,表示一个波形,该波形的频率 = i * Fs / N

A[i] = real + j * imag,是一个复数,相位就是复数的辐角,相位 = arg(real/imag)

类似的,振幅就是复数的模,振幅 = sqrt(real^2+imag^2)。但是fft的返回值的模是放大值,直流分量的振幅放大了N倍,弦波分量的振幅放大了N/2倍。

频率分辨率

频率分辨率是离散傅里叶变换(DFT)频域相邻刻度之间的实际频率之差。采样时,数据采样了T秒(T = 采样点数N / 采样频率Fs),信号的成分中周期最大也就是T秒,最低频率即“基频”就等于1 / T,也就是Fs / N,这就是频率分辨率。基频 = Fs / N,各个谐波的频率就是 i * Fs / N,这个公式用于计算各个波形的频率。

示例

importnumpy as npfrom scipy.fftpack importfft#采样点数

N = 4000

#采样频率 (根据采样定理,采样频率必须大于信号最高频率的2倍,信号才不会失真)

Fs = 8000x= np.linspace(0.0, N/Fs, N)#时域信号,包含:直流分量振幅1.0,正弦波分量频率100hz/振幅2.0, 正弦波分量频率150Hz/振幅0.5/相位np.pi

y = 1.0 + 2.0 * np.sin(100.0 * 2.0*np.pi*x) + 0.5*np.sin(150.0 * 2.0*np.pi*x +np.pi)#进行fft变换

yf =fft(y)#获取振幅,取复数的绝对值,即复数的模

abs_yf =np.abs(yf)#获取相位,取复数的角度

angle_y=np.angle(yf)#直流信号

print('\n直流信号')print('振幅:', abs_yf[0]/N) #直流分量的振幅放大了N倍

#100hz信号

index_100hz = 100 * N // Fs #波形的频率 = i * Fs / N,倒推计算索引:i = 波形频率 * N / Fs

print('\n100hz波形')print('振幅:', abs_yf[index_100hz] * 2.0/N) #弦波分量的振幅放大了N/2倍

print('相位:', angle_y[index_100hz])#150hz信号

index_150hz = 150 * N // Fs #波形的频率 = i * Fs / N,倒推计算索引:i = 波形频率 * N / Fs

print('\n150hz波形')print('振幅:', abs_yf[index_150hz] * 2.0/N) #弦波分量的振幅放大了N/2倍

print('相位:', angle_y[index_150hz])print('100hz与150hz相位差:', angle_y[index_150hz] -angle_y[index_100hz])print('\n')

输出

直流信号

振幅:1.0100hz波形

振幅:1.9989359813189005相位:-1.5315264186250062150hz波形

振幅:0.5008489983048182相位:1.6297011890497097100hz与150hz相位差:3.161227607674716

可以看到,正弦波的相位不一定从0开始,但波形之间的相位差确实s约等于一个pi(值跟采样频率与采样点数有关系)。

离散余弦变换(DCT)

由于许多要处理的信号都是实信号,在使用FFT时,对于实信号,傅立叶变换的共轭对称性导致在频域中有一半的数据冗余。

离散余弦变换(DCT)是对实信号定义的一种变换,变换后在频域中得到的也是一个实信号,相比离散傅里叶变换DFT而言, DCT可以减少一半以上的计算。DCT还有一个很重要的性质(能量集中特性):大多书自然信号(声音、图像)的能量都集中在离散余弦变换后的低频部分,因而DCT在(声音、图像)数据压缩中得到了广泛的使用。由于DCT是从DFT推导出来的另一种变换,因此许多DFT的属性在DCT中仍然是保留下来的。

SciPy.fftpack中,提供了离散余弦变换(DCT)与离散余弦逆变换(IDCT)的实现。

示例

importnumpy as npfrom scipy.fftpack importdct,idct

y= dct(np.array([4., 3., 5., 10., 5., 3.]))print(y)

输出

[ 60. -3.48476592 -13.85640646 11.3137085 6.-6.31319305]

离散余弦逆变换(idct),是离散余弦变换(DCT)的反变换。

示例

importnumpy as npfrom scipy.fftpack importdct,idct

y= idct(np.array([4., 3., 5., 10., 5., 3.]))print(y)

输出

[ 39.15085889 -20.14213562 -6.45392043 7.13341236 8.14213562

-3.83035081]

python计算复数的辐角_Python机器学习(五十六)SciPy fftpack(傅里叶变换)相关推荐

  1. python计算复数的辐角_Python 自定义类中的函数和运算符重载

    如果你曾在字符串(str)对象上进行过 + 或 * 运算,你一定注意到它跟整数或浮点数对象的行为差异: >>> # 加法 >>> 1 + 2 3 >>& ...

  2. python计算复数的辐角_python做傅里叶变换

    傅里叶变换(fft) 法国科学家傅里叶提出,任何一条周期曲线,无论多么跳跃或不规则,都能表示成一组光滑正弦曲线叠加之和.傅里叶变换即是把一条不规则的曲线拆解成一组光滑正弦曲线的过程. 傅里叶变换的目的 ...

  3. python计算复数的辐角,(Python 3)1051复数乘法(15分),python31051

    1051 复数乘法 (15分) 复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i​2​​=−1:也可以写成极坐标下的指数形式 (R×e​(Pi)​​),其 ...

  4. python卡方分箱_机器学习(十六)特征工程之数据分箱

    1 分箱简介 数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,是一种将多个连续值分组为较少数量的"分箱"的方法. 例如,例如我们有一组关于人年龄的 ...

  5. [Python从零到壹] 五十六.图像增强及运算篇之图像平滑(中值滤波、双边滤波)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. Python编程基础:第五十六节 filter函数Filter

    第五十六节 filter函数Filter 前言 实践 前言 filter函数的作用是对可迭代对象内部的元素按照特定条件进行过滤,其书写方式为filter(function, iterable),第一个 ...

  7. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  8. 合肥工业大学机器人技术五十六题

    合肥工业大学机器人技术五十六题 题目要求 //拿球后行为,利用已有 Worldmodel(21) (1)在 playOn 模式下,拿到球以后朝前方快速带球. (2)在 PlayOn 模式下,拿到球以后 ...

  9. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星 ...

最新文章

  1. puppet运维自动化之yum仓库管理
  2. resilience4j小试牛刀
  3. Android 从 Android 本地图库选择多个图片
  4. Eclipse轻松玩转SmartFramework
  5. java快速排序算法_JAVA版排序算法之快速排序示例
  6. 11月中30个精心设计的网站案例精选
  7. Ubuntu apache 禁止目录浏览
  8. leetcode - 84. 柱状图中最大的矩形
  9. java定义int函数_Java自定义函数的四种类型
  10. 在表达式 T(n) = 2T(n/2) + O(1) 与 T(1) = O(1) 中,T(n) 的时间复杂度为多少?
  11. 图解JVM内存三大核心区域及其JVM内存案例实战剖析
  12. docker进阶与实战 3 理解docker镜像
  13. java并发编程 Lock
  14. 图解TCPIP---第五章---IP协议相关技术
  15. 5G O-RAN 一体式小基站硬件白盒化的参考架构
  16. 计算机考试怎么做word,word怎么做弧形文字
  17. Laravel文档梳理8、中间件
  18. IDO-SBC3019-V1B:PX30 超强 CPU 搭载 Android/Linux 系统(Android8.1)
  19. 携程一面(2021-1-26):凉经。面试职位:后台开发工程师(2021届应届生)
  20. 搭建表白网站详细教程,小白也可以学懂!!!!

热门文章

  1. 一道疯狂bypass的题目
  2. 谷歌人工智能产生自我意识了!聊天记录曝光!机器真的只是机器吗?
  3. Centos 7 图形化界面安装
  4. 前端-HTML基础入门
  5. Android马甲包封装上架
  6. tweenMax下载和使用
  7. linux php安装xsl扩展,11.32 php扩展模块安装
  8. NSSCTF部分复现
  9. 高纯度钨酸铜粉末/钨酸铁粉末/钨酸亚铁粉末/硫化铋粉末/铬酸铋粉末/氧化锆粉末/铬酸钡粉末
  10. 微商相册服务器维护,微商相册