如下所示:
# -*- coding: UTF-8 -*- import wave import numpy as np import matplotlib.pyplot as plt # 打開wav文件 ,open返回一個的是一個Wave_read類的實例,通過調用它的方法讀取WAV文件的格式和數據。 f = wave.open(r"D:\project\REC001.wav","rb") # 讀取格式信息 # 一次性返回所有的WAV文件的格式信息,它返回的是一個組元(tuple):聲道數, 量化位數(byte單位), 采 # 樣頻率, 采樣點數, 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數據,因此可以忽略最后兩個信息 params = f.getparams() [nchannels, sampwidth, framerate, nframes] = params[:4] # 讀取波形數據 # 讀取聲音數據,傳遞一個參數指定需要讀取的長度(以取樣點為單位) str_data = f.readframes(nframes) f.close() # 將波形數據轉換成數組 # 需要根據聲道數和量化單位,將讀取的二進制數據轉換為一個可以計算的數組 wave_data = np.fromstring(str_data,dtype = np.short) # 將wave_data數組改為2列,行數自動匹配。在修改shape的屬性時,需使得數組的總長度不變。 wave_data.shape = -1,2 # 轉置數據 wave_data = wave_data.T # 通過取樣點數和取樣頻率計算出每個取樣的時間。 time=np.arange(0,nframes/2)/framerate # print(params) plt.figure(1) # time 也是一個數組,與wave_data[0]或wave_data[1]配對形成系列點坐標 plt.subplot(211) plt.plot(time,wave_data[0]) plt.xlabel("time/s") plt.title('Wave') N=44100 start=0 # 開始采樣位置 df = framerate/(N-1) # 分辨率 freq = [df*n for n in range(0,N)] # N個元素 wave_data2=wave_data[0][start:start+N] c=np.fft.fft(wave_data2)*2/N # 常規顯示采樣頻率一半的頻譜 plt.subplot(212) plt.plot(freq[:round(len(freq)/2)],abs(c[:round(len(c)/2)]),'r') plt.title('Freq') plt.xlabel("Freq/Hz") plt.show()
以上這篇使用python進行波形及頻譜繪制的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
