音频处理五:(音频的FFT计算)

程序设计五:音频的FFT计算

完整工程文件:

链接:https://pan.baidu.com/s/1dcoTGhIeDxsRz-RUr2Paxw 
提取码:jy48

一:需求分析

通过使用快速傅立叶变换来增加语音谐波的幅度,从而提高语音质量:将时域信号转换为频域,然后处理频谱,然后将其转换回时域。我们的目的在于增加振幅,改善语音质量,确保音频没有削波或失真。将产生的时域信号另存为WAV(16位)并将其包括在提交中。指定增加谐波幅度的量以及声音的变化方式。

wavtxtfft -i yyy.txt -o fft.txt

yyy.txt可以是一行一个数的格式。

也可以是:一行,空格分隔的多个数。

1 2 3 4 5 6

fft.txt格式:

1+i3
3+i-4
...

1+i3	3+i-4	。。。

yyy.txt还可以是分帧的输出格式

则FFT输出格式对应于yyy.txt的分帧格式。(文件存矩阵)

二:参考知识

1.本地.txt信息

BAC009S0003W0121.txt 声道数1 采样率16000 量化位数2的BAC009S0003W0121.wav的采样值
frame01.txt BAC009S0003W0121.wav进行帧长200 帧移100的分帧信息

2.fft后结果

fft.txt frame01.txt分帧所产生的FFT数据
fft_BAC009S0003W0121.txt BAC009S0003W0121.txt没有分帧产生的FFT数据

三:python代码

holiday05.py
import numpy as np
import sys
import getopt

def main(argv):
    try:

        #opts, args = getopt.getopt(argv, "-h-i:-f:-o:", ["help", "input=", "framelength", "overlap"])
         opts, args = getopt.getopt(argv, "-h-i:-o:", ["help", "input=", "output="])
    except getopt.GetoptError:
        print('将读取到的采样点,包括分帧后的数据进行快速傅里叶变换')
        print('python holiday05.py -i frame01.txt -o fft.txt')
        sys.exit(2)

    # 处理 返回值options是以元组为元素的列表。
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            print("音频的FFT")
            print('将读取到的采样点,包括分帧后的数据进行快速傅里叶变换')
            print('python holiday05.py -i frame01.txt -o fft.txt')
            sys.exit()
        elif opt in ("-i", "--input"):
            input = arg
        elif opt in ("-o", "--output"):
            output = arg

            wave_data = np.loadtxt(input, dtype=np.float32)

            # signal = wave_data / np.max(wave_data)   # 归一化,标准化
            # fft_signal = np.fft.fft(signal)
            fft_signal = np.fft.fft(wave_data)
            #fft_data = fft(wave_data)
            fft_signal = fft_signal.T  # 转置是为了下面打印与fft的结果一致

            length = len(fft_signal)

            fft_len = len(fft_signal.T)
            file = open(output, 'w')
            # np.savetxt(fft_signal, fft_signal, fmt='%s', delimiter=' ') # 写入train_output.txt(此处是一股脑的全写进去,并没有做任何的分行处理)
            c1=fft_signal.ndim#判断数据是一维还是二维
            #print(c1)

            if c1==2:
                for i in range(fft_len):
                    for j in range(length):
                        # s = str(bins[i,0]).replace('[',").replace('[',")+'\t'+str(data[i]).replace('[',").replace('[',")#去除[],这两行按数据不同,可以选择
                        # s = str(data[i, 0]).replace('[', ").replace('[',")
                        s = str(fft_signal[j, i]).replace('[', ").replace(']',")
                        s = s.replace('(', '').replace(')', '') + ' '  # 去除小括号,每个数据加空格
                        s = s.replace("'", ").replace(',',")

                        file.write(s)
                    file.write('\n')  # 每行读取完以后换行
                file.close()
            else:
                np.savetxt(output,fft_signal )

 #, fmt='%s', delimiter=' '



if __name__ == "__main__":
    # sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。
    main(sys.argv[1:])


#python holiday05.py -i frame01.txt -o fft.txt
#python holiday05.py -i BAC009S0003W0121.txt -o fft_BAC009S0003W0121.txt
#python holiday05.py -i BAC009S0003W0121.txt -o fft02_BAC009S0003W0121.txt

四:实现结果

1.请求帮助

python holiday05.py -h

音频处理五:(音频的FFT计算)_第1张图片

2.分帧数据FFT

  • -i 输入采样值点的文件(分帧数据)
  • -o 保存的文件
python holiday05.py -i frame01.txt -o fft.txt

3.无分帧数据的FFT

  • -i 输入采样值点的文件
  • -o 保存的文件
python holiday05.py -i BAC009S0003W0121.txt -o fft_BAC009S0003W0121.txt

音频处理五:(音频的FFT计算)_第2张图片

五:结果显示

1.fft.txt

frame01.txt分帧所产生的FFT数据
音频处理五:(音频的FFT计算)_第3张图片

2.fft_BAC009S0003W0121.txt

BAC009S0003W0121.txt没有分帧产生的FFT数据

音频处理五:(音频的FFT计算)_第4张图片

你可能感兴趣的:(语音识别)