傅里叶变换(fft)

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

傅里叶变换的目的是将时域(即时间域)上的信号转变为频域(即频率域)上的信号,随着域的变换,对同一个事物的了解角度也就随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。这就可以大量减少处理信号存储量。

例如:弹钢琴

假设有一时间域函数:y = f(x),根据傅里叶的理论它可以被分解为一系列正弦函数的叠加,他们的振幅A,频率ω或初相位φ不同:

$$y = A_1sin(\omega_1x+\phi_1) +  A_2sin(\omega_2x+\phi_2) +  A_2sin(\omega_2x+\phi_2) + R$$

所以傅里叶变换可以把一个比较复杂的函数转换为多个简单函数的叠加,看问题的角度也从时间域转到了频率域,有些的问题处理起来就会比较简单。

傅里叶变换相关函数

freqs = np.fft.fft.fftfreq(采样数量, 采样周期)  通过采样数与采样周期求得傅里叶变换分解所得数组的频率序列

np.fft.fft.fft(原序列)  原函数值的序列经过快速傅里叶变换得到一个复数数组,复数的模代表的是振幅,复数的辐角代表初相位

np.fft.fft.ifft(复数序列)  复数数组 经过逆向傅里叶变换得到合成的函数值数组

案例:针对合成波做快速傅里叶变换,得到分解波数组的频率、振幅、初相位数组,并绘制频域图像。

importnumpy as npimportmatplotlib.pyplot as pltimportnumpy.fft as fft

x= np.linspace(-2 * np.pi, 2 * np.pi, 1000)

n= 1000y=np.zeros(x.size)for i in range(1, n + 1):

y+= 4 * np.pi / (2 * i - 1) * np.sin((2 * i - 1) *x)

complex_array=fft.fft(y)print(complex_array.shape) #(1000,)

print(complex_array.dtype) #complex128

print(complex_array[0]) #(-2.1458390619955026e-12+0j)

y_new =fft.ifft(complex_array)

plt.subplot(311)

plt.grid(linestyle=':')

plt.plot(x, y, label='y') #y是1000个相加后的正弦序列

plt.subplot(312)

plt.plot(x, y_new, label='y_new', color='orangered') #y是ifft变换后的序列

#得到分解波的频率序列

freqs = fft.fftfreq(x.size, x[1] -x[0])#复数的模为信号的振幅(能量大小)

complex_array =fft.fft(y)

pows=np.abs(complex_array)

plt.subplot(313)

plt.title('Frequency Domain', fontsize=16)

plt.xlabel('Frequency', fontsize=12)

plt.ylabel('Power', fontsize=12)

plt.tick_params(labelsize=10)

plt.grid(linestyle=':')

plt.plot(freqs[freqs> 0], pows[freqs > 0], c='orangered', label='Frequency')

plt.legend()

plt.tight_layout()

plt.show()

基于傅里叶变换的频域滤波

含噪信号是高能信号与低能噪声叠加的信号,可以通过傅里叶变换的频域滤波实现降噪。

通过FFT使含噪信号转换为含噪频谱,去除低能噪声,留下高能频谱后再通过IFFT留下高能信号。

案例:基于傅里叶变换的频域滤波为音频文件去除噪声(noiseed.wav数据集地址)。

1、读取音频文件,获取音频文件基本信息:采样个数,采样周期,与每个采样的声音信号值。绘制音频时域的:时间/位移图像

importnumpy as npimportnumpy.fft as nfimportscipy.io.wavfile as wfimportmatplotlib.pyplot as plt#读取音频文件

sample_rate, noised_sigs = wf.read('./da_data/noised.wav')print(sample_rate) #sample_rate:采样率44100

print(noised_sigs.shape) #noised_sigs:存储音频中每个采样点的采样位移(220500,)

times = np.arange(noised_sigs.size) /sample_rate

plt.figure('Filter')

plt.subplot(221)

plt.title('Time Domain', fontsize=16)

plt.ylabel('Signal', fontsize=12)

plt.tick_params(labelsize=10)

plt.grid(linestyle=':')

plt.plot(times[:178], noised_sigs[:178], c='orangered', label='Noised')

plt.legend()

2、基于傅里叶变换,获取音频频域信息,绘制音频频域的:频率/能量图像

#傅里叶变换后,绘制频域图像

freqs = nf.fftfreq(times.size, times[1] -times[0])

complex_array=nf.fft(noised_sigs)

pows=np.abs(complex_array)

plt.subplot(222)

plt.title('Frequency Domain', fontsize=16)

plt.ylabel('Power', fontsize=12)

plt.tick_params(labelsize=10)

plt.grid(linestyle=':')#指数增长坐标画图

plt.semilogy(freqs[freqs > 0], pows[freqs > 0], c='limegreen', label='Noised')

plt.legend()

3、将低频噪声去除后绘制音频频域的:频率/能量图像

#寻找能量最大的频率值

