Python 讀取WAV音頻文件 畫頻譜的實(shí)例
Python 讀取WAV文件
import wave import struct from scipy import * from pylab import * #讀取wav文件,我這兒讀了個自己用python寫的音階的wav filename = '1.wav' wavefile = wave.open(filename, 'r') # open for writing #讀取wav文件的四種信息的函數(shù)。期中numframes表示一共讀取了幾個frames,在后面要用到滴。 nchannels = wavefile.getnchannels() sample_width = wavefile.getsampwidth() framerate = wavefile.getframerate() numframes = wavefile.getnframes() print("channel",nchannels) print("sample_width",sample_width) print("framerate",framerate) print("numframes",numframes) #建一個y的數(shù)列,用來保存后面讀的每個frame的amplitude。 y = zeros(numframes) #for循環(huán),readframe(1)每次讀一個frame,取其前兩位,是左聲道的信息。右聲道就是后兩位啦。 #unpack是struct里的一個函數(shù),用法詳見http://docs.python.org/library/struct.html。簡單說來就是把#packed的string轉(zhuǎn)換成原來的數(shù)據(jù),無論是什么樣的數(shù)據(jù)都返回一個tuple。這里返回的是長度為一的一個 #tuple,所以我們?nèi)∷牡诹阄弧? for i in range(numframes): val = wavefile.readframes(1) left = val[0:2] #right = val[2:4] v = struct.unpack('h', left )[0] y[i] = v #framerate就是44100,文件初讀取的值。然后本程序最關(guān)鍵的一步!specgram!實(shí)在太簡單了。。。 Fs = framerate specgram(y, NFFT=1024, Fs=Fs, noverlap=900) show()
補(bǔ)充知識:matlab生成wav文件并用python驗(yàn)證
在進(jìn)行頻譜分析時,發(fā)現(xiàn)MATLAB和python讀取wav文件的波形不一致,導(dǎo)致不能得出正確結(jié)果,為了驗(yàn)證MATLAB和python哪部分有問題,于是有了這篇博客。
1、需求分析
用MATLAB生成一個正弦波并保存為wav文件,然后用python讀取這個wav文件畫出波形,查看python讀取出來的波形和matlab生成的波形是否一致。
2、代碼實(shí)現(xiàn)
2.1 MATLAB生成wav文件
Df=5; %頻率間隔 fs = 8000; %采樣頻率 T = 1/fs; %采樣周期 N=fs/Df; %序列點(diǎn)數(shù) time = (N-1)./fs; %第一個聲音片段的總時長 t=0:T:(N-1)./fs; y = sin(2*pi*200*t); %生成第一個聲音片段,注意需要用db2mag()函數(shù)把dB轉(zhuǎn)換成magnitude。 sound(y,fs) %可以播放聲音的函數(shù) sound() filename = ('sinwave.wav'); %給文件取名 plot(t,y) audiowrite(filename,y,fs) %存儲.wav音頻文件,在這里文件名為sinwave.wav
其中生成的正弦波波形如下圖所示:
2.2 python讀取wav文件
import wave import numpy as np import pylab as plt #打開wav文件 ,open返回一個的是一個Wave_read類的實(shí)例,通過調(diào)用它的方法讀取WAV文件的格式和數(shù)據(jù)。 f = wave.open(r"E:\練習(xí)\音頻信號處理\spectrum.m\sinwave.wav","rb") #讀取格式信息 #一次性返回所有的WAV文件的格式信息,它返回的是一個組元(tuple):聲道數(shù), 量化位數(shù)(byte單位), 采 #樣頻率, 采樣點(diǎn)數(shù), 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數(shù)據(jù),因此可以忽略最后兩個信息 params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4] #讀取波形數(shù)據(jù) #讀取聲音數(shù)據(jù),傳遞一個參數(shù)指定需要讀取的長度(以取樣點(diǎn)為單位) str_data = f.readframes(nframes) f.close() #將波形數(shù)據(jù)轉(zhuǎn)換成數(shù)組 #需要根據(jù)聲道數(shù)和量化單位,將讀取的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為一個可以計算的數(shù)組 wave_data = np.fromstring(str_data,dtype=np.short) #通過取樣點(diǎn)數(shù)和取樣頻率計算出每個取樣的時間。 time=np.arange(0,nframes)/framerate print(params) print(wave_data.max())#找出正弦波的峰值 #time 也是一個數(shù)組,與wave_data[0]或wave_data[1]配對形成系列點(diǎn)坐標(biāo) plt.plot(time,wave_data/32768) plt.show()
python讀取wav文件顯示出來的正弦波如下圖所示:
python讀取wav文件的信息及求出波形峰值的結(jié)果如下圖所示:
我們可以看出峰值為32767(該wav文件有16bit,且?guī)б粋€符號位。215=32768215=32768 ),我們進(jìn)行歸一化處理后的到波形如下圖所示:
由上圖可以看出MATLAB生成的正弦波保存為wav文件后,python讀取該wav文件。兩種語言下正弦波相同。
以上這篇Python 讀取WAV音頻文件 畫頻譜的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
對python 中re.sub,replace(),strip()的區(qū)別詳解
今天小編就為大家分享一篇對python 中re.sub,replace(),strip()的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07使用python實(shí)現(xiàn)滑動驗(yàn)證碼功能
這篇文章主要介紹了使用python實(shí)現(xiàn)滑動驗(yàn)證碼功能,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)模擬按鍵,自動翻頁看u17漫畫
這篇文章主要介紹了python實(shí)現(xiàn)模擬按鍵,自動翻頁看u17漫畫,十分簡單實(shí)用,需要的朋友可以參考下2015-03-03matplotlib 縱坐標(biāo)軸顯示數(shù)據(jù)值的實(shí)例
今天小編就為大家分享一篇matplotlib 縱坐標(biāo)軸顯示數(shù)據(jù)值的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05python進(jìn)行相關(guān)性分析并繪制散點(diǎn)圖詳解
這篇文章主要介紹了python進(jìn)行相關(guān)性分析并繪制散點(diǎn)圖,具有一定借鑒價值,需要的朋友可以參考下,希望能夠給你帶來幫助2021-09-09Django框架設(shè)置cookies與獲取cookies操作詳解
這篇文章主要介紹了Django框架設(shè)置cookies與獲取cookies操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架針對cookie操作的各種常見技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-05-05

python實(shí)現(xiàn)數(shù)據(jù)庫跨服務(wù)器遷移

python框架flask入門之路由及簡單實(shí)現(xiàn)方法