精华内容
下载资源
问答
  • 基于MATLAB的音频信号处理技术实现-基于MATLAB的音频信号处理技术实现.pdf 论文:基于MATLAB的音频信号处理技术实现 希望对大家有所帮助
  • 音频信号处理的一些常用matlab代码,大约25个(包含help文件),对初学者有一定帮助
  • Python中的音频信号处理 该存储库包含一些 (以前称为 )笔记本。 您可能以不同的方式消费它们: 克隆此Git存储库(或下载),然后使用Jupyter / IPython在本地打开笔记本 查看笔记本的静态在线版本: , 获得...
  • 大实验设计报告:实验6 音频信号处理实验;含设计报告近2w字,格式标准word,含目录、详细分析、参考文献等;含实验代码及工程文件;可直接使用、编辑文档
  • dsp音频信号处理c源码.rar 资料 参考 dsp音频信号处理c源码.rar
  • 专注于应用于音频信号的频谱建模。 读者应该已经熟悉傅里叶变换和基本数字信号处理
  • 该代码用于处理带噪声的音频信号,通过中值滤波,FIR滤波,IIR滤波分别去除响应的噪声信号,最后采用维纳滤波进行信号处理
  • 信号分析与处理 大作业:1 概述1.1 研究背景与意义1.2 研究目标 2 音频信号的采集与频谱分析2.1 音频信号的采集 2.2 音频信号的播放设置 3 数字滤波器的设计 3.1 低通滤波器设计 3.2 高通滤波器设计 3.3 带通滤波器...
  • 数字音频信号处理

    2017-10-09 10:54:14
    国外的一本数字信号处理书籍,书里有讲解数字信号处理的一些知识,比如均衡器,动态范围处理等,非常实用。
  • 音频信号处理方法及FPGA实现中,采用AGC算法,可提高音频信号系统和音频信号输出的稳定性,解决了AGC调试后的信号失真问题。本文针对基于实用AGC算法的音频信号处理方法与FPGA实现,及其相关内容进行了分析研究。...
  • matlab音频信号处理GUI

    2021-04-19 22:24:23
    使用谱减法和维纳滤波对音频信号进行处理,有GUI界面
  • 5一个混合正弦信号包含5Hz,15Hz、30Hz的3种频率信号,现要求设计适当的滤波器,保留15Hz频率分量信号,给定采样频率100Hz。
  • 上海大学通信学院音频信号处理作业参考答案,根据历年来分析,题目基本没有变化,所述答案可供参考
  • 基于MATLAB的音频信号处理技术实现

    热门讨论 2010-04-18 23:27:28
    基于MATLAB的音频信号处理技术实现 本文以WAV 格式音频信号作为分析处理的输入数据,用MATLAB 处理音频信号的基 本流程是:先将WAV 格式音频信号经wavread 函数转换成MATLAB 列数组变量;再用MATLAB 强大的运算能力...
  • 音频信号处理基础知识

    千次阅读 热门讨论 2020-10-15 15:41:07
    语音信号处理基础知识 1.均值 1.1.均值公式定义 x‾=x1+x2+⋯+xnn=∑j=1nxjn\overline{x} = \frac{x_1 + x_2 + \cdots + x_n}{n} = \frac{\sum^{n}_{j=1}x_j}{n} x=nx1​+x2​+⋯+xn​​=n∑j=1n​xj​​ 1.2.物理...

    语音信号处理基础知识

    1.均值

    1.1.均值公式定义

    x ‾ = x 1 + x 2 + ⋯ + x n n = ∑ j = 1 n x j n \overline{x} = \frac{x_1 + x_2 + \cdots + x_n}{n} = \frac{\sum^{n}_{j=1}x_j}{n} x=nx1+x2++xn=nj=1nxj

    1.2.物理意义

    一段语音信号的均值代表了语音的直流分量, 正常情况下音频系统的输入输出不存在交流分量。 如果发生了直流偏执的现象, 需要在信号预处理阶段去除直流分量。

    1.3.代码实现

    读取一段新闻语音文件, 计算它的均值。

    from scipy.io import wavfile
    import numpy as np
    
    framerate, data = wavfile.read('./source.wav')
    data_len = len(data)
    sum = 0
    for i in range(data_len):
        sum += data[i]
    mean_data = sum / data_len
    print('mean of audio : %f' % mean_data)
    
    mean of audio : -0.000320
    

    numpy提供average函数来计算均值, 效果一致。

    np.average(data)
    
    -0.000320226621917049
    

    可以看出, 均值接近0.

    2.方差

    2.1.方差的公式定义

    s 2 = 1 n ∑ i = 1 n ( x i − x ‾ ) 2 s^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \overline{x})^2 s2=n1i=1n(xix)2

    2.2.物理意义

    方差描述语音信号的波动范围, 交流分量的强弱, 即交流信号的平均功率。

    2.3.代码实现

    sum = 0
    for i in range(data_len):
        sum += (data[i] - mean_data) ** 2
    var_data = sum / data_len
    print('var of audio : %f' % var_data)
    
    var of audio : 3197990.844967
    

    numpy提供var函数用以计算方差, 效果一致。

    np.var(data)
    
    3197990.8449671054
    

    3.均方差

    3.1.均方差的公式定义

    σ = 1 n ∑ i = 1 n ( x i − x ‾ ) 2 σ = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i - \overline{x})^2} σ=n1i=1n(xix)2

    3.2.物理意义

    均方差等于方差的方根, 和方差一样可以反映语音信号的离散程度。由于方差的平方计算造成量纲的倍数变化无法直观反映出偏离程度, 均方差的意义更为直观。

    3.3.代码实现

    sum = 0
    for i in range(data_len):
        sum += (data[i] - mean_data) ** 2
    rmse_data = np.sqrt(sum / data_len)
    print('rmse of data : %f' % rmse_data)
    
    rmse of data : 1788.292718
    

    numpy提供std函数用以计算均方差, 效果一致。

    np.std(data)
    
    1788.2927179203928
    

    4.协方差

    4.1.公式定义

    C o v ( X , Y ) = ∑ i = 0 n ( X − X ‾ ) ( Y − Y ‾ ) n − 1 Cov(X, Y) = \frac{\sum_{i=0}^{n}(X-\overline{X})(Y - \overline{Y})}{n-1} Cov(X,Y)=n1i=0n(XX)(YY)

    4.2.物理意义

    描述两个变量之间的变化趋势相关性

    4.3.代码仿真理解

    计算初始相位0, π之间的正弦信号和初始相位为0的正弦信号之间的协方差。

    def cov(x, y):
        avr_x = np.average(x)
        avr_y = np.average(y)
        sum = 0
        for i in range(len(x)):
            sum += (x[i] - avr_x) * (y[i] - avr_y)
        return sum / (len(x) - 1)
    
    import matplotlib.pyplot as plt
    
    x = np.arange(0, 10 * np.pi, 0.1)
    y_1 = np.sin(x)
    plt.plot(x, y_1)
    plt.xlabel('sample (n)')
    plt.ylabel('amp')
    plt.show()
    

    在这里插入图片描述

    上图绘制的是初始相位为0的正弦信号图像

    y_2 = np.sin(x + np.pi)
    plt.plot(x, y_2)
    
    [<matplotlib.lines.Line2D at 0x7efef0fbd2b0>]
    

    在这里插入图片描述

    上图绘制的是初始相位为π的正弦信号图像,可以看出相位相差π的两个序列的变化趋势完全相反。计算这两个信号序列的协方差

    print(cov(y_1, y_2))
    
    -0.5002531220184325
    

    numpy提供cov函数来计算协方差矩阵, 矩阵的次对角线是两个序列的协方差。

    np.cov(y_1, y_2)
    
    array([[ 0.50025312, -0.50025312],
           [-0.50025312,  0.50025312]])
    

    计算不同初始相位下, 两个正弦序列的协方差变化情况。

    phi_list = np.linspace(0, 2 * np.pi, 100)
    cov_list = [cov(np.sin(x), np.sin(x + phi)) for phi in phi_list]
    plt.plot(phi_list, cov_list)
    
    [<matplotlib.lines.Line2D at 0x7efef0af0208>]
    

    在这里插入图片描述

    5.分帧加窗以及频谱泄露

    5.1.频谱泄露

    计算离散傅里叶变换的前提是假设输入有限长度的信号序列是一个周期信号的一个完整周期, 周期长度为该序列的长度。离散傅里叶变换本质是以该序列长度为周期进行周期延拓后的周期信号, 计算这个无限周期序列的频谱图。由于dft计算出的频谱对应的是周期延拓后的周期信号, 如果有限长的信号的首尾不相等, 会使得周期延拓后的周期信号不连贯, 会带来一些本来不属于信号本身的频率分量。

    下面定义dft实现如下:

    import math
    
    def dft(x):
        """
        :bref 计算输入序列的离散傅里叶变换
    
        :param x : 输入序列
        :param N : dft长度N
        :return spectrum : 频谱
        """
        N = len(x)
        spec = np.zeros(N)
        for k in range(N):
            sum = 0
            for n in range(N):
                sum += x[n] * np.exp(-1j * 2 * np.pi * n * k / N)
            spec[k] = abs(sum / N)
        return spec
    

    定义计算频谱对应的频率值函数:

    def dft_freq(N, sample_rate):
        """
        :bref 计算对应的频域分辨率
    
        :param N : DFT点数
        :param sample_rate : 采样率
        :return freqs : 对应的频域的采样率
        """
        freqs = sample_rate / N * np.array(range(N))
        return freqs
    

    采用频率为10的正弦信号, 使用五个整数倍周期作为信号的长度; 从绘制的波形图可以看出整数倍周期的首尾是连贯的。

    def create_sin(Ts, freq, times):
        sample_rate = 1 / Ts
        freq = 10
        T = 1 / freq
        duration = times * T
        samples = math.ceil(duration / Ts)
        t = Ts * np.array(range(samples))
        x = np.cos(2 * np.pi * freq * t)
        return t, x
    
    Ts = 0.01
    t, x = create_sin(Ts, 10, 5)
    plt.plot(t, x)
    
    [<matplotlib.lines.Line2D at 0x7efeef8ec5c0>]
    

    在这里插入图片描述

    将该信号进行周期延拓三次, 可以看出周期延拓后的信号和原本一致。

    def sig_append(x, times, Ts):
        """
        :bref 周期延拓
    
        :param x : 需要周期延拓的信号
        :param times : 延拓次数
        :param Ts : 采样周期
        :return t_add : 延拓后序列的时间
        :return x_add : 延拓后的信号幅值
        """
        N = x.shape[0]
        t_add = Ts * np.array(range(N * times))
        x_add = np.zeros(N * times)
        for i in range(times):
            x_add[i * N:(i + 1) * N] = x[:]
        return t_add, x_add
    
    t_add, x_add = sig_append(x, 3, Ts)
    plt.plot(t_add, x_add)
    
    [<matplotlib.lines.Line2D at 0x7efeef56d860>]
    

    在这里插入图片描述

    使用dft计算该信号频谱, 可以看出频谱分量只有10Hz。

    freq_dft = dft_freq(x.shape[0], 1 / Ts)
    plt.plot(freq_dft, dft(x))
    plt.xlabel('Freq (Hz)')
    plt.xlim([0, freq_dft[-1] / 2])
    plt.show()
    

    在这里插入图片描述

    将信号长度改为非整数倍周期5.2, 来看看时域频域的效果。

    t_5_2, x_5_2 = create_sin(0.01, 10, 5.2)
    plt.plot(t_5_2, x_5_2)
    
    [<matplotlib.lines.Line2D at 0x7efeec7f6908>]
    

    在这里插入图片描述

    同样的, 将周期进行三倍延拓看看效果。可以发现在延拓交界点存在不期望的波形。

    t_add, x_add = sig_append(x_5_2, 3, Ts)
    plt.plot(t_add, x_add)
    
    [<matplotlib.lines.Line2D at 0x7efeed7d9cf8>]
    

    在这里插入图片描述

    来看看频域的效果, 可以发现在10Hz分量之外还有其他的频率分量, 整个信号的能量从基频泄露了一部分到其他频率上, 这就是频谱泄露。

    freq_dft = dft_freq(x_10_1.shape[0], 1 / Ts)
    plt.plot(freq_dft, dft(x_10_1))
    plt.xlabel('Freq (Hz)')
    plt.xlim([0, freq_dft[-1] / 2])
    plt.show()
    

    在这里插入图片描述

    可以通过对信号的首尾进行抑制来减弱首尾不连贯带来的频谱泄露, 即就是加窗。
    汉宁窗的数学定义是:

    w ( n ) = 0.5 × ( 1 − c o s ( 2 π n / ( N − 1 ) ) ) , 0 ≤ n ≤ N − 1 w(n) = 0.5 × (1 - cos(2\pi n / (N - 1))), 0 \le n \le N - 1 w(n)=0.5×(1cos(2πn/(N1))),0nN1

    定义生成汉宁窗的函数如下:

    def create_hanning(N):
        window = np.arange(N)
        window = (1 - np.cos(window / (N - 1) * 2 * np.pi) + 1) / 2
        return window
    

    对5.2倍周期的信号进行汉宁窗加权, 可以看到首尾的信号被衰减了。

    window = create_hanning(x_5_2.shape[0])
    x_5_2_window = x_5_2 * window
    plt.figure(0)
    plt.title('hanning window')
    plt.plot(range(window.shape[0]), window)
    plt.figure(1)
    plt.title('after window')
    plt.plot(t_5_2, x_5_2_window)
    
    [<matplotlib.lines.Line2D at 0x7efeec381358>]
    

    在这里插入图片描述

    在这里插入图片描述

    绘制对应的频谱图, 可以看出非10Hz的信号分量少了很多。

    freq_dft = dft_freq(x_5_2_window.shape[0], 1 / Ts)
    plt.plot(freq_dft, dft(x_5_2_window))
    plt.xlabel('Freq (Hz)')
    plt.xlim([0, freq_dft[-1] / 2])
    plt.show()
    

    在这里插入图片描述

    def frame_sig(sig,frame_len,frame_step,winfunc=lambda x:numpy.ones((x,))):
        """
        :bref 将信号进行分帧加窗处理
    
        :param sig: 需要分帧加窗的语音信号.
        :param frame_len: 帧长.
        :param frame_step: 帧移.
        :param winfunc: 窗函数, 默认为矩形窗.
        :returns: 分帧后的数据.
        """
        slen = len(sig)
        frame_len = int(round_half_up(frame_len))
        frame_step = int(round_half_up(frame_step))
        if slen <= frame_len:
            numframes = 1
        else:
            numframes = 1 + int(math.ceil((1.0*slen - frame_len)/frame_step))
    
        padlen = int((numframes-1)*frame_step + frame_len)
    
        zeros = numpy.zeros((padlen - slen,))
        padsignal = numpy.concatenate((sig,zeros))
    
        indices = numpy.tile(numpy.arange(0,frame_len),(numframes,1)) + numpy.tile(numpy.arange(0,numframes*frame_step,frame_step),(frame_len,1)).T
        indices = numpy.array(indices,dtype=numpy.int32)
        frames = padsignal[indices]
        win = numpy.tile(winfunc(frame_len),(numframes,1))
        return frames*win
    
    np.fft.fft
    
    <function numpy.fft.fft(a, n=None, axis=-1, norm=None)>
    
    
    
    展开全文
  • 对声音的产生,声音信号的分类进行系统描述,并介绍了语音和音频信号处理的相关应用
  • matlab尺度变换代码 Readme 两个文件夹分别为音频和图像的信号处理实现代码 应用matlab实现信号读取、倍乘、相加、相乘、微分、积分、尺度、反褶、平移变换 打开matlab直接运行脚本即可
  • 因此,它主要是机器学习库,而不是一般的信号处理库。 通过使所有计算都通过PyTorch操作,可以在torchaudio中看到PyTorch的好处,这使得它易于使用并且感觉很自然。 使用SoX将以下格式加载到火炬张量中 mp3,wav,...
  • 这里展示的 Matlab 代码是交叉合成的一个例子——一种将一个声音(调制信号)的频谱包络压在... 频谱音频信号处理。W3K 出版,2011 年。 [2] U.Zölzer。 DAFX:数字音频效果。 奇切斯特,约翰威利父子公司,2011 年。
  • matlab音频信号处理

    千次阅读 2019-11-13 23:44:40
    首先来认识一下什么是音频信号 通过matlab我们可以直接读入一个音频文件,同时直接绘图 但是此时的横坐标和纵坐标是什么呢? >> [y,fs] = audioread('5num.wav'); >> plot(y) 不断放大信号: 得到了...

    首先来认识一下什么是音频信号

    通过matlab我们可以直接读入一个音频文件,同时直接绘图
    但是此时的横坐标和纵坐标是什么呢?

    >> [y,fs] = audioread('5num.wav');
    >> plot(y)
    

    不断放大信号:

    得到了这样一幅图

    10651191-5f901ea5bc8e3bd9
    image

    这时候纵坐标我们可以理解成幅度,但是横坐标其实什么也不是
    或者说就是一系列点而已,我们可以对这些点进行一定的组合,比如每160个点作为一组,这就是分帧

    那频率呢?
    matlab在读取一个音频的时候还会返回一个频率呀,这个频率,也就是那个fs,到底是干嘛的,有什么意义呢?

    不妨来计算一下:
    我的这段音频是29s,

    >> length(y)/fs
    ans =
       29.4400
    

    此时用点的个数除以频率fs,得到的就是时间!
    这样想,频率的物理意义就是一秒钟振动的次数,8khz就是一秒钟要震动8000次,一个点震动一次,那么235520个点就要震动29.4400s!

    同时可以知道这段音频是16位量化的

    可是我们老是说量化量化,量化究竟代表什么含义呢?

    其实就理解成每一个点用16个bit来表示

    那么,235520个点,每一个点都是16位的,相当于一个点就是2byte

    那么就是 235520*2 字节
    等价于460KB

    查看文件大小


    10651191-2bdacaee04fe3c6a.png

    正好是460KB!!

    现在理解这几个参数的含义了吧

    于是上面那幅图我们需要改进一下

    >>t = (0:length(y)-1)/fs;
    >> plot(t,y);
    >> xlabel('时间(.sec)')
    >> ylabel('幅度')
    
    10651191-b5824f772038f550.png

    这样就能得到每一个时刻对应的幅度了

    分帧?

    到底什么是分帧呢?

    首先需要确定分帧的长度:

    比如采样率是11025
    语音信号每20ms分成一段

    怎么想,一秒钟有11025个点震动,那么20ms内就是大概220个点了,于是帧长为220,帧移默认就是一半110

    问:为什么分帧?
    答:语音信号是瞬时变化的,但在10~20ms内是相对稳定的,即在一小段内是相对稳定的,分帧就是将语音分成一段一段的。
    问:问什么要有帧移呢?
    答:帧移后的每一帧信号都有上一帧的成分,防止两帧之间的不连续。语音信号虽然短时可以认为平稳,但是由于人说话并不是间断的,每帧之间都是相关的,加上帧移可以更好地与实际的语音相接近。

    如果采样率都是8000hz,并且20ms为一帧
    相当于160个点为一个帧

    但是调用enframe函数返回的结果又是什么呢?

    5885*160的矩阵

    每一行,有160列

    每一列,有5885行

    你想啊,我是每160个点为一个帧,那么总共有多少个帧呢?

    这个不难算

    那么我可以单独取出其中的一个帧来看


    10651191-72ecdc95fc6350c2.png
    a = X(2000,:);
    plot(a)
    

    当然这里只是知道有160个点,但是对应的时间段却是不知道的

    也就是说每一行其实就是一个帧的数据了
    之所以这张图有点奇怪

    10651191-4e98c8b327acbb7f.png

    横坐标代表第多少帧,纵坐标代表振幅

    因为有很多根曲线是重叠的

    问题在于分帧之后,如何求自相关系数等
    可不可以每一个帧求一次自相关系数呢?

    补充一点,调用enframe函数如果不指定第三个参数那么帧之间就不会重叠的

    如何求自相关系数?

    首先试如何理解自相关系数

    比如:

    >> A = [1 2 3]
    A =
         1     2     3
    >> xcorr(A)
    ans =
        3.0000    8.0000   14.0000    8.0000    3.0000
    >> 
    

    这个口算应该没问题的

    就是求出A的自相关系数

    但是这个呢?

    >> xcorr(A,4)
    ans =
      1 至 7 列
             0         0    3.0000    8.0000   14.0000    8.0000    3.0000
      8 至 9 列
             0         0
    

    是不是可以理解成延展了

    按照规律来说是没问题的,xcorr(A,4) 相当于两个5列的向量
    得到的就是2*5 - 1= 9个

    解读代码

    先把代码放上来吧,方便你们copy

    [y,fs] = audioread('5num.wav');
    
    N = length(y);
    t = (1:N-1)/fs;  %生成时间序列
    win = hamming(N) %加窗
    y = y.*win;
    X = enframe(y,160); % 160个点为一帧,就没要重叠了
    
    % 然后就可以查看某个帧了
    
    
    %%
    % 求出自相关
    num_frame = length(X);
    
    ms2 = floor(fs/500);
    ms20 = floor(fs/50);
    F0 = zeros(num_frame,1);
    % 直接对每一帧进行循环
    for i=1:num_frame
        % 每一帧都可以求出自相关的系数
        r = xcorr(X(i,:), 160);
        r = r(floor(length(r)/2):end);
        [maxi,idx]=max(r(ms2:ms20));
        F0(i) = fs/(ms2+idx-1);
    end
    
    figure(1);
    plot(F0); %横坐标代表帧
    xlabel('帧')
    ylabel('基音频率')
    
    % 经过探测我读0时候的基音位于第210帧
    
    %% 选出第210帧的数据
    figure(2)
    y210 = X(211,:);
    subplot(311);
    plot(y210);
    xlabel('点');
    ylabel('振幅');
    title('210帧原始信号')
    ai = lpc(y210, 10);
    est_x=filter([0 -ai(2:end)],1,y210);%估计信号
    subplot(312);
    plot(est_x);
    xlabel('点');
    ylabel('振幅');
    title('210帧估计信号');
    err = y210-est_x;
    subplot(313);
    plot(err);
    xlabel('点');
    ylabel('振幅');
    title('预测误差');
    %%
    % 求预测增益
    
    En=zeros(1,160);
    for i=1:160
       u=err(i);%取出一样点
       u2=u.*u;%求出能量
       En(i)=sum(u2);%对每一样点累加求和
    end
    %计算原始能量
    En1=zeros(1,160);
    for i=1:160
       u=y210(i);%取出一样点
       u2=u.*u;%求出能量
       En1(i)=sum(u2);%对每一样点累加求和
    end
    CA=zeros(1,160);
    for i=1:160
       en1=En1(i);%取出一样点
       en=En(i);
       CA(i)=abs(en1)/abs(en);
    end
    figure(3);
    subplot(311);plot(En1);xlabel('取样点数/个');ylabel('En');title('短时能量');title('E0');
    subplot(312);plot(En);xlabel('取样点数/个');ylabel('En');title('短时能量');title('Ep');
    subplot(313);plot(CA);xlabel('取样点数/个');ylabel('En');title('短时能量');title('预测增益');
    

    1. 加窗分帧

    [y,fs] = audioread('5num.wav');
    
    N = length(y);
    t = (1:N-1)/fs;  %生成时间序列
    win = hamming(N) %加窗
    y = y.*win;
    X = enframe(y,160); % 160个点为一帧,就没要重叠了
    

    其实加窗的过程也不是很难理解,就是生成一个函数然后去乘就好了

    然后通过enframe函数进行分帧处理

    返回的是一个矩阵,行数代表了帧数,列数代表了每一帧有多少个点

    2. 求自相关

    num_frame = length(X);
    
    ms2 = floor(fs/500);
    ms20 = floor(fs/50);
    F0 = zeros(num_frame,1);
    % 直接对每一帧进行循环
    for i=1:num_frame
        % 每一帧都可以求出自相关的系数
        r = xcorr(X(i,:), 160);
        r = r(floor(length(r)/2):end);
        [maxi,idx]=max(r(ms2:ms20));
        F0(i) = fs/(ms2+idx-1);
    end
    

    这个过程也不是很难理解

    得到的图形是这样子的

    10651191-28a797dee2021bd2.png

    横坐标就是每一个帧,纵坐标代表对应的基音频率

    其实这个图确实有点奇怪,因为它是倒过来的

    我后来仔细想了想,周围没有声音的时候,基音频率反而是最大的

    然后又去翻书,发现人的声音基音频率大概也就是200~500hz左右,而且男声本来就低,所以这个图显然是没问题的

    而且我总共只读了5个音,0 1 2 3 4

    基本正确地反映出来了

    然后通过肉眼观察,嗯,我读0的那个帧就是210帧了

    3. 通过LPC预测信号,同时计算增益

    预测增益的方法就是LPC

    10651191-a85da4900de04b4b.png

    增益系数我暂时不太清楚怎么求,就直接抄同学的了

    10651191-418709b11b0d89eb.png
    展开全文
  • lms滤波器matlab代码语音和音频信号处理课程的MATLAB编程练习 由| سروشطیبیآراسته 该存储库包含的所提供的语音和音频信号处理课程(SS 2020,Dr.-Ing。Walter Kellermann教授)的编程练习。 语境 该...
  • 音频信号处理

    2013-05-03 23:21:54
    该文档描述了音频信号处理方式及检修,有关专业人员可下载观看
  • 报告主要包括音频信号领域的研究方向介绍和将深度学习方法引入音频信号处理中的尝试和初步结果。 报告首先给出了传统的音频信号处理的基本框架,包括音频特征提取和特征序列建模两个主要部分。即从音频帧入手进行...

    https://www.toutiao.com/a6687760578368242180/

     

    人工智能论坛如今浩如烟海,有硬货、有干货的讲座却百里挑一。“AI未来说·青年学术论坛”系列讲座由中国科学院大学主办,百度全力支持,读芯术作为合作自媒体。本次承办单位为中国科学院大学学生会,协办单位为中国科学院计算所研究生会、网络中心研究生会、人工智能学院学生会、化学工程学院学生会、公共政策与管理学院学生会、微电子学院学生会。“AI未来说·青年学术论坛”第四期“语音技术”专场已于2019年4月27日下午在中科院举行。清华大学吴及老师为大家带来报告《音频信号的深度学习处理方法》。

     

    吴及,清华大学电子工程系副系主任,长聘教授,博士生导师。清华-讯飞联合实验室主任。IEEE 高级会员,中国语音产业联盟技术工作组组长,认知智能国家重点实验室学术委员会委员,口腔数字化医疗技术和材料国家工程实验室第二届技术委员会委员,中国计算机学会语音对话与听觉专业组委员。2018-2022 教育部电信类专业教学指导委员会副秘书长,承担国家重点研发计划、863、国家自然科学基金、工信部电子发展基金等多项国家科研项目。

     

    报告内容:深度学习方法的引入显著推动了语音技术的进步。语音识别,语音合成和说话人识别的实际应用都在不断增长,语音技术已经成为人工智能的重要组成部分和应用落地的主要方向之一。音频信号要比语音信号范围更大,也有很多重要而有趣的研究方向,比如音频场景分析。对于音频信号,传统上的处理方法都可以分为音频特征抽取和音频序列建模两个主要部分。这个报告讨论了将深度学习方法引入音频信号处理中的一些尝试和初步结果。

     

    学术干货:看清华教授如何将深度学习引入音频信号处理

     

    音频信号的深度学习处理方法

     

    学术干货:看清华教授如何将深度学习引入音频信号处理

     

     

    报告主要包括音频信号领域的研究方向介绍和将深度学习方法引入音频信号处理中的尝试和初步结果。

    报告首先给出了传统的音频信号处理的基本框架,包括音频特征提取和特征序列建模两个主要部分。即从音频帧入手进行时频分析得到特征,再将多个帧得到的特征序列进行建模处理。传统方法通过短时傅里叶变换得到线性时频谱,再经由梅尔滤波器组得到梅尔能量谱,通过对数处理得到对数谱,还可以进一步处理得到MFCC等音频特征。

    在特征提取上,引入深度学习方法,一是在梅尔滤波器组上构造频域滤波器组的神经网络。如果引入形状约束,此时滤波器增益、中心频点和带宽是三个可学习参数,对于三角窗滤波器可以使用 sigmoid 曲线和直线拟合三角窗,以保证全局可微性,也可以采用高斯窗滤波器或者采用无形状约束的滤波器。

    在频谱重建任务上,无约束的滤波器组表现得更好,而在音频场景分类任务上,有形状约束的滤波器组表现更好。进一步分析学习得到的滤波器,可以发现可学习滤波器组倾向于使用更多的低频信息。二是改进端到端的音频特征提取方法。

    TCNN (Google, 2015) 提出可以使用时域卷积+时域池化+非线性变换的时域信号处理单元。WaveNet (Google, 2016) 提出可以使用逐层邻域卷积+时域池化非线性变换。报告提出了使用神经网络进行傅里叶变换的模块,通过挑选特定频点的方式,提高了该模块的时间效率,通过向可学习频点中添加相应的初始化条件,优化傅里叶变换模块中的频点挑选,并通过为学习基函数添加正弦和余弦约束条件,来提高该模块的特征提取能力。相比于TCNN和WaveNet,该模块的性能和效率都有了显著提升。

     

    学术干货:看清华教授如何将深度学习引入音频信号处理

     

     

    在特征序列建模部分也开展了一系列的工作。在复杂音频场景信号中,某些音频事件的发生是随机的,因此类似的音频帧可以出现在不同位置,称之为音频时移形变;针对这个问题,提出了基于傅里叶变换的时间转移模块,时频谱通过序列傅里叶变换和取能量得到特征谱,再经过特征降维得到音频特征。该模块可以叠加到 DNN、CNN、LSTM 等不同的神经网络结构,并在音频场景分类任务中取得了一致的性能提升。

    对于由于数据量不足可能导致神经网络模型过拟合的问题,考虑通过随机分段乱序和随机跳帧的思想进行数据增广,提出了基于规则的音频序列扩充方法和使用随机跳帧的循环神经网络模型。基于规则的序列扩充即把数据分段并乱序重组,随机分割增加了序列的多样性,增大了数据规模,带来了明显的性能提升。

    随机跳帧策略可以分层实现,各层之间的跳帧策略可以相同,也可以不同,这一策略对 LSTM 和 GRU 均有效果,并且跳帧概率 p 取值越小,序列多样性越好,性能越好。对于神经网络序列建模能力不足的问题,通过给LSTM 每帧的输出一个权重和重构 LSTM 的记忆单元,提出了基于时间注意力和记忆注意力的 LSTM 模型。两种注意力机制存在互补性,在音频场景分类任务上实现了更好的性能。

    将上述各种策略加以融合,经过端到端的优化,能够在计算效率提升约两个数量级的情况下,在音频场景分类任务上实现显著的性能提升。

    最后,吴教授总结:深度学习为音频信号处理提供了新的视角和处理手段;传统方法可基于联合优化重新考虑和设计;基于深度神经网络的音频序列模型,能够利用音频信号的特性加以优化;端到端的音频信号处理在效果和效率方面都有很大的潜力。

    展开全文
  • 立体音频信号处理系统电路 PCB实物图: 音频输入和处理 ADAU1761的输入路径可同时接收两个通道的单端或差分音频信号。输入信号发送至ADAU1761的DSP内核进行处理。使用ADI的SigmaStudio软件,可建立音频信号路径和处理...
  • 音频信号采样、低通和高通滤波、带宽计算、频谱图。 光谱分析。
  • 多方法实现音频信号处理短时傅里叶变换%逆STFT%CQT核-常数Q变换(CQT)核%使用CQT内核的CQT谱图%使用CQT内核的CQT chromagram-CQT chromagram%mfcc-Mel频率倒谱系数(MFCCs)%使用快速傅立叶变换(FFT)的离散余弦...
  • 最近在arXiv上看到一篇关于深度学习在音频信号处理中的进展的文章,感觉写的不错,所以根据自己的理解和大家分享一下。如果有些地方博主理解的不对,或者解释不清,可以在下面评论,博主会一一回复。 论文链接:...

    最近在arXiv上看到一篇关于深度学习在音频信号处理中的进展的文章,感觉写的不错,所以根据自己的理解和大家分享一下。如果有些地方博主理解的不对,或者解释不清,可以在下面评论,博主会一一回复。

    论文链接:Deep Learning for Audio Signal Processing


    摘要

    这篇文章是奥尔堡大学,Google等几个研究机构的一篇关于深度学习在音频信号处理中的进展的综述。这篇文章主要从语音(Speech)、音乐(Music)和环境声(Environmental Sounds)三个领域出发,分析它们之间的相似点和不同点,以及一些跨领域的通用方法描述。具体而言,作者在音频特征表示(log-mel spectra, raw waveforms)和网络模型(CNN, RNN, CRNN)进行了详细的分析,对每个领域的技术演进以及深度学习应用场景进行了大概的描述。最后,作者总结了深度学习在音频信号处理领域一些关键问题和未来的研究方向。


    综述

    目前为止,深度学习一共经历了三次浪潮:1)1957年的感知算法的提出;2)1986年反向传播算法的提出;3)2012年深度学习在图像识别领域上的成功突破,使得深度学习的发展呈现的蓬勃的景象,并广泛应用在其他领域,比如基因组学、量子化学、自然语言处理,推荐系统等。相比于图像处理领域,声音信号处理领域是深度学习成功应用的又一个大方向,尤其是语音识别,很多大公司都在做这个方向。和图像不同,声音信号是一维的序列数据,尽管可以通过像FFT这样的频域转换算法转换为二维频谱,但是它的两个维度也是有特定的含义(纵轴表示频率,横轴表示时间帧),不能直接采用图像的形式进行处理,需要有领域内特定的处理方法。


    问题描述

    根据任务目标的类型可以划分为不同的任务类型,图一所示。首先,目标可以是一个全局的单标签,可以每个时间帧都有一个标签,也可以是一个自有长度的序列。其次,每个标签可以为一个单一的类别,可以为多个类别,也可以是一个数值。

    图一 声音信号分析任务可以划分为两个属性:预测的标签数量(左),标签的类型(右)

    预测一个全局的单标签的任务称为序列分类(Sequence Classification),这个标签可以为一个语言,说话人,音乐键或者声音场景等。当目标为多个类别的集合时,称为多标签序列分类(Multi-label Sequence Classification)。当目标是一个连续的数值时,称为序列回归(sequence regression)。实际上,回归任务通常是可以离散化并且转化为分类任务,比如,连续坐标的定位任务是一个回归任务,但是当把定位区间划分为几个范围,就可以当做分类任务来处理。

    声音特征

    在音频信号处理领域,构建适当的特征表示和分类模型通常被作为两个分离的问题。这种做法的一个缺点是人工构建的特征可能对于目标任务可能不是最优的。深度神经网络具有自动提取特征的能力,因此可以将上述两个问题进行联合优化。例如,在语音识别中,Mohamed [1] 等人认为深度神经网络的低层提取一些适应说话人的特征,而高层提取类别间的判别信息。

    过去几十年里,MFCC曾被广泛使用在音频分析任务中。MFCC提取步骤:使用FFT提取幅度谱,应用Mel滤波进行Mel频域的转换,使用log进行非线性变换,使用DCT进行系数特征的提取。然而,因为DCT变换会损失声音的结构信息,因此在深度模型中表现的并不是很好,目前使用最多的特征是log-mel spectrogram或者constant Q spectrogram,后者通常应用在音乐信息检索任务中。关于两者的相似点和不同点,博主会在另一篇博客详细介绍,这里就不过多赘述。

    为了不依赖人工设计的固定的滤波器(比如Mel滤波),一些研究关注于可学习的滤波器。这里解释一下滤波器为什么可以设计成可学习的?我们要知道,对声音进行滤波的实质就是对其进行不同的权重加成,这些权重完全可以由神经网络来学出来,不需要人共设计。更进一步,我们抛弃FFT变换,Mel滤波(可学习)这些步骤,直接让神经网络对声音序列(raw waveform)进行特征学习,完全摒弃了之前所有的特征工程的操作。尽管使用声音序列作为神经网络的输入有大量的工作,也取得了不错的效果,但是它也存在问题,这个我们后面再讲。

    声音模型

    给定声音表示,我们可以使用很多模型对其进行分析,包括MLP,CNN,RNN及其他们的变种网络。

    对于MLP,一般输入的一维的系数向量,比如展平的MFCC等。MLP每次学习都是针对全局的特征;

    对于CNN,可输入的特征类型很多。输入是一维的声音序列,可以使用1-D CNN进行学习,输入是二维的频谱图,可以使用2-D CNN进行学习。CNN的主要特点是可以进行局部特征提取,学习局部特征的关联性,比如相邻帧的关系,相邻特征(频率维度)的关系等。另外,CNN的权重共享的网络结构使得它的参数量很小,模型复杂度低。

    对于RNN,主要是时间帧上的短时和长时的相关性(依赖性)进行建模。RNN主要对那些时间上相关性较强的序列数据有很好的效果,比如语音的前后逻辑是一个很重要的信息。通常,RNN和CNN会结合来使用,先通过CNN来进行高维特征的提取,再使用RNN对时间相关性进行建模。尽管RNN在一些任务上表现很好,但是也存在一些问题,因为RNN的长时依赖性,使得其很容易出现梯度消失的问题。同时,在GPU优化上也不如CNN,因此训练速度通常会有些慢。

    实际上,声音相关的很多任务是序列到序列的转换,而通常这些任务的复杂性比较大,传统的方法是将其拆分成一个个的子任务进行处理。比如,语音识别是一个语音序列到文字序列的转换过程,通常需要将其拆分成声学,发音,语言建模等子任务。深度模型具有很强的建模能力(容量),很多研究关注于构建直接将输入序列映射为输出序列的端到端模型,也就是目前的Sequence-to-Sequence模型。目前的大多数Sequence-to-Sequence模型都是基于CTC以及注意力机制的,比较有代表性的是Google提出的listen, attend and spell(LAS)模型。

    另外,GAN在音频信号处理上也有很多应用,比如语音增强的SEGAN,生成声音的WaveNet以及一些声源分离、音乐乐器转换领域的GAN结构。

    之前我们谈到的大部分声音特征都是幅度谱或者幅度谱转化的特征。但是在有些领域中,声音的相位谱也是一个很重要的特征,比如声音合成。实际上,相位谱可以通过Griffin-Lim算法来转化,但是这些估计的相位不足以获得很好的合成性能。换个思路,我们可以通过神经网络对幅度谱和相位谱同时进行学习,也可以直接使用FFT的复数矩阵进行学习(Bengio在2017年提出过一个Deep Complex Networks),当然也可以直接对声音序列进行学习。

    数据

    深度学习的表征能力需要庞大的数据来支撑。对于声音处理领域,语音相关的开源数据集很多,尤其是英文的;音乐相关的也有很多开源数据集,比如Million Song Dataset和MusicNet;环境声相关的数据集最大的就是AudioSet了,超过200万个音频片段,但是基本都是Weakly-label的。因此,我们实际使用中,数据还是很有限的,尤其是对与环境声来说。下面是我整理的关于语音、音乐和环境声的大部分开源数据链接地址:

    Speech Recognition : https://catalog.ldc.upenn.edu

    Music Information Retrieval : https://labrosa.ee.columbia.edu/millionsong/

    Environmental Sound Classification : http://www.cs.tut.fi/~heittolt/datasets

    迁移学习是一个比较高效的方法,指的是在大数据集上进行模型预训练,然后在目标领域进行微调适应。数据增强或者数据生成是另一个能够解决或者缓解数据有限的问题的方法。数据增强主要是根据现有数据进行参数化的调整从而生成新的数据,典型的数据增强方法是Time Stretch和Pitch Shift,分别在时间维度和频率维度进行操作。数据生成可以通过GAN或者自动编码器等生成模型进行数据的生成。除此之外,还可以通过数据的混合以及对应标签的混合来生成虚拟数据,提高模型鲁棒性 [3]。


    应用

    语音识别

    语音识别指的是将语音信号转化为文字序列,它是所有基于语音交互的基础。对于语音识别而言,高斯混合模型(GMM)和马尔科夫模型(HMM)曾占据了几十年的发展历史。这些模型有很多优点,最重要的就是他们可以进行数学描述,研究人员可以有理有据的推导出适用某个方向的可行性办法。大约在1990年左右,判别模型获得了比基于最大似然估计的方法(GMM)更好的性能。尤其在2012年以后,深度学习在语音识别领域获得了很大的发展,CNN,RNN,CRNN等结构在语音识别性能上取得了一次次的突破。随着研究的深入,已经硬件设备的不断更新,一些端到端模型取得了state of the art的性能,比较有代表性的是之前提到的sequence-to-sequence模型(CTC,LAS)。随着语音识别性能的不断提升,工业界也产出了很多应用成果,比如虚拟助手:Google Home, Amazon Alexa and Microsoft Cortana;语音转录:YouTube的字幕生成等。

    音乐信息检索

    和语音不同,音乐通常包含很广泛的声源信息,并且在不同音乐源之间存在这复杂的依赖关系。音乐相关任务通常包含低级分析(起始和偏移检测,基频估计),节奏分析(节拍跟踪,仪表识别,下拍跟踪,速度估计),谐波分析(键检测,旋律提取,和弦估计), 高级分析(乐器检测,乐器分离,转录,结构分割,艺术家识别,类型分类,情绪分类)和高级比较(封面歌曲识别,音乐相似性估计,分数对齐)。上述这些任务通常通过人工设计算法,提取特征并且关联一个浅层的分类器。为了增强模型表征能力,获得更好的性能,上述任务可以通过深度神经网络单独训练或者联合训练。音乐相关的应用也很多,比如歌曲检索,乐器检索等。

    环境声识别

    有关环境声的任务主要有三类:声音场景识别、声音事件检测和标注。其中,声音场景分类就是将一段音频预测为某一个声音类别,是经典的分类任务;声音事件检测主要评估一段声音流某一类或者某几类声音在时间维度上的起始点和终止点;声音标注和分类任务相似,主要是预测多个声音类别的活动性,具体而言,给你一段声音,让你判断这段声音包含哪些声音类别,这些判断可能会包含更加细粒度的分类,比如判断发动机声音是汽车发动机还是摩托车发动机。环境声相关的应用包括声音监控,多媒体信息检索,可穿戴设备等。

    定位和跟踪

    利用多通道信号可以对声源位置进行跟踪和定位。跟踪和定位的主要设备条件是麦克风阵列,通常包含线性阵列、环形阵列和球形阵列等。麦克风阵列采集的信号一般是多通道的(和阵元数量相关)。传统定位方法可分为基于到达时延、基于空间谱估计和基于波束成型的方法。比如,MUSIC算法是一种基于空间谱估计的定位算法,它通过计算不同通道的协方差矩阵,对协方差矩阵进行特征分解,构造信号子空间和噪声子空间,然后进行空间谱的构建,最后进行谱峰搜索,确定声源位置。对于深度学习而言,是通过神经网络学习输入特征到输出声源位置的一个映射关系。通常输入特征可以选择幅度谱、相位谱以及相关矩阵等,网络结构可视情况选择MLP、CNN、CRNN等。定位和跟踪相关的应用包括监控、智能家居、智能会议室等。

    声源分离

    指的是在多声源混合的信号中提取单一的目标声源。主要应用在一些鲁棒声音识别的预处理以及音乐编辑和重谱。

    声音增强

    通常为语音增强,指的是通过减小噪声来提高语音质量。主要技术是去噪自编码器、CNN、RNN、GAN(SEGAN)等。

    生成模型

    根据数据集中的声音属性特征来生成新的数据,要求这些数据不能和原始数据集一样、要具有多样性并且训练和生成时间要很小,理想情况下是实时的。


    总结和展望

    特征

    MFCC是声音处理领域最常见的声音特征,但是MFCC在深度模型中性能不是很好。log-mel spectrogram是目前基于深度模型的最常用的特征,其次是复数谱和声音序列。声音序列避免了人工提取特征的步骤,这应该充分利用深度模型的特征学习能力,提取更强的表征特征。然而,直接使用声音序列对于模型的训练成本提出了更高的要求,另外对数据本身也有要求(其中一点就是数据量要大),在实际应用中也难以实现。实际上,目前大部分声音相关的任务的最好的系统是基于log-mel spectrogram的。

    作者也列举了几个开放的研究问题:

    • Mel spectrogram 是不是声音相关任务中最好的特征表示?
    • 什么情况下使用声音序列更好?
    • 是否可以通过带有可学习参数的spectrogram使性能更好?
    • 如果我们从声音序列中学习特征,那么这个特征是不是在任务中能够具有很好的泛化性?

    模型

    在语音识别、音乐信息检索和环境声识别领域中,深度学习都取代了传统的方法。在这些领域中,CNN、RNN和CRNN都取得了很好的效果,但是哪一种更好没有明确的定论。这两种或者三种网络根据其结构对输入数据进行不同形式的建模,比如CNN主要是局部特征的提取,RNN主要是时间维度相关性的学习,CRNN则是结合了两个网络的特征。

    关于模型的开放研究问题:

    • 在什么设定下,哪一种网络性能更好?

    数据要求

    除了语音识别领域,其他声音相关的任务都面临开放数据集小的问题。前面也提高过几个数据集,比如环境声的AudioSet,有200万个声音片段,但是这些声音都是weakly label的,实际上很难使用。在计算机视觉领域,针对特定领域开放数据集小的问题,可以通过ImageNet预训练模型,然后在目标领域进行适应性的调整。但是在声音处理领域,这样大型的预训练数据集是没有的。

    数据方面的开放研究问题:

    • 音频领域的等效问题是什么?
    • 能否构建一个包含语音、音乐、环境声的大型声音数据集用于迁移学习,以解决很多领域的分类问题?
    • 预训练模型如何使用少量数据适应新任务,比如新的语言、新的音乐风格、新的声音场景等?

    除此之外,在计算复杂度(成本)模型的可解释性也应该得到更多的关注。


    参考文献

    [1] A. Mohamed, G. Hinton, and G. Penn, “Understanding how Deep Belief Networks Perform Acoustic Modelling,” in ICASSP, 2012.

    [2] C. Trabelsi, O. Bilaniuk, Y. Zhang, D. Serdyuk, S. Subramanian, J. F. Santos, S. Mehri, N. Rostamzadeh, Y. Bengio, and C. J. Pal, “Deep complex networks,” arXiv:1705.09792, 2017.

    [3] Y. Tokozume, Y. Ushiku, and T. Harada, “Learning from between-class examples for deep sound recognition,” in ICLR, 2018.

    [4] H. Purwins, B. Li, T. Virtanen, J. Schlüter, S. Chang, T. Sainath, "Deep learning for audio signal processing", arXiv:1905.00078, 2019.

    展开全文
  • Rust中的数字音频信号处理。 以前是。 一组板条箱提供了与PCM(脉冲编码调制)DSP(数字信号处理)配合使用的基础。 换句话说, dasp提供了一套低级,高性能的工具,包括用于处理数字音频信号的类型,特征和功能...
  • 行业-电子政务-音频信号处理方法、装置及电子设备.zip
  • 文章目录一、音频基础知识1、声音的三要素2、音频的量化与编码3、音频压缩技术二、音频信号的读写1、python读取.wav音频2、python写.wav音频文件 一、音频基础知识 1、声音的三要素 (1)音调 人耳对声音高低的感觉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,178
精华内容 20,471
关键字:

音频信号处理