音频处理六:(音频的反FFT)
生活随笔
收集整理的這篇文章主要介紹了
音频处理六:(音频的反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 = 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 -h2.數據IFFT
- -i 輸入FFT數據
- -o 保存的文件
五:結果顯示及分析
1.結果顯示
wavetxt.txt是fft_BAC009S0003W0121.txt反傅里葉變換后的數據
2.結果比對
BAC009S0003W0121.txt 是BAC009S0003W0121.wav原始采樣值
與原始采樣值數據比對,結果為一致
總結
以上是生活随笔為你收集整理的音频处理六:(音频的反FFT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音频处理五:(音频的FFT计算)
- 下一篇: 音频处理七:(极坐标转换)