音频处理四:(音频的分帧)
程序設(shè)計(jì)四:音頻的分幀
一:需求分析
為了分析讀人數(shù)據(jù),通常進(jìn)行分幀處理。在分幀中,往往設(shè)置在相鄰兩幀之間有一部分重疊。其原因是:語(yǔ)音信號(hào)是時(shí)變的,在短時(shí)范圍內(nèi)特征變化較小,所以作為穩(wěn)態(tài)來(lái)處理;但超出這短時(shí)范圍語(yǔ)音信號(hào)就有變化了。在相鄰兩幀之間基音發(fā)生了變化,如正好是兩個(gè)音節(jié)之間, 或正好是聲母向韻母過(guò)渡,等等,這時(shí),其特征參數(shù)有可能變化較大,但為了使特征參數(shù)平滑地變化,在兩個(gè)不重疊的幀之間插一些幀來(lái)提取特征參數(shù),這就形成了相鄰幀之間有重疊部分。
將本地的采樣數(shù)據(jù).txt讀出,分幀以后保存到另一個(gè).txt文件,需要考慮單聲道和雙聲道
wavtxtframe -i yyy.txt -o zzz.txt -framelength 4 -overlap 2二:參考知識(shí)
1.文件知識(shí)
本地.txt信息
lanTian2.txt 聲道數(shù)1 采樣率8000 量化位數(shù)2的lanTian2.mav的采樣值 BAC009S0003W0121.txt 聲道數(shù)1 采樣率16000 量化位數(shù)2的BAC009S0003W0121.wav的采樣值2.分幀介紹
wlen為幀長(zhǎng),inc為幀移,重疊部分為overlap,overlap=wlen - inc
信號(hào)幀數(shù)為:
nf=(N?overlap)?/inc?=(N?wlen)/inc+1n f=(N-\text { overlap) } / \text { inc }=(N-w l e n) / i n c+1 nf=(N??overlap)?/?inc?=(N?wlen)/inc+1
np.ceil向上取整,所以會(huì)導(dǎo)致實(shí)際分幀后的長(zhǎng)度大于信號(hào)本身的長(zhǎng)度,所以要對(duì)原來(lái)的信號(hào)進(jìn)行補(bǔ)零,類似與FFT變換中的數(shù)據(jù)點(diǎn)不夠補(bǔ)零達(dá)到采樣點(diǎn)的數(shù)量。
pad_length = int((nf - 1) * inc + wlen) # 所有幀加起來(lái)總的鋪平后的長(zhǎng)度 zeros = np.zeros((pad_length - signal_length,)) # 不夠的長(zhǎng)度使用0填補(bǔ),類似于FFT中的擴(kuò)充數(shù)組操作#np.concatenate()連接兩個(gè)維度相同的矩陣 pad_signal = np.concatenate((signal, zeros)) # 填補(bǔ)后的信號(hào)記為pad_signal三:python代碼
holiday04.py import wave import numpy as np import sys import getoptdef enframe(signal, wlen, inc):'''參數(shù)含義:signal:原始音頻型號(hào)nw:每一幀的長(zhǎng)度inc:相鄰幀的間隔'''signal_length = len(signal) # 信號(hào)總長(zhǎng)度if signal_length <= wlen: # 若信號(hào)長(zhǎng)度小于一個(gè)幀的長(zhǎng)度,則幀數(shù)定義為1nf = 1else: # 否則,計(jì)算幀數(shù)nf = int(np.ceil((1.0 * signal_length - wlen + inc) / inc))#np.ceil計(jì)算大于等于改值的最小整數(shù),將小數(shù)點(diǎn)后部分刪除pad_length = int((nf - 1) * inc + wlen) # 所有幀加起來(lái)總的鋪平后的長(zhǎng)度zeros = np.zeros((pad_length - signal_length,)) # 不夠的長(zhǎng)度使用0填補(bǔ),類似于FFT中的擴(kuò)充數(shù)組操作#np.concatenate()連接兩個(gè)維度相同的矩陣pad_signal = np.concatenate((signal, zeros)) # 填補(bǔ)后的信號(hào)記為pad_signalindices = np.tile(np.arange(0, wlen), (nf, 1)) + np.tile(np.arange(0, nf * inc, inc), (wlen, 1)).T# 相當(dāng)于對(duì)所有幀的時(shí)間點(diǎn)進(jìn)行抽取,得到nf*nw長(zhǎng)度的矩陣#tile() 函數(shù),就是將原矩陣橫向、縱向地復(fù)制展開(kāi)indices = np.array(indices, dtype=np.int32) # 將indices轉(zhuǎn)化為矩陣frames = pad_signal[indices] # 得到幀信號(hào)return frames#返回幀信號(hào)矩陣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:-f:-l:", ["help", "input=", "output=","framelength=","overlap="])except getopt.GetoptError:print('Error: python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100')print(' or: python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100')sys.exit(2)# 處理 返回值options是以元組為元素的列表。for opt, arg in opts:if opt in ("-h", "--help"):print("為真實(shí)還原,輸入的參數(shù)盡量和原語(yǔ)音一致")print('python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100')print('or: python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100')sys.exit()elif opt in ("-i", "--input"):input = argelif opt in ("-o", "--output"):output = argelif opt in ("-f", "--framelength"):framelength = int(arg)print(framelength)elif opt in ("-l", "--overlap"):overlap = int(arg)f = open(input)# f = open("wavData(left).txt")# f = open("lanTian2.txt")# wavData(left)line = f.readline()data_list = []while line:# 把切分出的列表的每個(gè)值, 把它們轉(zhuǎn)成np.short型, 并返回迭代器num = list(map(np.short, line.split())) # np.short# 用list函數(shù)把map函數(shù)返回的迭代器遍歷展開(kāi)成一個(gè)列表data_list.append(num)line = f.readline()f.close()wave_data = np.array(data_list)signal = wave_data.TFrame = enframe(signal[0], framelength, overlap) # signal[0]是為了保證維度一致file = open(output, 'w+')np.savetxt(file,Frame, fmt='%d', delimiter=' ')file.close()if __name__ == "__main__":# sys.argv[1:]為要處理的參數(shù)列表,sys.argv[0]為腳本名,所以用sys.argv[1:]過(guò)濾掉腳本名。main(sys.argv[1:])#python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100 #python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100 #python holiday04.py -i lanTian2.txt -o frame01.txt -f 200 -l 100四:實(shí)現(xiàn)結(jié)果
1.請(qǐng)求幫助
python holiday04.py -h2.單參數(shù)分幀
- -i 輸入采樣值點(diǎn)的文件
- -o 保存的文件
- -f 幀長(zhǎng)
- -l 幀移
3.多參數(shù)分幀
- -i 輸入采樣值點(diǎn)的文件
- -o 保存的文件
- –framelength 幀長(zhǎng)
- –overlap 幀移
五:結(jié)果分析
以BAC009S0003W0121.txt的內(nèi)容用本程序?qū)⒔Y(jié)果保存,再用matlab直接讀取原語(yǔ)音BAC009S0003W0121.wav進(jìn)行對(duì)比,結(jié)果為一致
1.matlab對(duì)比程序
程序4對(duì)比.m
%實(shí)驗(yàn)要求一:語(yǔ)音分幀顯示 clc clear all close all[x,Fs]=audioread('G:\python\holiday\BAC009S0003W0121.wav','native'); % 讀入數(shù)據(jù)文件 wlen=200; inc=100; % 給出幀長(zhǎng)和幀移 N=length(x); % 信號(hào)長(zhǎng)度 time=(0:N-1)/Fs; % 計(jì)算出信號(hào)的時(shí)間刻度 signal=enframe(x,wlen,inc)'; % 分幀 signal=signal';2.顯示結(jié)果
2.1 matlab結(jié)果
2.2 python生成的frame01.txt
總結(jié)
以上是生活随笔為你收集整理的音频处理四:(音频的分帧)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 音频处理一:(音频基本信息)
- 下一篇: 音频处理五:(音频的FFT计算)