音频处理六:(音频的反FFT)
程序员文章站
2022-07-13 14:41:41
...
程序设计六:音频的反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 = arg
elif opt in ("-o", "--output"):
output = arg
# fft_BAC009S0003W0121.txt
complex_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原始采样值
与原始采样值数据比对,结果为一致
上一篇: Sphinx语音识别
下一篇: MATLAB GUI 语音信号分析系统