• 大小: 89KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-25
  • 语言: 其他
  • 标签: 代码  

资源简介

能够实时录音并显示波形,能够读取音频文件并实时显示波形,此程序基于动画刷新的思想,不断刷新图像,以达到实时显示的目的。通过测试和修改,代码运行正常。

资源截图

代码片段和文件信息

# 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  实时读取音频并显示波形\

评论

共有 条评论