亚洲国产欧美一区二区三区f,亚洲A∨精品永久无码青草网,亚洲 暴爽 av人人爽日日碰,亚洲AV永久无码精心天堂久久_无码

電腦系統城官網 - 一鍵重裝系統-Win7旗艦版/win10 64位系統下載,唯一官網:www.outletmksalestore.com!

當前位置:首頁 > 腳本中心 > python > 詳細頁面

Python 讀取WAV音頻文件 畫頻譜的實例

時間:2020-03-14來源:電腦系統城作者:電腦系統城

Python 讀取WAV文件


 
  1. import wave
  2. import struct
  3. from scipy import *
  4. from pylab import *
  5.  
  6. #讀取wav文件,我這兒讀了個自己用python寫的音階的wav
  7. filename = '1.wav'
  8. wavefile = wave.open(filename, 'r') # open for writing
  9.  
  10. #讀取wav文件的四種信息的函數。期中numframes表示一共讀取了幾個frames,在后面要用到滴。
  11. nchannels = wavefile.getnchannels()
  12. sample_width = wavefile.getsampwidth()
  13. framerate = wavefile.getframerate()
  14. numframes = wavefile.getnframes()
  15.  
  16. print("channel",nchannels)
  17. print("sample_width",sample_width)
  18. print("framerate",framerate)
  19. print("numframes",numframes)
  20.  
  21. #建一個y的數列,用來保存后面讀的每個frame的amplitude。
  22. y = zeros(numframes)
  23.  
  24. #for循環,readframe(1)每次讀一個frame,取其前兩位,是左聲道的信息。右聲道就是后兩位啦。
  25. #unpack是struct里的一個函數,用法詳見http://docs.python.org/library/struct.html。簡單說來就是把#packed的string轉換成原來的數據,無論是什么樣的數據都返回一個tuple。這里返回的是長度為一的一個
  26. #tuple,所以我們取它的第零位。
  27. for i in range(numframes):
  28. val = wavefile.readframes(1)
  29. left = val[0:2]
  30. #right = val[2:4]
  31. v = struct.unpack('h', left )[0]
  32. y[i] = v
  33.  
  34. #framerate就是44100,文件初讀取的值。然后本程序最關鍵的一步!specgram!實在太簡單了。。。
  35. Fs = framerate
  36. specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
  37. show()

補充知識:matlab生成wav文件并用python驗證

在進行頻譜分析時,發現MATLAB和python讀取wav文件的波形不一致,導致不能得出正確結果,為了驗證MATLAB和python哪部分有問題,于是有了這篇博客。

1、需求分析

用MATLAB生成一個正弦波并保存為wav文件,然后用python讀取這個wav文件畫出波形,查看python讀取出來的波形和matlab生成的波形是否一致。

2、代碼實現

2.1 MATLAB生成wav文件


 
  1. Df=5; %頻率間隔
  2. fs = 8000; %采樣頻率
  3. T = 1/fs; %采樣周期
  4. N=fs/Df; %序列點數
  5. time = (N-1)./fs; %第一個聲音片段的總時長
  6. t=0:T:(N-1)./fs;
  7. y = sin(2*pi*200*t); %生成第一個聲音片段,注意需要用db2mag()函數把dB轉換成magnitude。
  8.  
  9. sound(y,fs) %可以播放聲音的函數 sound()
  10. filename = ('sinwave.wav'); %給文件取名
  11. plot(t,y)
  12. audiowrite(filename,y,fs) %存儲.wav音頻文件,在這里文件名為sinwave.wav

其中生成的正弦波波形如下圖所示:

Python 讀取WAV音頻文件 畫頻譜的實例

2.2 python讀取wav文件


 
  1. import wave
  2. import numpy as np
  3. import pylab as plt
  4.  
  5. #打開wav文件 ,open返回一個的是一個Wave_read類的實例,通過調用它的方法讀取WAV文件的格式和數據。
  6. f = wave.open(r"E:\練習\音頻信號處理\spectrum.m\sinwave.wav","rb")
  7. #讀取格式信息
  8. #一次性返回所有的WAV文件的格式信息,它返回的是一個組元(tuple):聲道數, 量化位數(byte單位), 采
  9. #樣頻率, 采樣點數, 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數據,因此可以忽略最后兩個信息
  10. params = f.getparams()
  11. nchannels, sampwidth, framerate, nframes = params[:4]
  12. #讀取波形數據
  13. #讀取聲音數據,傳遞一個參數指定需要讀取的長度(以取樣點為單位)
  14. str_data = f.readframes(nframes)
  15. f.close()
  16. #將波形數據轉換成數組
  17. #需要根據聲道數和量化單位,將讀取的二進制數據轉換為一個可以計算的數組
  18. wave_data = np.fromstring(str_data,dtype=np.short)
  19. #通過取樣點數和取樣頻率計算出每個取樣的時間。
  20. time=np.arange(0,nframes)/framerate
  21. print(params)
  22. print(wave_data.max())#找出正弦波的峰值
  23. #time 也是一個數組,與wave_data[0]或wave_data[1]配對形成系列點坐標
  24. plt.plot(time,wave_data/32768)
  25. plt.show()
  26.  

python讀取wav文件顯示出來的正弦波如下圖所示:

Python 讀取WAV音頻文件 畫頻譜的實例

python讀取wav文件的信息及求出波形峰值的結果如下圖所示:

Python 讀取WAV音頻文件 畫頻譜的實例

我們可以看出峰值為32767(該wav文件有16bit,且帶一個符號位。215=32768215=32768 ),我們進行歸一化處理后的到波形如下圖所示:

Python 讀取WAV音頻文件 畫頻譜的實例

由上圖可以看出MATLAB生成的正弦波保存為wav文件后,python讀取該wav文件。兩種語言下正弦波相同。

以上這篇Python 讀取WAV音頻文件 畫頻譜的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持我們。

分享到:

相關信息

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載

公眾號

亚洲国产欧美一区二区三区f,亚洲A∨精品永久无码青草网,亚洲 暴爽 av人人爽日日碰,亚洲AV永久无码精心天堂久久_无码 日本少妇又色又爽又高潮