fund_freq =freqs[pows.argmax()]#where函数寻找那些需要抹掉的复数的索引

noised_indices = np.where(freqs !=fund_freq)#复制一个复数数组的副本,避免污染原始数据

filter_complex_array =complex_array.copy()

filter_complex_array[noised_indices]=0

filter_pows=np.abs(filter_complex_array)

plt.subplot(224)

plt.xlabel('Frequency', fontsize=12)

plt.ylabel('Power', fontsize=12)

plt.tick_params(labelsize=10)

plt.grid(linestyle=':')

plt.plot(freqs[freqs>= 0], filter_pows[freqs >= 0], c='dodgerblue', label='Filter')

plt.legend()

4、基于逆向傅里叶变换,生成新的音频信号,绘制音频时域的:时间/位移图像

filter_sigs =nf.ifft(filter_complex_array).real

plt.subplot(223)

plt.xlabel('Time', fontsize=12)

plt.ylabel('Signal', fontsize=12)

plt.tick_params(labelsize=10)

plt.grid(linestyle=':')

plt.plot(times[:178], filter_sigs[:178], c='hotpink', label='Filter')

plt.legend()

5、重新生成音频文件

#生成音频文件

wf.write('./da_data/filter.wav', sample_rate, filter_sigs)

plt.show()

python计算复数的辐角_python做傅里叶变换相关推荐

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

    SciPy提供了fftpack模块,包含了傅里叶变换的算法实现. 傅里叶变换把信号从时域变换到频域,以便对信号进行处理.傅里叶变换在信号与噪声处理.图像处理.音频信号处理等领域得到了广泛应用. 如需进 ...

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

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

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

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

  4. python计算最大回撤_Python做量化投资评价策略风险 如何计算最大回撤?

    2021年FRM主要时间节点 2020年12月 第一阶段报名时间:2020/12/01 - 2021/01/31 首次注册:$1000 USD / 非首次注册:$590 USD 2021年02月 第二 ...

  5. python计算图形面积的方法_python计算不规则图形面积算法

    https://www.xin3721.com/eschool/pythonxin3721/ 介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的 ...

  6. python计算长方形面积代码_Python计算两个矩形重合面积代码实例

    这篇文章主要介绍了Python 实现两个矩形重合面积代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 计算两个矩形的重合面积 imp ...

  7. python计算复数的平方根将产生_Python_每日习题_0003_完全平方数

    # 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? # 程序分析 因为168对于指数爆炸来说实在太小了,所以可以直接省略数学分析,用最朴素的方法来获取 ...

  8. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  9. python计算最大公约数函数_python如何求解两数的最大公约数

    题目: 给定两个自然数,求这两个数的最大公约数. 分析: 单看题目的话,非常简单,我们可以循环遍历自然数,如果能够整除两个自然数,就把这个数记下来,在这些记录中找到最大的一个. 但是这样做有几个缺点: ...

最新文章

  1. Qt creator使用笔记
  2. 比较简单的在线图像编辑软件:觉得还行
  3. java 没有提示信息,ActionErrors没有提示信息
  4. JQuery课堂学习笔记
  5. mysql 缓存监控_MySql 缓存查询原理与缓存监控 和 索引监控
  6. 关于自绘CListBox的一些疑惑
  7. 第三只眼使用局域网版本还是网络版好_iOS13.4测试版使用3天后,发现3个优化,建议升级!...
  8. oracle 其他用户表主键,Oracle中查看所有的表,用户表,列名,主键,外键
  9. python信道仿真_Hanlp在Python环境中安装及使用.md
  10. PETSHOP模式IDAL,SQLSERVERDAL,存储过程以及模型类代码的生成工具
  11. 48. Be aware of template metaprogramming
  12. Chatbot - NLP
  13. VB脚本:快速入门教程
  14. 商场收银系统服务器安装在哪里,收银系统怎么安装?详细步骤分享
  15. 计算机属于人文社会科学吗,五、人文社会科学与自然科学的主要区别
  16. 项目实施中的风险控制与管理
  17. phpMyAdmin安装详解
  18. 【论文调研】IJCAI-2019 论文投稿与录用调研报告
  19. 微软的sdk以及azure_.NET的Azure SDK:关于困难错误搜索的故事
  20. 计算机原理寄存器基础知识,计算机组成原理基础知识

热门文章

  1. 学习正则有感by魔芋(命名问题)
  2. 小孟5w接了个盲盒小程序,三周开发完毕
  3. linux iptables实现单机多ip出口ip负载均衡(宽带叠加)
  4. java--删除TMP文件
  5. 开源SDK实现Android视频直播
  6. 刚刚,中国电子学会给阿里云飞天颁发了15年来首个特等奖
  7. CSS 实现音频loding动画
  8. 从标注好的xml文件中截取坐标点(人脸框四个点坐标)人脸图像并保存在指定文件夹
  9. 局部加权回归(LWR) Matlab模板
  10. 工具--Typora详解