美文网首页
声音的可视化处理

声音的可视化处理

作者: gaoshine | 来源:发表于2018-01-06 17:53 被阅读1527次

    声音的可视化处理

    下一步需要做声音信号的处理,今天就把声音的可视化的程序代码做一下.
    主要完成声音的波形显示(时域信号)和声音的频谱显示(频域信号)
    虽然涉及傅里叶变换等复杂的处理,采用matplot工具可以轻而易举的实现这些以前需要大神才能完成的代码.

    Screen Shot 2018-01-06 at 5.56.57 PM.png
    # 声音可视化代码, 使用pywave模块,读取声音文件,一组将声音文件一波形显示,另一组显示为声音频谱 
    %matplotlib inline
    import wave
    import struct
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # 读取wav文件
    filename = 'data/1.wav'
    wavefile = wave.open(filename, 'r')  # open for writing
    
    # 读取wav文件的四种信息的函数。期中numframes表示一共读取了几个frames。
    nchannels = wavefile.getnchannels()
    sample_width = wavefile.getsampwidth()
    framerate = wavefile.getframerate()
    numframes = wavefile.getnframes()
    
    print("channel", nchannels)
    print("sample_width", sample_width)
    print("framerate", framerate)
    print("numframes", numframes)
    
    channel 1
    sample_width 2
    framerate 16000
    numframes 22720
    
    # 建一个y的数列,用来保存后面读的每个frame的amplitude。
    y = np.zeros(numframes)
    
    # for循环,readframe(1)每次读一个frame,取其前两位,是左声道的信息。右声道就是后两位啦。
    # unpack是struct里的一个函数,用法详见http://docs.python.org/library/struct.html。简单说来就是把#packed的string转换成原来的数据,无论是什么样的数据都返回一个tuple。这里返回的是长度为一的一个
    # tuple,所以我们取它的第零位。
    for i in range(numframes):
        val = wavefile.readframes(1)
        left = val[0:2]
        # right = val[2:4]
        v = struct.unpack('h', left)[0]
        y[i] = v
    
    # framerate就是声音的采用率,文件初读取的值。
    Fs = framerate
    time = np.arange(0, numframes) * (1.0 / framerate)
    # 显示时域图(波形图)
    plt.subplot(211)
    plt.plot(time, y)
    # 显示频域图(频谱图)
    plt.subplot(212)
    plt.specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
    plt.show()
    
    
    
    output_4_0.png

    小结

    针对具体的频域和时域的理论我们先不谈,这个过分复杂,我们只看一下结果,对比频域我们能够看到更多的分布的细节和特征,便于以后做声音的分析和识别.

    相关文章

      网友评论

          本文标题:声音的可视化处理

          本文链接:https://www.haomeiwen.com/subject/bxoynxtx.html