import wave
import pyaudio
import numpy
import pylab
#開啟WAV文件,檔案路徑根據需要做修改
wf = wave.open("D:\\Python\\wavs\\Do-piano-2.20s.wav", "rb")
#建立PyAudio物件
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
nframes = wf.getnframes()
framerate = wf.getframerate()
#讀取完整的幀資料到str_data中,這是一個string型別的資料
str_data = wf.readframes(nframes)
wf.close()
#將波形資料轉換為陣列
# A new 1-D array initialized from raw binary or text data in a string.
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
#將wave_data陣列改為2列,行數自動匹配。在修改shape的屬性時,需使得陣列的總長度不變。
wave_data.shape = -1,2
#將陣列轉置
wave_data = wave_data.T
#time 也是一個數組,與wave_data[0]或wave_data[1]配對形成系列點座標
#time = numpy.arange(0,nframes)*(1.0/framerate)
#繪製波形圖
#pylab.plot(time, wave_data[0])
#pylab.subplot(212)
#pylab.plot(time, wave_data[1], c="g")
#pylab.xlabel("time (seconds)")
#pylab.show()
#
# 取樣點數,修改取樣點數和起始位置進行不同位置和長度的音訊波形分析
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=numpy.fft.fft(wave_data2)*2/N
#常規顯示取樣頻率一半的頻譜
d=int(len(c)/2)
#僅顯示頻率在4000以下的頻譜
while freq[d]>4000:
d-=10
pylab.plot(freq[:d-1],abs(c[:d-1]),"r")
pylab.show()
import wave
import pyaudio
import numpy
import pylab
#開啟WAV文件,檔案路徑根據需要做修改
wf = wave.open("D:\\Python\\wavs\\Do-piano-2.20s.wav", "rb")
#建立PyAudio物件
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
nframes = wf.getnframes()
framerate = wf.getframerate()
#讀取完整的幀資料到str_data中,這是一個string型別的資料
str_data = wf.readframes(nframes)
wf.close()
#將波形資料轉換為陣列
# A new 1-D array initialized from raw binary or text data in a string.
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
#將wave_data陣列改為2列,行數自動匹配。在修改shape的屬性時,需使得陣列的總長度不變。
wave_data.shape = -1,2
#將陣列轉置
wave_data = wave_data.T
#time 也是一個數組,與wave_data[0]或wave_data[1]配對形成系列點座標
#time = numpy.arange(0,nframes)*(1.0/framerate)
#繪製波形圖
#pylab.plot(time, wave_data[0])
#pylab.subplot(212)
#pylab.plot(time, wave_data[1], c="g")
#pylab.xlabel("time (seconds)")
#pylab.show()
#
# 取樣點數,修改取樣點數和起始位置進行不同位置和長度的音訊波形分析
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=numpy.fft.fft(wave_data2)*2/N
#常規顯示取樣頻率一半的頻譜
d=int(len(c)/2)
#僅顯示頻率在4000以下的頻譜
while freq[d]>4000:
d-=10
pylab.plot(freq[:d-1],abs(c[:d-1]),"r")
pylab.show()