音频处理六:(音频的反FFT)
生活随笔
收集整理的這篇文章主要介紹了
音频处理六:(音频的反FFT)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
程序設計六:音頻的反FFT
一:需求分析
? FFT變換是將信號從時域轉(zhuǎn)換到頻域,這樣在時域復雜的信號轉(zhuǎn)換到頻域看起來就方便容易了很多。但有時候也需要將頻域信號轉(zhuǎn)換到時域,所以這時運用到IFFT變換。
逆向快速傅里葉變換(IFFT)的計算原理是將頻域(注意頻域是復數(shù))數(shù)據(jù)進行取共軛復數(shù)(虛部取反),然后再進行FFT變換,這樣便將頻域信號轉(zhuǎn)換到時域。因為FFT變換的結(jié)果是復數(shù),所以從頻域進行FFT變換過來的結(jié)果也是復數(shù),而此時只需取復數(shù)的實部,再除以N,便是原時域信號。
wavtxtifft -i fft.txt -o wavtxt.txt二:參考知識
1.本地.txt信息
fft_BAC009S0003W0121.txt BAC009S0003W0121.wav語音進行FFT變換后的取值2.ifft后結(jié)果
wavetxt.txt 是fft_BAC009S0003W0121.txt反傅里葉變換后的數(shù)據(jù) BAC009S0003W0121.txt 是BAC009S0003W0121.wav原始采樣值三:python代碼
復數(shù)對象擁有數(shù)據(jù)屬性,分別為該復數(shù)的實部和虛部。復數(shù)還擁有conjugate方法,調(diào)用它可以返回該復數(shù)的共軛復數(shù)對象。
complex_array = np.loadtxt(input, dtype=np.complex) # f=np.conjugate(complex_array) f = complex_array.conjugate() # 取共軛復數(shù)先將要做Ifft的數(shù)據(jù)取共軛,然后fft,結(jié)果再取共軛后除以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) # 返回浮點數(shù)x的四舍五入值。完整代碼
holiday06.py import numpy as np import sys import getopt ''' 逆向快速傅里葉變換(IFFT)的計算原理是將頻域(注意頻域是復數(shù))數(shù)據(jù)進行取共軛復數(shù)(虛部取反), 然后再進行FFT變換,這樣便將頻域信號轉(zhuǎn)換到時域。 因為FFT變換的結(jié)果是復數(shù),所以從頻域進行FFT變換過來的結(jié)果也是復數(shù),而此時只需取復數(shù)的實部,便是原時域信號。先將要做Ifft的數(shù)據(jù)取共軛,然后fft, 結(jié)果再取共軛后處以N,結(jié)果就是ifft的結(jié)果。不過和直接ifft算法相比有精度上的誤差。 ''' def main(argv):try:opts, args = getopt.getopt(argv, "-h-i:-o:", ["help", "input=", "output="])except getopt.GetoptError:print('將讀取到的FFT數(shù)據(jù),進行快速傅里葉逆變換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數(shù)據(jù),進行快速傅里葉逆變換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() # 取共軛復數(shù)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) # 返回浮點數(shù)x的四舍五入值。file = open(output, 'w')for i in range(length):# s = str(data[i, 0]).replace('[', ").replace('[',")# 同時打印左右聲道數(shù)據(jù),中間空格分開s = str(original_f[i]).replace('[', ").replace('[',")s = s.replace("'", ").replace(',',") + '\n' # 去除單引號,逗號,每行末尾追加換行符file.write(s)file.close()if __name__ == "__main__":# sys.argv[1:]為要處理的參數(shù)列表,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四:實現(xiàn)結(jié)果
1.請求幫助
python holiday06.py -h2.數(shù)據(jù)IFFT
- -i 輸入FFT數(shù)據(jù)
- -o 保存的文件
五:結(jié)果顯示及分析
1.結(jié)果顯示
wavetxt.txt是fft_BAC009S0003W0121.txt反傅里葉變換后的數(shù)據(jù)
2.結(jié)果比對
BAC009S0003W0121.txt 是BAC009S0003W0121.wav原始采樣值
與原始采樣值數(shù)據(jù)比對,結(jié)果為一致
總結(jié)
以上是生活随笔為你收集整理的音频处理六:(音频的反FFT)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音频处理五:(音频的FFT计算)
- 下一篇: 音频处理七:(极坐标转换)