• 【基于pyAudioKits的Python音频信号处理(二)】数字音频信号的表示


    pyAudioKits是基于librosa和其他库的强大Python音频工作流支持。

    API速查手册

    通过pip安装:

    pip install pyAudioKits
    
    • 1

    本项目的GitHub地址,如果这个项目帮助到了你,请为它点上一颗star,谢谢你的支持!如果你在使用过程中有任何问题,请在评论区留言或在GitHub上提issue,我将持续对该项目进行维护。

    import pyAudioKits.record
    
    • 1

    pyAudioKits提供了音频录制的api。首先运行底下这段代码,录制一段5s的音频。

    record = pyAudioKits.record.record(44100,5)  #以44100的采样率录制5s音频
    record.plot()    #绘制音频波形
    
    '''
    outputs:
    ********** Please speak in 5 seconds. 
    ********** End of recording.
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    声音是由于介质的振动产生的,而振动的模式可以被描述为随机过程。音频信号的本质是随机过程 { X ( t ) , − ∞ < t < ∞ } \{X(t),-∞{X(t),<t<}的一次实现 { x ( t ) , − ∞ < t < ∞ } \{x(t),-∞{x(t),<t<}

    现实世界中的音频信号是模拟的,具有取值连续、时间连续的、无限而非因果(现实世界的声音从开始录制前就存在,在停止录制后依然在持续)的特点。为了能够在计算机中表示和储存音频信号,在进行音频的录制过程中,进行了三个操作:

    一是量化,所谓量化就是要用有限的比特数去表示 x ( t ) , ∀ t x(t),\forall t x(t),t的值,从而解决取值连续的问题。而在现代计算机系统中,float、double等数据类型已经可以让音频量化做到相当精细,造成的影响一般可以忽略。

    二是采样,所谓采样,就是让时域被因子 T s T_s Ts归一化: { x [ n ] = x ( n T s ) , − ∞ < n < ∞ } \{x[n]=x(nT_s),-∞{x[n]=x(nTs),<n<},这样我们就可以用一个分量个数有限的向量 x ⃗ n = x [ n ] \vec x_n=x[n] x n=x[n]来表示音频信号了。其中,每个 n n n代表向量的一个分量,分量之间采样的时间间隔为 T s T_s Ts T s T_s Ts称为采样周期,其倒数就是采样率。这等价于为模拟信号乘上一个间隔为 T s T_s Ts的冲激序列,实际做法就是每隔时间 T s T_s Ts对模拟信号 x ( t ) x(t) x(t)进行一次量化。得到的 x [ n ] x[n] x[n]是离散的数字信号

    刚才我们录制音频使用的采样率为44100Hz,采样周期就是(1/44100)s。

    record.sr    #显示采样率
    
    '''
    outputs:
    44100
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    采样率 1 / T s 1/T_s 1/Ts为44100Hz。

    三是截断,比如录制音频的时长为5s,就相当于是只取 { x ( t ) , 0 ≤ t < 5 } \{x(t),0≤t<5\} {x(t),0t<5}再进行采样和量化得到 { x [ n ] , 0 ≤ n < 44100 ∗ 5 } \{x[n],0≤n<44100*5\} {x[n],0n<441005}(一般将开始采集模拟信号的时间 t t t设为0)。在表示的时候认为先截断得到 { x ( t ) , 0 ≤ t < T s N m a x } \{x(t),0≤t{x(t),0t<TsNmax}再采样成 { x [ n ] , 0 ≤ n < N m a x } \{x[n],0≤n{x[n],0n<Nmax},还是先采样成 { x [ n ] , − ∞ ≤ n < ∞ } \{x[n],-∞≤n<∞\} {x[n],n<}再进行截断得到 { x [ n ] , 0 ≤ n < N m a x } \{x[n],0≤n{x[n],0n<Nmax}都是没有问题的。

    len(record)	#获取音频样本数
    
    '''
    outputs:
    220500
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    音频样本数 N m a x N_{max} Nmax为220500。我们也可以以样本数为横轴画出波形图。

    record.plot(xlabel="n")
    
    • 1

    在这里插入图片描述

    record.getDuration()
    
    '''
    outputs:
    5.0
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    音频持续时间 T s N m a x T_sN_{max} TsNmax为5s,符合我们的表达式。

    另外,截断也等价于首先采样得到 { x d [ n ] , − ∞ ≤ n < ∞ } \{x_d[n],-∞≤n<∞\} {xd[n],n<},再乘上一个矩形窗 w [ n ] = { 1 0 ≤ n < N m a x 0 o t h e r s w[n]=

    {10n<Nmax0others" role="presentation" style="position: relative;">{10n<Nmax0others
    w[n]={10n<Nmax0others得到 x [ n ] = { x d [ n ] 0 ≤ n < N m a x 0 o t h e r s x[n]=
    {xd[n]0n<Nmax0others" role="presentation" style="position: relative;">{xd[n]0n<Nmax0others
    x[n]={xd[n]0n<Nmax0others
    。这个操作称为加窗

    经过量化、采样、截断后,音频信号就被表示为了能在计算机中储存的、以向量方式表示的数字音频信号,而采样率、持续时间等则是音频信号最基本的属性。

  • 相关阅读:
    Operational Property Graphs到底是个啥?
    商品管理系统数据库设计--SQL Server
    MyBatis框架一二级缓存含代码演示
    行泊一体迎爆发期,抢量产还是修技术护城河?
    rsync远程同步
    fontforge将.woff文件转换为.ttf文件,查看字体对应关系
    个性化纹身设计,Midjourney带你探索独一无二的艺术之美
    电感重要参数的理解
    pyspark 检测任务输出目录是否空,避免读取报错
    静态库与动态库笔记
  • 原文地址:https://blog.csdn.net/weixin_43441742/article/details/126093467