程序设计六:音频的反FFT

一:需求分析

​ FFT变换是将信号从时域转换到频域,这样在时域复杂的信号转换到频域看起来就方便容易了很多。但有时候也需要将频域信号转换到时域,所以这时运用到IFFT变换。

逆向快速傅里叶变换(IFFT)的计算原理是将频域(注意频域是复数)数据进行取共轭复数(虚部取反),然后再进行FFT变换,这样便将频域信号转换到时域。因为FFT变换的结果是复数,所以从频域进行FFT变换过来的结果也是复数,而此时只需取复数的实部,再除以N,便是原时域信号。

wavtxtifft -i fft.txt -o wavtxt.txt

二:参考知识

1.本地.txt信息

fft_BAC009S0003W0121.txt BAC009S0003W0121.wav语音进行FFT变换后的取值

2.ifft后结果

wavetxt.txt 是fft_BAC009S0003W0121.txt反傅里叶变换后的数据
BAC009S0003W0121.txt 是BAC009S0003W0121.wav原始采样值

三:python代码

复数对象拥有数据属性,分别为该复数的实部和虚部。复数还拥有conjugate方法,调用它可以返回该复数的共轭复数对象。

complex_array = np.loadtxt(input, dtype=np.complex)
# f=np.conjugate(complex_array)
f = complex_array.conjugate()  # 取共轭复数

先将要做Ifft的数据取共轭,然后fft,结果再取共轭后除以N

f1 = np.fft.fft(f)
original_f = np.real(f1) / length  # 取出实部,并对其除以N。
# original_f=original_f.astype(np.round())
original_f = np.round(original_f)  # 返回浮点数x的四舍五入值。

完整代码

holiday06.py
import numpy as np
import sys
import getopt
'''
逆向快速傅里叶变换(IFFT)的计算原理是将频域(注意频域是复数)数据进行取共轭复数(虚部取反),
然后再进行FFT变换,这样便将频域信号转换到时域。
因为FFT变换的结果是复数,所以从频域进行FFT变换过来的结果也是复数,而此时只需取复数的实部,便是原时域信号。先将要做Ifft的数据取共轭,然后fft,
结果再取共轭后处以N,结果就是ifft的结果。不过和直接ifft算法相比有精度上的误差。
'''
def main(argv):try:opts, args = getopt.getopt(argv, "-h-i:-o:", ["help", "input=", "output="])except getopt.GetoptError:print('将读取到的FFT数据,进行快速傅里叶逆变换IFFT')print('python holiday06.py -i fft_BAC009S0003W0121.txt -o wavetxt.txt')sys.exit(2)# 处理 返回值options是以元组为元素的列表。for opt, arg in opts:if opt in ("-h", "--help"):print("音频的IFFT")print('将读取到的FFT数据,进行快速傅里叶逆变换IFFT')print('python holiday06.py -i fft_BAC009S0003W0121.txt -o wavetxt.txt')sys.exit()elif opt in ("-i", "--input"):input = argelif opt in ("-o", "--output"):output = arg# fft_BAC009S0003W0121.txtcomplex_array = np.loadtxt(input, dtype=np.complex)length = len(complex_array)  # 求N# f=np.conjugate(complex_array)f = complex_array.conjugate()  # 取共轭复数f1 = np.fft.fft(f)original_f = np.real(f1) / length  # 取出实部,并对其除以N。# original_f=original_f.astype(np.round())original_f = np.round(original_f)  # 返回浮点数x的四舍五入值。file = open(output, 'w')for i in range(length):# s = str(data[i, 0]).replace('[', ").replace('[',")# 同时打印左右声道数据,中间空格分开s = str(original_f[i]).replace('[', ").replace('[',")s = s.replace("'", ").replace(',',") + '\n'  # 去除单引号,逗号,每行末尾追加换行符file.write(s)file.close()if __name__ == "__main__":# sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。main(sys.argv[1:])#python holiday06.py -i fft_BAC009S0003W0121.txt -o wavetxt.txt
#python test03.py -i fft_BAC009S0003W0121.txt -o wavetxt.txt

四:实现结果

1.请求帮助

python holiday06.py -h

2.数据IFFT

  • -i 输入FFT数据
  • -o 保存的文件
python holiday06.py -i fft_BAC009S0003W0121.txt -o wavetxt.txt

五:结果显示及分析

1.结果显示

wavetxt.txt是fft_BAC009S0003W0121.txt反傅里叶变换后的数据

2.结果比对

BAC009S0003W0121.txt 是BAC009S0003W0121.wav原始采样值

与原始采样值数据比对,结果为一致

