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

程序设计六:音频的反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原始采样值

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

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐维康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值