欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

音频处理六:(音频的反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

音频处理六:(音频的反FFT)

2.数据IFFT

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

音频处理六:(音频的反FFT)

五:结果显示及分析

1.结果显示

wavetxt.txt是fft_BAC009S0003W0121.txt反傅里叶变换后的数据
音频处理六:(音频的反FFT)

2.结果比对

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

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

音频处理六:(音频的反FFT)

相关标签: 语音识别