資源簡介
能夠實時錄音并顯示波形,能夠讀取音頻文件并實時顯示波形,此程序基于動畫刷新的思想,不斷刷新圖像,以達到實時顯示的目的。通過測試和修改,代碼運行正常。

代碼片段和文件信息
#?coding=utf-8
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?matplotlib.animation?as?animation
import?pyaudio
import?wave
import?os
class?SubplotAnimation(animation.TimedAnimation):
????def?__init__(self?static=False):
????????“““
????????音頻波形動態顯示,實時顯示波形,實時進行離散傅里葉變換分析頻域
????????:param?static:?是否為靜態模式
????????:param?path:???wav?文件路徑
????????“““
????????path=r‘C:\Users\xh941\Desktop\music1.wav‘
????????self.static?=?static
????????if?static?and?os.path.isfile(path):
????????????self.stream?=?wave.open(path)
????????????self.rate?=?self.stream.getparams()[2]
????????????self.chunk?=?self.rate/2
????????????self.read?=?self.stream.readframes
????????else:
????????????self.rate?=?2?**?16
????????????self.chunk?=?2?**?12
????????????p?=?pyaudio.PyAudio()
????????????self.stream?=?p.open(format=pyaudio.paInt16?channels=1?rate=self.rate
????????????????????????????input=True?frames_per_buffer=self.chunk)
????????????self.read?=?self.stream.read
????????fig?=?plt.figure()
????????ax1?=?fig.add_subplot(2?1?1)
????????ax2?=?fig.add_subplot(2?1?2)
????????self.t?=?np.linspace(0?int(self.chunk?-?1)?int(self.chunk))
????????ax1.set_xlabel(‘t‘)
????????ax1.set_ylabel(‘x‘)
????????self.line1?=?ax1.plot([]?[]?lw=2)
????????ax1.set_xlim(0?self.chunk)
????????ax1.set_ylim(-15000?15000)
????????ax2.set_xlabel(‘hz‘)
????????ax2.set_ylabel(‘y‘)
????????self.line2?=?ax2.plot([]?[]?lw=2)
????????ax2.set_xlim(0?self.chunk)
????????ax2.set_ylim(-50?100)
????????#?更新間隔/ms
????????interval?=?int(1000*self.chunk/self.rate)
????????animation.TimedAnimation.__init__(self?fig?interval=interval?blit=True)
????def?_draw_frame(self?framedata):
????????i?=?framedata
????????if?self.static:
????????????#?讀取靜態wav文件波形
????????????y?=?np.fromstring(self.read(int(int(self.chunk)/2)+1)?dtype=np.int16)[:-1]
????????else:
????????????#?實時讀取聲頻
????????????y?=?np.fromstring(self.read(self.chunk)?dtype=np.int16)
????????x?=?np.linspace(0?int(self.chunk)?-?1?y.shape[0])
????????#?畫波形圖
????????self.line1.set_data(x?y)
????????#?傅里葉變化
????????
????????xf?=?np.fft.rfft(y)?/?self.chunk
????????xfp?=?20?*?np.log10(np.clip(np.abs(xf)?1e-20?1e100))
????????freqs?=?np.linspace(0?int(self.rate)?xfp.shape[0])
????????self.line2.set_data(freqs?xfp)
????????self._drawn_artists?=?[self.line1?self.line2]
????def?new_frame_seq(self):
????????return?iter(range(self.t.size))
????def?_init_draw(self):
????????lines?=?[self.line1?self.line2]
????????for?l?in?lines:
????????????l.set_data([]?[])
ani?=?SubplotAnimation()
plt.show()
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????2709??2020-02-10?22:19??實時讀取音頻并顯示波形\main.py
?????文件??????100044??2019-05-10?12:43??實時讀取音頻并顯示波形\music1.wav
?????目錄???????????0??2020-02-10?22:15??實時讀取音頻并顯示波形\
- 上一篇:源代碼.rar
- 下一篇:數據建模層次分析法填志愿問題
評論
共有 條評論