音频处理六:(音频的反FFT)相关推荐

  1. 低延迟音频中的音频解码优化策略

    文章目录 前言 音频播放 举个例子:PortAudio 回调函数 解码与播放 优化策略 1. 一次性读取音频到内存中 2. MMAP 3. 音频转码,再接 MMAP 4. 解码缓冲 总结 参考资料 前 ...

  2. Android 8.0 后使用AudioFocus音频焦点处理音频抢占问题

    今天写了一个关于播放audio的简单demo,发现程序无法抢占其他音频,具体表现在当有其他播放器在播放audio的时候,如果demo播放audio的话,那么会有两个audio同时播放:而且其他播放器也 ...

  3. 音频特征于音频信号提取总结

    这里写目录标题 1 语音的产生简介 2 声音特性​ 3. 声音的种类 计算机听觉的应用 4. 什么是音频特征 5 音频特征的类别 5.1 可以从以下几个角度区分 5.2. 常见音频特征举例 6. 音频 ...

  4. iOS 9音频应用播放音频之iOS 9音频播放进度

    iOS 9音频应用播放音频之iOS 9音频播放进度 iOS 9音频应用开发播放进度 音频文件在播放后经过了多久以及还有多久才可以播放完毕,想必是用户所关注的问题.为了解决这一问题,在很多的音乐播放器中 ...

  5. iOS 9音频应用播放音频之控制播放速度

    iOS 9音频应用播放音频之控制播放速度 iOS 9音频控制播放速度 iOS9音频文件在播放时是以一定的速度进行的.这个速度是可以进行更改的,从而实现iOS9音频文件的快速播放和慢速播放功能.要实现i ...

  6. iOS 9音频应用播放音频之音量设置与声道设置

    iOS 9音频应用播放音频之音量设置与声道设置 iOS 9音频应用音量设置 音量又称响度.音强,是指人耳对所听到的声音大小强弱的主观感受,其客观评价尺度是声音的振幅大小.在iOS 9音频应用的应用中, ...

  7. ​iOS 9音频应用播放音频之第一个ios9音频实例2

    ​iOS 9音频应用播放音频之第一个ios9音频实例2 ios9音频应用关联 iOS9音频应用中对于在主视图上添加的视图或控件,在使用它们时必须要与插座变量进行关联.ios9插座变量其实就是为主视图中 ...

  8. iOS 9音频应用播放音频之第一个ios9音频实例

    iOS 9音频应用播放音频之第一个ios9音频实例 第一个ios9音频实例 为了让开发者可以对上面的内容有更加深入的了解,本节将实现播放音频的第一个实例.在此实例中会涉及到项目的创建.界面设计.关联以 ...

  9. iOS 9音频应用播放音频之ios9音频基本功能

    iOS 9音频应用播放音频之ios9音频基本功能 在iOS 9音频应用开发中最为简单和常用的就是AVFoundation框架中的AVAudioPlayer类.虽然AVAudioPlayer类不能播放网 ...

最新文章

  1. 每年“骗”马云10亿,被骂大忽悠,他却当选中国工程院院士?
  2. 课程作业02——课程中的动手动脑问题
  3. JIRA介绍- 一个专业优秀的缺陷跟踪管理软件
  4. 关于用户空间和内核空间
  5. java单例方法_Java单例模式
  6. Python随手记—各种方法的使用
  7. 如何找出孔洞位置进行填充_电伴热带破损位置如何快速找出
  8. spring IOC 装配一个bean
  9. Veeam FAQ系列转载(一):备份
  10. 什么是validationQuery
  11. 腾讯首投AI芯片,领投燧原科技Pre-A轮3.4亿元融资
  12. YOLO3算法个人算法理解心得
  13. 【微信小程序】解决代码上传超过大小限制,小程序分包
  14. ps蒙版使用计算机一级,2014年计算机一级考试PS及基础模拟试题(1)
  15. 微信小程序学习笔记——常见组件【navigator】导航组件
  16. Disk-expansion
  17. 网络电视视频服务器所放位置,同样带宽,为什么用电视上的网络电视app看电视就卡,用运营商自己的iptv就不卡呢?...
  18. 四、Hibernate框架的API (三)-- Session对象
  19. 电信联通共享检测技术及防封杀
  20. pr图形模板预设怎么使用_Pr 2017版本Premiere使用标题预设动态图形,提示要安装AE...

热门文章

  1. spark ui的访问地址_Spark篇之HA集群搭建
  2. keil obj 文件 结构_keil下的STM32程序开发部署(一)
  3. linux软链接的创建、删除和更新
  4. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug...
  5. Python当中的a += a 与 a = a + a 的区别,可变类型与不可变类型的数据类型,引用传参...
  6. 手脱EZIP v1.0
  7. javascript 运算优先级
  8. view bitmap 截图
  9. flume1.8 开发指南学习感悟
  10. Android Studio-目录结构