首頁>Club>
15
回覆列表
  • 1 # 張百崎

    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()

  • 中秋節和大豐收的關聯?
  • 對於歷史解釋、歷史敘述、歷史觀點、歷史結論,大家是怎麼區分的?