精华内容
下载资源
问答
  • 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195 简介 脑机接口(BCI)使用神经活动作为控制信号,实现与计算机的直接通信。这种神经信号通常是从各种研究透彻...

    本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 QQ交流群:903290195

    简介

    脑机接口(BCI)使用神经活动作为控制信号,实现与计算机的直接通信。这种神经信号通常是从各种研究透彻的脑电图(EEG)信号中挑选出来的。卷积神经网络(CNN)主要用来自动特征提取和分类,其在计算机视觉和语音识别领域中的使用已经很广泛。CNN已成功应用于基于EEG的BCI;但是,CNN主要应用于单个BCI范式,在其他范式中的使用比较少,论文作者提出是否可以设计一个CNN架构来准确分类来自不同BCI范式的EEG信号,同时尽可能地紧凑(定义为模型中的参数数量)。该论文介绍了EEGNet,这是一种用于基于EEG的BCI的紧凑型卷积神经网络。论文介绍了使用深度和可分离卷积来构建特定于EEG的模型,该模型封装了脑机接口中常见的EEG特征提取概念。论文通过四种BCI范式(P300视觉诱发电位、错误相关负性反应(ERN)、运动相关皮层电位(MRCP)和感觉运动节律(SMR)),将EEGNet在主体内和跨主体分类方面与目前最先进的方法进行了比较。结果显示,在训练数据有限的情况下,EEGNet比参考算法具有更强的泛化能力和更高的性能。同时论文也证明了EEGNet可以有效地推广到ERP和基于振荡的BCI。

    实验结果如下图,P300数据集的所有CNN模型之间的差异非常小,但是MRCP数据集却存在显著的差异,两个EEGNet模型的性能都优于所有其他模型。对于ERN数据集来说,两个EEGNet模型的性能都优于其他所有模型(p < 0.05)。
    在这里插入图片描述

    EEGNet网络原理

    EEGNet网络结构图:
    在这里插入图片描述
    EEGNet原理架构如下:
    在这里插入图片描述

    EEGNet网络实现

    import numpy as np
    from sklearn.metrics import roc_auc_score, precision_score, recall_score, accuracy_score
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.autograd import Variable
    import torch.nn.functional as F
    import torch.optim as optim
    

    定义网络模型:

    class EEGNet(nn.Module):
        def __init__(self):
            super(EEGNet, self).__init__()
            self.T = 120
            
            # Layer 1
            self.conv1 = nn.Conv2d(1, 16, (1, 64), padding = 0)
            self.batchnorm1 = nn.BatchNorm2d(16, False)
            
            # Layer 2
            self.padding1 = nn.ZeroPad2d((16, 17, 0, 1))
            self.conv2 = nn.Conv2d(1, 4, (2, 32))
            self.batchnorm2 = nn.BatchNorm2d(4, False)
            self.pooling2 = nn.MaxPool2d(2, 4)
            
            # Layer 3
            self.padding2 = nn.ZeroPad2d((2, 1, 4, 3))
            self.conv3 = nn.Conv2d(4, 4, (8, 4))
            self.batchnorm3 = nn.BatchNorm2d(4, False)
            self.pooling3 = nn.MaxPool2d((2, 4))
            
            # 全连接层
            # 此维度将取决于数据中每个样本的时间戳数。
            # I have 120 timepoints. 
            self.fc1 = nn.Linear(4*2*7, 1)
            
    
        def forward(self, x):
            # Layer 1
            x = F.elu(self.conv1(x))
            x = self.batchnorm1(x)
            x = F.dropout(x, 0.25)
            x = x.permute(0, 3, 1, 2)
            
            # Layer 2
            x = self.padding1(x)
            x = F.elu(self.conv2(x))
            x = self.batchnorm2(x)
            x = F.dropout(x, 0.25)
            x = self.pooling2(x)
            
            # Layer 3
            x = self.padding2(x)
            x = F.elu(self.conv3(x))
            x = self.batchnorm3(x)
            x = F.dropout(x, 0.25)
            x = self.pooling3(x)
            
            # 全连接层
            x = x.view(-1, 4*2*7)
            x = F.sigmoid(self.fc1(x))
            return x
    

    定义评估指标:
    acc:准确率
    auc:AUC 即 ROC 曲线对应的面积
    recall:召回率
    precision:精确率
    fmeasure:F值

    def evaluate(model, X, Y, params = ["acc"]):
        results = []
        batch_size = 100
        
        predicted = []
        
        for i in range(len(X)//batch_size):
            s = i*batch_size
            e = i*batch_size+batch_size
            
            inputs = Variable(torch.from_numpy(X[s:e]))
            pred = model(inputs)
            
            predicted.append(pred.data.cpu().numpy())
            
        inputs = Variable(torch.from_numpy(X))
        predicted = model(inputs)
        predicted = predicted.data.cpu().numpy()
        """
        设置评估指标:
        acc:准确率
        auc:AUC 即 ROC 曲线对应的面积
        recall:召回率
        precision:精确率
        fmeasure:F值
        """
        for param in params:
            if param == 'acc':
                results.append(accuracy_score(Y, np.round(predicted)))
            if param == "auc":
                results.append(roc_auc_score(Y, predicted))
            if param == "recall":
                results.append(recall_score(Y, np.round(predicted)))
            if param == "precision":
                results.append(precision_score(Y, np.round(predicted)))
            if param == "fmeasure":
                precision = precision_score(Y, np.round(predicted))
                recall = recall_score(Y, np.round(predicted))
                results.append(2*precision*recall/ (precision+recall))
        return results
    

    构建网络EEGNet,并设置二分类交叉熵和Adam优化器

    # 定义网络
    net = EEGNet()
    # 定义二分类交叉熵 (Binary Cross Entropy)
    criterion = nn.BCELoss()
    # 定义Adam优化器
    optimizer = optim.Adam(net.parameters())
    

    创建数据集

    """
    生成训练数据集,数据集有100个样本
    训练数据X_train:为[0,1)之间的随机数;
    标签数据y_train:为0或1
    """
    X_train = np.random.rand(100, 1, 120, 64).astype('float32')
    y_train = np.round(np.random.rand(100).astype('float32')) 
    """
    生成验证数据集,数据集有100个样本
    验证数据X_val:为[0,1)之间的随机数;
    标签数据y_val:为0或1
    """
    X_val = np.random.rand(100, 1, 120, 64).astype('float32')
    y_val = np.round(np.random.rand(100).astype('float32'))
    """
    生成测试数据集,数据集有100个样本
    测试数据X_test:为[0,1)之间的随机数;
    标签数据y_test:为0或1
    """
    X_test = np.random.rand(100, 1, 120, 64).astype('float32')
    y_test = np.round(np.random.rand(100).astype('float32'))
    

    训练并验证

    batch_size = 32
    # 训练 循环
    for epoch in range(10): 
        print("\nEpoch ", epoch)
        
        running_loss = 0.0
        for i in range(len(X_train)//batch_size-1):
            s = i*batch_size
            e = i*batch_size+batch_size
            
            inputs = torch.from_numpy(X_train[s:e])
            labels = torch.FloatTensor(np.array([y_train[s:e]]).T*1.0)
            
            # wrap them in Variable
            inputs, labels = Variable(inputs), Variable(labels)
    
            # zero the parameter gradients
            optimizer.zero_grad()
    
            # forward + backward + optimize
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            
            optimizer.step()
            
            running_loss += loss.item()
        
        # 验证
        params = ["acc", "auc", "fmeasure"]
        print(params)
        print("Training Loss ", running_loss)
        print("Train - ", evaluate(net, X_train, y_train, params))
        print("Validation - ", evaluate(net, X_val, y_val, params))
        print("Test - ", evaluate(net, X_test, y_test, params))
    

    Epoch 0
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.6107637286186218
    Train - [0.52, 0.5280448717948718, 0.6470588235294118]
    Validation - [0.55, 0.450328407224959, 0.693877551020408]
    Test - [0.54, 0.578926282051282, 0.6617647058823529]

    Epoch 1
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.5536684393882751
    Train - [0.45, 0.41145833333333337, 0.5454545454545454]
    Validation - [0.55, 0.4823481116584565, 0.6564885496183207]
    Test - [0.65, 0.6530448717948717, 0.7107438016528926]

    Epoch 2
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.5197088718414307
    Train - [0.49, 0.5524839743589743, 0.5565217391304348]
    Validation - [0.53, 0.5870279146141215, 0.5436893203883495]
    Test - [0.57, 0.5428685897435898, 0.5567010309278351]

    Epoch 3
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.4534167051315308
    Train - [0.53, 0.5228365384615385, 0.4597701149425287]
    Validation - [0.5, 0.48152709359605916, 0.46808510638297873]
    Test - [0.61, 0.6502403846153847, 0.5517241379310345]

    Epoch 4
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.3821702003479004
    Train - [0.46, 0.4651442307692308, 0.3076923076923077]
    Validation - [0.47, 0.5977011494252874, 0.29333333333333333]
    Test - [0.52, 0.5268429487179488, 0.35135135135135137]

    Epoch 5
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.440490186214447
    Train - [0.56, 0.516025641025641, 0.35294117647058826]
    Validation - [0.36, 0.3801313628899836, 0.2]
    Test - [0.53, 0.6113782051282052, 0.27692307692307694]

    Epoch 6
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.4722238183021545
    Train - [0.47, 0.4194711538461539, 0.13114754098360656]
    Validation - [0.46, 0.5648604269293925, 0.2285714285714286]
    Test - [0.5, 0.5348557692307693, 0.10714285714285714]

    Epoch 7
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.3460421562194824
    Train - [0.51, 0.44871794871794873, 0.1694915254237288]
    Validation - [0.44, 0.4490968801313629, 0.2]
    Test - [0.53, 0.4803685897435898, 0.14545454545454545]

    Epoch 8
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.3336675763130188
    Train - [0.54, 0.4130608974358974, 0.20689655172413793]
    Validation - [0.39, 0.40394088669950734, 0.14084507042253522]
    Test - [0.51, 0.5400641025641025, 0.19672131147540983]

    Epoch 9
    [‘acc’, ‘auc’, ‘fmeasure’]
    Training Loss 1.438510239124298
    Train - [0.53, 0.5392628205128205, 0.22950819672131148]
    Validation - [0.42, 0.4848111658456486, 0.09375]
    Test - [0.56, 0.5420673076923076, 0.2413793103448276]

    参考
    EEGNet: 深度学习应用于脑电信号特征提取
    脑机学习者Rose笔记分享,QQ交流群:903290195
    更多分享,请关注公众号

    展开全文
  • 语音信号的LPC特征提取

    千次阅读 2020-09-28 15:31:28
    人类用语言交流的过程可以看成是一个复杂的通信过程,为了获取便于分析和处理的语音信源,必须将在空气中传播的声波转变为包含语音信息并且记载着声波物理性质的模拟(或数字)电信号,即语音信号,因而语音信号就成为...

    语言是人类创造的,是人类区别于其他地球生命的本质特征之一。语音是语言最本质、最自然、最直接的表现形式或载体,其表现形式为声波—一种由空气分子振动而形成的机械波。人类用语言交流的过程可以看成是一个复杂的通信过程,为了获取便于分析和处理的语音信源,必须将在空气中传播的声波转变为包含语音信息并且记载着声波物理性质的模拟(或数字)电信号,即语音信号,因而语音信号就成为语音的表现形式或载体。

    语音识别的研究工作大约开始于上个世纪50年代。1952年贝尔实验室首次研制成功能识别10个英语数字的孤立词语音识别系统——Audry系统。20世纪60年代中期,一系列数字信号处理方法和技术成为语音信号数字处理的理论和技术基础。在方法上,随着电子计算机的发展,以往的以硬件为中心的研究逐渐转化为以软件为主的处理研究。

    20世纪70年代,有几项研究成果对语音信号处理技术的进步和发展产生了重大的影响:70年代初,日本人板仓提出动态时间伸缩算法(DTW),使语音识别研究在匹配算法方面开辟了新思路;70年代中期,线性预测技术(LPC)被用于语音信号处理,隐马尔可夫模型(HMM,Hidden Markov Model)法也获得初步成功,该技术后来在语音信号处理的多个方面获得巨大成功;70年代末,Linda,Buzo,Gray和Markel等人首次解决了矢量量化(VQ)码书生成的方法,并首先成功得将矢量量化技术用于语音编码。从此矢量量化技术不仅在语音识别、语音编码和说话人识别等方面发挥了重要作用,而且很快推广到其他许多领域。

    80年代,语音识别研究进一步走向深入,首先是声学建模的方式由基于模板的方法全面向统计建模的转变,其次是隐马尔可夫模型和人工神经元网络在语音识别中得到了成功应用,而N元统计语言模型在大词汇听写系统中的应用使得人们突破了大词汇量、连续语音和非特定人这三大障碍,实现了大词汇量连续语音非特定人的语音识别。从此确定了统计方法和模型在语音识别和语言处理中的主流地位。

    进入20世纪90年代以来,语音识别在实用化方面取得了许多实质性的研究进展,逐渐由实验室走向实用化。一方面,对声学语言学统计模型的研究逐渐深入,鲁棒的语音识别、基于语音段的建模方法及隐马尔可夫模型与人工神经网络的结合成为研究的热点。另一方面,为了语音识别实用化的需要,讲者自适应、听觉模型、快速搜索识别算法以及进一步的语言模型的研究等课题倍受关注。

    随着语音识别技术的进步,其应用越来越广泛,尤其是孤立词语音识别系统应用前景非常广阔,如:语音控制系统,为人们在手动控制以外提供了一种更安全,更方便的控制方法,特别是当系统工作在一些特定的环境或针对一些特殊用户的时候;语音输入系统,用口述代替键盘向计算机输入文字,会给办公自动化和出版界带来革命性的变化;基于对话系统的数据库查询系统,为用户提供了更加友好便捷的数据库检索或查询,可以广泛运用在银行、交易所、民航等机构;除此之外,语音识别还可以用于口语翻译系统、计算机辅助教学、自动身份确认等领域。因此,针对特定人的孤立词语音识别系统具有广泛的实际意义。

    端点检测的目的是从包含语音的一段信号中确定出语音的起点以及终点。有效的端点检测不仅能使处理时间减到最小,而且能排除无声段的噪声干扰,从而使识别系统具有良好的识别性能。有学者用一个多话者的数字识别系统做了如下一个实验。首先对所有记录的语音用手工找出准确的端点,得到它们的识别率;然后逐帧(帧长为15ms)加大端点检测的误差,在每次加大误差的同时得到它们的识别率。结果表明在端点检测准确时识别率为93%的系统,当端点检测的误差在+60ms(4帧)时,识别率降低了3%;在+90ms(6帧)时,降低了10%;而当误差在进一步加大时,识别率急剧下降。这说明端点检测的成功与否甚至在某种程度上直接决定了整个语音识别系统的成败[4]。

    在设计一个成功的端点检测模块时,会遇到下列一些实际困难:

    ·信号取样时,由于电平的变化,难于设置对各次试验都适用的阀值。

    ·取样数据中,有时存在突发性干扰,使短时参数变得很大,持续很短时间后又恢复为寂静特性。应该将其计入寂静段中。

    ·弱摩擦音时或终点处是鼻音时,语音的特性与噪声极为接近,其中鼻韵往往还拖得很长。

    ·如果输入信号中有50Hz工频干扰或者A/D变换点的工作点偏移时,用短时过零率区分无声和清音就变的不可靠。

     

    1.1.2 语音的特点

    语音信号首先是一个宽带信号,它的频率范围从100Hz一直延伸到8000Hz。但是语音信号是由肺部呼出的气流通过声门形成的激励信号激励声道,再经口唇辐射而产生的。从信号处理的角度来看,可以把语音看成是由白噪声或者周期脉冲激励信号通过一个有色滤波器所产生的。这一过程在时域上看,相当于使样点之间产生了相关性;从频域上看,相当于给频谱加色,使原有的白色谱变成了非平坦的有色谱。此外,在浊音语音段,信号具有周期性,其频谱含有谱线结构。因此,除了谱包络代表的短时相关性外,浊音段还具有长时相关性。

    语音的另外一个重要的特点是短时平稳性。语音信号属于非平稳随机过程,但是在短时的条件下又具有平稳的特点。在一段短时间间隔内,语音信号的特征参数能够保持相对的稳定(一般为10~30ms)。语音信号的分析都是建立在短时平稳的基础上的,在分析的时候常用到“短时能量”、“短时过零率”、“短时相关”、“短时频谱”等参数。另外语音信号的相邻短时段的参数变化也不会很大,即它们之间也存在着相关性,这是由于人的发声器官运动速度的有限所决定的。语音信号的频率范围主要集中在300~3400Hz,一般在进行数字化处理的时候采样频率一般采用8KHz,根据不同的需要也可以取其它的一些采样频率进行量化。在采样量化前一般需要对语音信号的低频(低于300Hz)和高频部分(高于3400Hz)作滤除处理。

    语音信号简单的可以分为两类。一类是具有短时周期性的浊音,其周期称为基音p(Pitch),其频率称为基音频率(记为f)。对于男性,f大致分布在60~200Hz范围;对于女性和小孩,f大致分布在200~450Hz之间。另一类是具有随机噪声性质的清音,在声门关闭时由口腔压迫其中的空气发出。

    1.1.3 歌曲分割合成的研究意义

        歌曲是一种特殊的语音,本课题我们将重点研究歌曲的语音分割,下面我们将介绍一下关于歌曲的语音研究。

    随着人机语音交互技术的发展,让计算机合成歌曲成为了新的研究热点。计算机合成歌曲一般采用两种方式:第一种方式是朗读+修改的方式,也就是将说话者朗读的语音转换为歌曲,如通过分析语音(日语或英语)和歌曲在声学特征方面的差异,提出了用于修改语音信号的基频、音素时长以及频谱形状等参数的方法,实验证明合成的歌曲有较高的自然度。这种方式要求现场录音,发音是否标准和录音环境的好坏将会影响到合成歌曲的效果,同时录音设备的质量也会影响合成歌曲的自然度。第二种方式是利用语音合成技术,直接将歌词转换为歌曲唱出来。

    歌曲在本质上是一种特殊的语音,因此这里重点介绍语音信号处理的研究现状。语音信号处理是建立在语音学和数字信号处理的基础之上的,对语音信号模型进行分析、存储(编码)、传输、识别和合成等方面研究的一门综合性学科。它包括语音编码、语音合成和语音识别三大学科分支,并由此形成了语音存储(编码)技术、语音合成技术和语音识别技术三大实用技术。

    这里,我们将研究语音的合成技术来应用到歌曲的合成中。

    语音信号的数字化传输一直是通信发展的主要方向之一,语音的数字通信与模拟通信相比,无疑具有更好的效率和性能,这主要体现在:具有更好的话音质量;具有更强的抗干扰性,并易于进行加密;可节省带宽,能够更有效地利用网络资源;更加易于存储和处理。

    就语音编码技术而言,它的研究始于1939年Dudley发明的声码器,自70年代起,国外就开始研究计算机网络上的语音通信,当时主要是基于Arpanet网络平台进行的研究和实验。1974年首次分组语音实验是在美国西海岸南加州大学的信息科学研究所和东海岸的林肯实验室之间进行,语音编码为9.6Kbps的连续可变斜率增量调制。1974年12月LPC声码器首次用于分组语音通信实验,数码率为3.SKbps。1975年1月又首次在美国实现使用LPC声码器的分组话音电话会议。20世纪80年代的研究主要集中在局域网上的语音通信,1980年美国政府公布了一种2.4Kbps的LPC编码标准算法LPC-10,这使得在普通电话带宽信道中传输数字电话成为可能。1988年美国又公布了一个4.5Kbps的CELP语音编码标准算法,欧洲推出了一个16Kbps的RELP编码算法,这些算法的音质都能达到很高的质量,而不像单脉冲LPC声码器的输出语音那样不为人们所接受。进入20世纪90年代,随着Interent在全球范围内的兴起和语音编码技术的发展,IP分组语音通信技术获得了突破性的进展和实际应用。最初的应用只是在网络游戏等软件包中传送和存储语音信息,对语音质量要求低,相当于机器人的声音效果。

    就语音合成技术而言,目前的研究已经进入文字一语音转换阶段,其功能模块可分为文本分析、韵律建模和语音合成三大模块。其中,语音合成是TTS系统中最基本、最重要的模块。概括起来说,语音合成的主要功能是:根据韵律建模的结果,从原始语音库中取出相应的语音基元,利用特定的语音合成技术对语音基元进行韵律特性的调整和修改,最终合成出符合要求的语音。

    语音合成技术经历了一个逐步发展的过程,从参数合成到拼接合成,再到两者的逐步结合,其不断发展的动力是人们认知水平和需求的提高。目前,常用的语音合成技术主要有:共振峰合成、LPC合成拼接合成和LMA声道模型技术。它们各有优缺点,人们在应用过程中往往将多种技术有机地结合在一起,或将一种技术的优点运用到另一种技术上,以克服另一种技术的不足。

    2.2京剧的声学分析及音域特征

    歌唱音域反映了演员歌唱能力的一个方面,也是艺术嗓音研究的重要指标。西洋唱法的歌唱音域大致是两个八度,例如,女高音:A3-A5, 即220.0~880.0 Hz,女中音:F3-F5,即174.6~698.5 Hz,男高音:A2-A4,即110.0~440.0 Hz,男中音:E2-E4,即82.4~329.4 Hz。花旦和青衣歌唱音域的最高音近1 000 Hz,比女高音880 Hz高近1个音。老旦的演唱主要用真声,其歌唱音域的最高音比女中音高,但比女高音低,介于二者之间。丑、小生、老生和花脸等主要是男声的行当,歌唱音域的最高音至少比男高音440 Hz高一个音,而小生主要是用假声演唱,其歌唱音域的最高音比女高音880 Hz还高半个音。可见,京剧虽然不分声部,但多数属于西洋唱法的高音声部,唱腔的特点之一是调门高。

    2.3 基于短时能量和过零率的京剧分割理论介绍

    京剧的歌词分割,即将输入的京剧按歌词的发音进行字与字之间的分割,本节研究的算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。算法以短时能量检测为主,短时过零率检测为辅。根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。在本算法中,短时能量检测可以较好地区分出浊音和静音。对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段。由于京剧的特殊性,京剧可以视为特殊的语音信号,所以我们可以考虑使用语音端点检测的方法进行检测,京剧和语音具有一定的相似性。因此在研究京剧分割之前,可以首先对语音信号进行研究。

    语音一般分为无声段,清音段和浊音段。一般把浊音认为是一个以基音周期为周期的斜三角脉冲串,把清音模拟成随机白噪声。由于语音信号是一个非平稳态过程,不能用处理平稳信号的信号处理技术对其进行分析处理。但由于语音信号本身的特点,在10~30ms的短时间范围内,其特性可以看作是一个准稳态过程,即具有短时性。因此采用短时能量和过零率来对语音进行端点检测是可行的。

    语音信号是一种典型的时变信号,然而如果把观察时间缩短到十毫秒至几十毫秒,则可以得到一系列近似稳定的信号。人的发音器官可以用若干段前后连接的声管进行模拟,这就是所谓的声管模型。

    由于发音器官不可能毫无规律地快速变化,因此语音信号是准稳定的。全极点线性预测模型LPC可以对声管模型进行很好的描述,这里信号的激励源是由肺部气流的冲击引起的,声带可以有周期振动也可以不振动,分别对应浊音和清音,而每段声管则对应一个LPC模型的极点。一般情况下,极点的个数在12~16之间,就可以足够清晰地描述语音信号的特征了。LPC是语音分析的重要手段,它能很好地进行谱估计,即可作为语音特征的参数。因此仅用12个LPC系数就能很好地表示复杂语音信号的特征,这就大大降低了信号的冗余度并有效地减少了计算量和存储量,使之成为语音识别和语音压缩的基础。

    根据语音信号的产生模型,语音信号S(Z)是一个线性非移变因果稳定系统V(Z)受到信号E(Z)激励后所产生的输出。在时域中,语音信号S(n)是该系统的单位取样响应v(n)和激励信号e(n)的卷积。在语音信号数字处理所涉及的各个领域中,根据S(n)来求得v(n)和e(n)具有非常重要的意义。例如,为了求得语音信号的共振峰就需要知道V(Z)(共振峰频率是V(Z)的各对复共扼极点的频率)。又如,为了判断语音信号是清音还是浊音以及求得浊音情况下的基音频率,就应该知道e(n)或E(Z)。

    在实现各种语音编码、识别、合成以及说话人验证和识别等算法时无不需要由v(n)和e(n)的卷积s(n)来求得v(n)和e(n)。由卷积信号求得参与卷积的各个信号是数字信号处理各个领域中普遍遇到的一项共同的任务,解决此任务的算法称为解卷算法。解卷算法的研究是一项十分重要的研究课题,其目的在于用尽可能少的计算代价来获取尽可能准确的V(Z)和E(Z)的估计。

    解卷算法的深入研究还引入了很多重要的概念和参数,它们对于编码、识别、合成等许多研究工作和应用技术都是至关重要的。解卷算法可以分成两大类。第一类算法中首先为线性系统V(Z)建立一个模型,然后对模型的参数按照某种最佳准则进行估计,所以这种算法称为参数解卷。

    线性预测分析建立于在语音产生的数学模型,指的是一个语音取样的现在值可以用若干个语音取样过去值的加权线性组合来逼近,线性组合中的加权系数称为预测器系数。线性预测的基本问题是由语音信号直接求出一组预测系数,这组系数可以使得一短段语音波形中均方预测误差最小。图2-1所示为语音产生的数字模型简化图:

    当一个语音信号序列确实是由该数字模型产生,激励源是具有平坦谱包络特性的白噪声(相当于清音)时,应用线性预测误差滤波方法可以求得预测系数和增益,并且H(z)和所分析的语音序列有相同的谱包络特性。

    在浊音语音情况下,激励源是间隔为基音周期的冲激序列。基于考虑事实:u(n)是一串冲激组成,意味着大部分时间里它的值是非常小的(零值)。由于采用均方预测误差最小准则来使预测误差e(n)逼近u(n),与u(n)能量很小这一事实并不矛盾,因此为简化运算,我们认为无论是清音还是浊音,上图数字模型都是适合于线性预测分析的。

    求上面的线性预测方程组,求解有多种方法,常见的有利用杜宾递推计算的自相关法,利用乔里斯基分解计算协方差法,格型求解法。其中协方差法的优点是精度较高,缺点是不能保证所求得模型的稳定性;自相关法的优点是较简单且结果较稳定,缺点是由于两端的截断效应而精度较低;为了解决精度和稳定性的矛盾,引入正反向预测,基于自相关算法推出了格型结构的逆滤波器,可以直接递推求出线性预测系数。此处只介绍自相关法。

    LPC声码器是基于全极点声道模型的,采用LPC分析合成原理,对模型参数和激励参数进行编码传输。LPC声码器遵循二元激励的假设,即浊音语音段采用间隔为基音周期的脉冲序列作为激励,清音语音段采用白噪声序列作为激励。所以声码器只需要对LPC参数,基音周期,增益,清浊音信息进行编码。其结构框图如下所示:

    LPC声码器不考虑重建信号波形是否与原来信号的波形相同,而是努力使重建信号具有尽可能高的可懂性和清晰度,所以不进行传输预测残差,只要传输LPC参数和重构激励信号的基音周期和清浊音信息即可。

    基于线性预测编码的声码器具有一些非常优良的性能:可以用简洁的模型参数来表征语音信号的频谱幅度、共振峰等信息;其模型是线性的,非常利于分析,提取参数的运算量比较小;具有清晰的物理意义,有利于利用它建立各种编码模型。

        本系统其基本结构框图如下所示:

    首先针对一个简单语音信号进行分析,输入语音信号的仿真波形如下所示:

    图3.1 输入原始的语音信号

    对于输入的语音信号“‘你’‘可’‘以’‘找’‘到’‘更’‘好’‘的’”,这里首先通过短时能量和过零算法对该语音信号进行分割。

    由图可以很直观地想到,可以用信号的幅度作为特征,区分静音和语音。只要设定一个门限,当信号的幅度超过该门限的时候,就认为语音开始,当幅度降低到门限以下就认为语音结束。实际上,一般是用短时能量的概念来描述语音信号的幅度的。对于输入的语音信号X(N),其中N为采样点,首先进行帧的操作,将语音信号分成每20~30毫秒一段,相邻两帧起始点之间的间隔为10毫秒,也就是说两帧之间有10~20毫秒的交叠。由于采样频率的差异,帧长和帧移所对应的实际采样点数也是不同的。对于8KHZ采样频率,30毫的帧长对应240点,记为N,而10毫秒的帧移对应80点,记为M。

    在进行信号处理之前,首先要对语音信号进行滤波处理。

     

    图3.2 滤波之后的语音信号

    图3.3 计算短时能量及其门限对比图

    从上面的仿真结果可以看到,对于简单语音信号,通过短时能量计算,便能得到明显的分割效果,

    下面根据短时能量,对信号进行分割,得到如下的分割结果:

    图3.4 原始语音信号的分割结果

    从上面的仿真结果可以看到,对于简单的语音的信号,通过短时能量的算法能够得到最后的分割结果。

    短时能量分析和过零率分析作为语音信号时域分析中最基本的方法。但是很多情况表明使用单一的一种方法并不能得到理想的检测结果,这是因为短时能量分析是通过能量的高低来区分清音和浊音,不容易确定语音信号片段的起始点;而过零率分析仅仅是表明清音的过零率高于浊音,对噪声的存在比较敏感,如果背景中有反复穿越坐标轴的随机噪声,会产生大量的虚假过零率,影响检测结果。对于背景噪声和清音的区分则显得无能为力。将这两种方法结合起来,通过短时能量分析去除高频环境噪声的干扰,用过零率分析去除低频的干扰,检测效果较好。但综合考虑后,由于这两种方法本身的局限性以及过零率门限值和短时能量门限值的选取,使得检测的范围和精度仅限于单个单词,而对整个句子的检测还达不到令人满意的效果。

        首先使用一首歌词之间有明显间隔的歌曲进行测试,下面是其仿真结果图。

    图3.5 输入歌曲一

        这里是歌词之间发音比较清晰的歌曲,首先使用这个歌曲进行测试,通过短时能量和过零率进行分析,得到如下的分割结果。

    图3.6 经过短时能量分割后的歌曲

        从上面仿真结果可以看到,对于间隔较为明显的歌曲端,通过该方法能够较为正确的对歌曲进行分割,但是对于歌曲较为密集的区域,其无法分割出歌词。通过仿真其过零率和短时能量如下图所示:

    图3.7 短时能量和过零率分割图

        从图3.7可见,对于歌词分割较为明显的区域,其短时能量也能分割出来,但是对于歌词较为密集的区域,其短时能量是连接在一起的,这样就无法仅仅通过短时能量来分辨出该区域的歌词分布。

        下面通过输入一个另一个歌曲,其时域波形如下所示:

    图3.8 测试歌曲二

    这个歌曲,其共四个句子,句子与句子之间有明显的间断,但是句子之间,基本无法分辨出单个的歌词,这点可以通过其短时能量来观察,其短时能量仿真波形如下所示:

    图3.9 歌曲二的分割结果

        从图3.9仿真结果可以看到,每个句子之间起能做出明显的风格效果,但是对于句子之间,其虽然也有分割,但是无法做到对每个歌词的分割,这也是短时能量和过零分割的缺陷之一,因此,本课题不考虑使用该方法来对歌曲进行分割。

    3.2 基于手动分割的京剧分割

    从上面的分割结果可以看到,通过短时能量和过零的方法,并不能对复京剧的歌词进行正确分割,由于本课题的重点是对京剧歌曲的合成,这里暂时采用手动分割的方法对京剧歌曲进行分割。

    通过手动分割,将原始的歌曲按如下的格式进行分割并输出。通过分割后,那么原始的歌曲将按下面的格式进行输出:

    “输出中文,中文拼音,起始时间,结束时间”

    3.3 LPC编解码器的设计与实现

    首先将上面讨论得到的歌词作为歌词库存储起来,将其作为歌曲合成的歌词库,然后从歌词库中任意选取一些歌词,改变其基音和持续时间,合成新的歌曲。针对每个歌词进行和运算。

    本系统,设计的基于MATLAB的LPC算法流程如下所示:

    通过LPC算法流程,我们可以得到每个歌词的LPC系数,残差,增益,基音等参数,然后通过修改这些参数的值在进行LPC反变换得到新的歌词。

    单独通过一个歌词的仿真,通过该算法,可以得到其LPC系数如下所示:

    这里采用的是13LPC变换,通过该算法,对于每个歌词,可以得到一组13*x的矩阵数据。通过修改LPC参数的值,就能改变原信号的持续时间和基音大小。注意,这里主要是采用了13阶LPC,所以得到的LPC系数共13行。

    下面是一首京剧的分割结果:

    猛听的金鼓响画角声震,唤起我破天门壮志凌云。

    想当年桃花马上威风凛凛,敌血飞溅石榴裙。

    有生之日责当尽,寸土怎能属他人!

    番王小丑何足论,我一剑能挡百万兵。

        首先通过是用短时能量和过零的方法来进行京剧的分割,通过是用该方法,可以得到其分割结果如下所示:

     

     

     

    图4.1 京剧歌曲的时域波形

    其分割结果如下所示:

    图4.2 利用短时能量和过零算法进行京剧的分割

        对照歌词,对每个分割后的结果进行测试,发现通过这种算法,其分割结果不是很精确,因为原始的歌词为69个字,而通过短时能量的方法,其分割结果为64个字,即部分歌词无法正确分割,具体如下所示:

    图4.2 歌词“起,我”波形

    通过MATLAB的sound指令,可以知道这里是两个字,起,我,但是在分割的结果中,将其作为一个字进行分割了。为了得到根据精确的分割结果,这里采用手动分割的方法。通过分割得到其分割结果如下所示:

    表4.1 京剧《穆桂英挂帅》片段分割结果

     

    京剧

    1

    猛,meng  :  [0.50s , 1.44s]

    听,ting  :  [1.44s , 2.19s]

    得,de    :  [2.19s , 3.25s]

    金,jin   :  [3.25s , 3.63s]

    鼓,gu    :  [3.63s , 4.38s]

    响,xiang :  [4.38s , 5.13s]

    画,hua   :  [5.13s , 5.69s]

    角,jiao  :  [5.69s , 5.88s]

    声,sheng :  [5.88s , 6.56s]

    震,zhen  :  [6.56s , 7.56s]

    2

    唤,huan  :  [7.56s , 7.94s]

    起,qi    :  [7.94s , 8.63s]

    我,wo    :  [8.63s , 9.75s]

    破,po    :  [9.75s , 10.38s]

    天,tian  :  [10.38s , 10.75s]

    门,men   :  [10.75s , 11.44s]

    壮,zhuang:  [11.44s , 11.94s]

    志,zhi   :  [11.94s , 12.06s]

    凌,ling  :  [12.06s , 12.69s]

    云,yun   :  [12.75s , 13.44s]

    3

    想,xiang  :  [13.44s , 14.19s]

    当,dang   :  [14.19s , 14.88s]

    年,nian   :  [14.88s , 16.19s]

    桃,tao    :  [16.19s , 16.69s]

    花,hua    :  [16.69s , 16.88s]

    马,ma     :  [16.88s , 17.19s]

    上,shang  :  [17.19s , 17.50s]

    威,wei    :  [17.50s , 17.88s]

    风,feng   :  [17.88s , 18.50s]

    凛,lin  :  [18.50s , 18.75s]

    凛,lin  :  [18.75s , 19.38s]

    4

    敌,di    :  [19.38s , 19.94s]

    血,xue   :  [19.94s , 20.06s]

    飞,fei   :  [20.06s , 20.44s]

    溅,jian  :  [20.44s , 21.00s]

    石,shi   :  [21.00s , 21.44s]

    榴,liu   :  [21.44s , 21.94s]

    裙,qun   :  [21.94s , 22.88s]

    5

    有,you    :  [22.88s , 23.56s]

    生,sheng  :  [23.56s , 23.94s]

    之,zhi    :  [23.94s , 24.63s]

    日,ri     :  [24.63s , 25.00s]

    责,zhe    :  [25.13s , 25.81s]

    当,dang   :  [25.81s , 26.50s]

    尽,jin    :  [26.50s , 26.88s]

    寸,cun    :  [26.88s , 27.38s]

    土,tu     :  [27.38s , 27.75s]

    6

    怎,zen   :  [27.75s , 28.38s]

    能,neng  :  [28.38s , 28.75s]

    够,gou   :  [28.75s , 28.94s]

    属,shu   :  [28.94s , 29.38s]

    于,yu    :  [29.38s , 29.56s]

    他,ta    :  [29.56s , 30.31s]

    人,ren   :  [30.31s , 30.81s]

    7

    藩,fan    :  [30.81s , 31.13s]

    王,wang   :  [31.13s , 31.44s]

    小,xiao   :  [31.44s , 31.69s]

    丑,chou   :  [31.69s , 32.06s]

    何,he     :  [32.06s , 32.38s]

    足,zu     :  [32.38s , 32.63s]

    论,lun    :  [32.63s , 32.88s]

    8

    我,wo    :  [32.88s , 33.19s]

    一,yi    :  [33.19s , 33.56s]

    剑,jian  :  [33.56s , 33.88s]

    能,neng  :  [33.88s , 35.63s]

    挡,dang  :  [35.63s , 38.13s]

    百,bai   :  [38.13s , 41.88s]

    万,wan   :  [41.88s , 43.13s]

    兵,bing  :  [43.44s , 44.38s]

    我们将这个分割结果作为后期歌曲合成的歌词库。

    下面进行新歌曲的合成。假设一组随机选出的歌词,其时域波形如下所示:

    图4.2 原始的歌曲及其频谱图

        在不改变任何参数的情况下,通过LPC编解码后可以得到如下的仿真结果:

    图4.3 通过LPC编解码后的波形和平铺图

        通过上面的仿真可以看到,通过LPC编解码后期时域波形和频谱图基本相似,通过MATLAB中的sound指令,在听觉效果上,基本相同,这说明通过LPC编解码获得较好的合成效果。

        改变歌词的持续时间,通过修改LPC编码得到的各个参数,加快歌词播放时间,其仿真效果如下所示:

    图4.4 加快播放时间后的效果

    图4.5 加快播放时间后的效果

        通过改变歌曲的持续时间,可以看到起时域和频谱波形基本和变换前相同,改变就是时域波形在持续时间上变短了,从而加快的播放速度。

        改变歌词的音调,其仿真效果如下所示

    图4.6 改变音调后的仿真图

    以上就是通过LPC编解码改变歌曲发声时间,音调的基本仿真结果。

    展开全文
  • 点击上面"脑机接口社区"关注我们更多技术干货第一时间送达本文是由CSDN用户[frostime]授权分享。主要介绍了脑电信号提取PSD功率谱密度特征,包括:功率谱密度理论...

    本文是由CSDN用户[frostime]授权分享。主要介绍了脑电信号提取PSD功率谱密度特征,包括:功率谱密度理论基础、matlab中PSD函数的使用介绍以及实验示例。感谢 frostime!

    1. 序言

    脑电信号是一种非平稳的随机信号,一般而言随机信号的持续时间是无限长的,因此随机信号的总能量是无限的,而随机过程的任意一个样本函数都不满足绝对可积条件,所以其傅里叶变换不存在。

    不过,尽管随机信号的总能量是无限的,但其平均功率却是有限的,因此,要对随机信号的频域进行分析,应从功率谱出发进行研究才有意义。正因如此,在研究中经常使用功率谱密度(Power spectral density, PSD)来分析脑电信号的频域特性。

    本文简单的演示了对脑电信号提取功率谱密度特征然后分类的基本流程。希望对那些尚未入门、面对 BCI 任务不知所措的新手能有一点启发。

    2. 功率谱密度理论基础简述

    功率谱密度描是对随机变量均方值的量度,是单位频率的平均功率量纲。对功率谱在频域上积分就可以得到信号的平均功率。

    功率谱密度 是一个以频率 为自变量的映射, 反映了在频率成分 上信号有多少功率。

    我们假定一个随机过程 ,并定义一个截断阈值 ,随机过程 的截断过程 就可以定义为

    则该随机过程的能量可定义为

    对能量函数求导,就可以获得平均功率。

    根据 Parseval 定理(即能量从时域角度和频域角度来看都是相等的)可得:

    这里 是 经过傅里叶变换后的形式。由于随机过程 被限定在了一个有限的时间区间 之间,所以对随机过程的傅里叶变换不再受限。另外我们还需要注意到, 是一个随机变量,因此为了得到最终总体的平均功率,还需要求取随机变量的期望值。

    由此,通过求取 时的极限,就可以得到原始随机过程的平均功率 。

    将式中被积函数单独提取出来,定义为 :

    这样一来,平均功率 可以表示为 。通过这种定义方式,函数 可以表征每一个最小极限单位的频率分量所拥有的功率大小,因此我们把 称为功率谱密度。

    3. Matlab 中 PSD 函数的使用

    功率谱密度的估计方法有很多。总体来讲可以分为两大类:传统的非参数方法,和现代的参数方法。

    在这里插入图片描述

    本节不对理论知识做详细的叙述,感兴趣的可以深入查阅文献,这里只介绍一下有哪些方法,以及他们在 matlab 当中的使用。

    3.1 传统非参数方法估计 PSD

    最简单的方法是周期图法,先对信号做 FFT 变换,然后求平方,periodogram 函数实现了这个功能。不过周期图法估计的方差随采样点数N的增加而增加,不是很建议使用。

    另一种自相关方法,基于维纳辛钦定律:信号的功率谱估计等于该信号自相关函数的离散DTFT,不过我没有在 matlab 里找到对应的函数,如果有知道的朋友请告诉我一下。

    最常用的函数是 pwelch 函数,利用 welch 方法来求 PSD,这也是最推荐使用的。

    3.2 参数方法估计 PSD

    包括 pconvpburgpyulear 等几个方法。

    这些方法我没用过,所以也不敢随便乱说。

    4. 实验示例

    给出从 EEG 信号中提取功率谱特征并分类的简单范例。

    4.1 实验数据

    本文选用的实验数据为BCI Competition Ⅱ的任务四,使用的数据为 sp1s_aa_1000Hz.mat

    实验使用的数据

    这个数据集中,受试者坐在一张椅子上,手臂放在桌子上,手指放在电脑键盘的标准打字位置。被试需要用食指和小指依照自己选择的顺序按相应的键。实验的目标是预测按键前130毫秒手指运动的方向(左 OR 右)。

    在 matlab 中导入数据。

    %% 导入数据
    % 1000 Hz 记录了 500 ms
    load('sp1s_aa_1000Hz.mat');
    % 采样率 1000 Hz
    srate = 1000;
    [frames, channels, epochs] = size(x_train);
    
    rightwards = sum(y_train);
    leftwards = length(y_train) - rightwards;
    fprintf('一共有 %d 个训练样本,其中往左运动有 %d 个,往右运动有 %d 个\n',...
        length(y_train), leftwards, rightwards);
    
    一共有 316 个训练样本,其中往左运动有 159 个,往右运动有 157 个
    

    4.2 提取特征

    我们使用 welch 法来提取功率谱密度,利用 pwelch 函数计算功率谱,使用 bandpower 函数可以提取特定频段的功率信息,所以分别提取 、、、节律的功率。最后取各通道平均功率的前12个点(根据 f 来看,前 12 个点基本覆盖了 0到 40Hz 的频带)

    %% 提取 PSD 特征
    function [power_features] = ExtractPowerSpectralFeature(eeg_data, srate)
        % 从 EEG 信号中提取功率谱特征
        %   Parameters:
        %       eeg_data:   [channels, frames] 的 EEG 信号数据
        %       srate:      int, 采样率
        %   Returns:
        %       eeg_segments:   [1, n_features] vector
    
        %% 计算各个节律频带的信号功率
        [pxx, f] = pwelch(eeg_data, [], [], [], srate);
        power_delta = bandpower(pxx, f, [0.5, 4], 'psd');
        power_theta = bandpower(pxx, f, [4, 8], 'psd');
        power_alpha = bandpower(pxx, f, [8, 14], 'psd');
        power_beta = bandpower(pxx, f, [14, 30], 'psd');
    
        % 求 pxx 在通道维度上的平均值
        mean_pxx = mean(pxx, 2);
        % 简单地堆叠起来构成特征(可以用更高级地方法,比如考虑通道之间的相关性的方法构成特征向量)
        power_features = [
                        power_delta, power_theta, ...
                        power_alpha, power_beta, ...
                        mean_pxx(1:12)';
                    ];
    
    end
    

    然后对每个样本都提取特征,构造一个二维矩阵 X_train_features

    X_train_features = [];
    for i = 1:epochs
        % 取出数据
        eeg_data = squeeze(x_train(:, :, i));
        feature = ExtractPowerSpectralFeature(eeg_data, srate);
        X_train_features = [X_train_features; feature];
    end
    % 原始的 y_train 是行向量,展开成列向量
    y_train = y_train(:);
    

    4.3 分类

    使用 SVM 进行简单的分类任务,由于只是简单演示,所以不划分训练集、交叉验证集。

    % 由于只是简单演示,所以不划分训练集、交叉验证集
    model = fitcsvm(X_train_features, y_train,...
        'Standardize', true, 'KernelFunction', 'RBF', 'KernelScale', 'auto', 'verbose', 1);
    
    y_pred = model.predict(X_train_features);
    acc = sum(y_pred == y_train) / length(y_pred);
    fprintf('Train Accuracy: %.2f%%\n', acc * 100);
    

    结果如下:

    |===================================================================================================================================|
    |   Iteration  | Set  |   Set Size   |  Feasibility  |     Delta     |      KKT      |  Number of   |   Objective   |   Constraint  |
    |              |      |              |      Gap      |    Gradient   |   Violation   |  Supp. Vec.  |               |   Violation   |
    |===================================================================================================================================|
    |            0 |active|          316 |  9.968454e-01 |  2.000000e+00 |  1.000000e+00 |            0 |  0.000000e+00 |  0.000000e+00 |
    |          350 |active|          316 |  5.175246e-05 |  9.741516e-04 |  5.129944e-04 |          312 | -1.850933e+02 |  5.967449e-16 |
    
    由于 DeltaGradient,收敛时退出活动集。
    Train Accuracy: 94.62%
    

    作者博客:

    https://blog.csdn.net/frostime/article/details/106967703

    文章来源于网络,仅用于学术交流,不用于商业行为

    若有侵权及疑问,请后台留言,管理员即时删侵!

    更多阅读

    EEG伪影类型详解和过滤工具的汇总(一)

    你真的了解脑机接口技术吗?

    清华张钹院士专刊文章:迈向第三代人工智能(全文收录)

    脑机接口拼写器是否真的安全?华中科技大学研究团队对此做了相关研究

    脑机接口和卷积神经网络的初学指南(一)

    脑电数据处理分析教程汇总(eeglab, mne-python)

    P300脑机接口及数据集处理

    快速入门脑机接口:BCI基础(一)

    如何快速找到脑机接口社区的历史文章?

    脑机接口BCI学习交流QQ群:515148456

    展开全文
  • 利用python库librosa提取声音信号的mfcc特征前言librosa库介绍librosa 中MFCC特征提取函数介绍解决特征融合问题总结 前言 写这篇博文的目的有两个,第一是希望新手朋友们能够通过这篇博文了解到python还有这么强大...

    利用python库librosa提取声音信号的mfcc特征及特征融合

    前言

    写这篇博文的目的有两个,第一是希望新手朋友们能够通过这篇博文了解到 python 还有这么强大的一个声音处理库;第二则是本人在用该库时发现的一个小问题,就是库由于封装的太完备,在我们想做特征融合时候会出现一点小问题,在这我将指出并提供一种方案。具体的库使用指导还请参照Librosa 0.6

    librosa库介绍

    Liborsa是python的一个做音乐和声音分析的包,它提供了创建音乐信息检索系统所必要的构建块。这个库包含有丰富的声音信号处理工具,例如声音读取、采样率转换、stft、istft等等。

    librosa 中MFCC特征提取函数介绍

    # Mel-frequency cepstral coefficients (MFCCs)梅尔倒谱系数
    librosa.feature.mfcc(y=None, sr=22050, S=None, n_mfcc=20, dct_type=2, norm='ortho', **kwargs)
    

    参数介绍:
    y:声音信号的时域序列
    sr:采样频率(默认22050)
    S:对数能量梅尔谱(默认为空)
    n_mfcc:梅尔倒谱系数的数量(默认取20)
    dct_type:离散余弦变换(DCT)的类型(默认为类型2)
    norm:如果DCT的类型为是2或者3,参数设置为"ortho",使用正交归一化DCT基。归一化并不支持DCT类型为1
    kwargs:如果处理时间序列输入,参照melspectrogram

    返回:
    M:MFCC序列
    例子:

    从一个时间序列中计算mfcc

    >>> y, sr = librosa.load(librosa.util.example_audio_file(), offset=30, duration=5)
    >>> librosa.feature.mfcc(y=y, sr=sr)
    array([[ -5.229e+02,  -4.944e+02, ...,  -5.229e+02,  -5.229e+02],
           [  7.105e-15,   3.787e+01, ...,  -7.105e-15,  -7.105e-15],
           ...,
           [  1.066e-14,  -7.500e+00, ...,   1.421e-14,   1.421e-14],
           [  3.109e-14,  -5.058e+00, ...,   2.931e-14,   2.931e-14]])
    

    利用预先计算好的对数能力梅尔谱计算MFCC

    >>> S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000)
    >>> librosa.feature.mfcc(S=librosa.power_to_db(S))
    array([[ -5.207e+02,  -4.898e+02, ...,  -5.207e+02,  -5.207e+02],
           [ -2.576e-14,   4.054e+01, ...,  -3.997e-14,  -3.997e-14],
           ...,
           [  7.105e-15,  -3.534e+00, ...,   0.000e+00,   0.000e+00],
           [  3.020e-14,  -2.613e+00, ...,   3.553e-14,   3.553e-14]])
    

    解决特征融合问题

    采用封装好的函数进行mfcc提取,我们得到的是一个经过分帧加窗及其一系列处理后的数据,要想在每一帧的mfcc后面添加其他特征首先要得到分帧的参数设置,然后对待融合特征采用相同的分帧机制,才能保证二者的融合是在相同帧的情况下进行的。例如我们要对mfcc特征与短时能量特征进行融合,我们在提取二者过程中要保证其分帧方式相同,然后对求得特征进行拼接。mfcc与能量的特征融合代码如下:

    import librosa
    import matplotlib.pyplot as plt
    import numpy as np
    
    path='E:\\Experiment\\soundbank\\cut\\trainall\\screams\\2\\4,00001_2__11.wav' # 声音文件绝对路径
    y,sr=librosa.load(path,None) # 以原采样频率读取声音文件数据,并返回该数据及其采样频率
    # 设置梅尔滤波器组参数,并设置分帧参数n_fft--帧长,hp_length--帧移
    S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=60,n_fft=1024, hop_length=512,fmax=16000) 
    mfcc=librosa.feature.mfcc(y, sr, S=librosa.power_to_db(S),n_mfcc=40) # 提取mfcc系数
    stft_coff=abs(librosa.stft(y,1024,512,1024)) #分帧然后求短时傅里叶变换,分帧参数与对数能量梅尔滤波器组参数设置要相同
    energy = np.sum(np.square(stft_coff),0) #求每一帧的平均能量
    MFCC_Energy = np.vstack((mfcc,energy)) # 将每一帧的MFCC与短时能量拼接在一起 
    

    其他特征融合方式与上相同。

    总结

    python库虽然多,为了以后更好的发展还是建议学习时候从原理开始学起,后面我将会继续补充关于python编程过程中遇到的一些小问题,以及技巧,欢迎关注交流。

    展开全文
  • 铁路信号基础知识——信号部分

    千次阅读 2019-06-25 22:01:27
    一.信号 信号:是传递信息的符号。 铁路信号设备是一个总名称,概而言之为信号、联锁、闭塞 铁路信号:是向有关行车和调车...铁路信号按感官的感受方式可分为视觉信号和听觉信号两大类。 视觉信号:是以颜色、形...
  • CVBS视频信号解析

    万次阅读 多人点赞 2014-02-19 09:46:46
    在我们的电视天线信号线里就只有两跟线,中间有一根很粗的线,外围包着一层的线,这是为了防止外界信号的干扰。在这两根线中一个是地线,一根是全电视信号线,外围的是地线。  做视频处理很难免要接触电视信号,...
  • 信号及频谱分析

    千次阅读 2020-04-26 13:15:07
    一、信号的分类 1、从信号描述上分:确定性...4、连续时间信号又可以分为 :动态信号信号的幅值、相位、周期等特征参数随时间的变化而变化的信号)、静态信号 动态信号又可以分为:确定性信号、非确定性信号 ...
  • 语音信号

    千次阅读 2017-05-01 13:18:18
    语音信号的基础知识
  • 2.1.2 捕获时-频-空特征之间的局部特征 脑电信号的时-频-空特征中会存在一些反映大脑情绪的局部特征。如图中的红框所示,受试者处于积极情绪时,大脑颞叶在 频段下的激活程度会比消极时更高。这些局部特征的存在有...
  • (一)信号及脉冲电信号

    千次阅读 2019-11-06 11:42:31
    电流信号(直流电、交流电、脉冲电) 电磁波中的无线电信号信号(机械波、电磁波) 按传输介质分类(传输的都是电磁波) 有线信号(电线传输的电信号、光缆传输的光信号) 无线信号(自由空间 传输的无线电、微波等)...
  • 语音信号采集与处理

    千次阅读 2020-11-09 15:39:49
    音频是多媒体信息的一个重要组成部分,音频信号的频率范围大约是20Hz~20kHz。音频信号的采集与处理已经广泛...因此,语音信号是人们构成思想疏通和感情交流的最主要的途径。并且,由于语言和语音与人的智力活动密..
  • 信号数据EMD分解+IMF时序数据LSTM预测建模实践

    千次阅读 热门讨论 2020-05-30 17:24:00
    对于现在的我来说,属于数据信号处理领域里面的小白,所以写这篇文章很可能会有错误或者是不合理的地方,如果问题欢迎指出,欢迎交流学习,同时呢?这里也是自己学习过程的记录,包括自己在了解一些信号处理算法时...
  • 由于看网上关于语音信号处理的入门书籍和课程推荐的比较少,同时相关的领域人员也比较少,所以建了这个公众号,欢迎各位同仁指正交流,谢谢。 本文是从我的公众号【音频信号处理那些事儿】选取而来的,所以直接复制...
  • 1、基带信号  信息源(简称信源)发出的没有经过调制(进行频谱...根据原始电信号特征,基带信号可分为数字基带信号和模拟基带信号(相应地,信源也分为数字信源和模拟信源。)其由信源决定。说的通俗一点,基...
  • MATLAB 信号处理仿真入门实验

    万次阅读 多人点赞 2018-04-10 16:55:11
    MATLAB 信号处理仿真入门实验 实验目的: • 熟悉 Matlab 工具的基本用法 • 掌握 Matlab 代码编写方法 • 理解序列的离散时间傅里叶变换 • 理解 DFT 结果的频谱能量泄露 • 理解 DFT 和 DTFT 的对应关系 •...
  • IIR数字滤波器设计(数字信号处理)

    万次阅读 多人点赞 2018-12-18 16:31:38
    欢迎来访交流 ~~ IIR数字滤波器设计(数字信号处理) 一、实验目的 1.熟悉双线性变换法设计IIR数字滤波器的原理与方法。 2.掌握IIR数字滤波器的MATLAB实现方法,会调用ellipord()和ellip() 函数设计各种滤波器...
  • 基于语音信号MFCC的情感识别

    千次阅读 热门讨论 2016-06-13 22:42:05
    信号处理课程结束了,没有像期望的那样学到很多东西,买的书(Discrete-Time)也没怎么看,作业算是完成了,但是要达到该坑的...基于MFCC的语音情感识别在人类的面对面交流场景中,语音所传达的信息量占有很大的比重
  • 1. 信号与系统的模型 采样是“系统”的功能,采样的目的是对输入的连续信号进行离散化处理。 2. 为什么要对连续信号离散化? 在上述架构中,中间的离散系统,通常是微处理器构建的计算机系统。 目的: (1...
  • 【自动语音识别课程】第二课 语音信号分析

    万次阅读 多人点赞 2014-07-02 16:50:09
    针对ASR的语音信号分析 特征 频谱分析 倒谱分析 标准特征:MFCC和PLP分析 动态特征
  • CVBS信号解析

    千次阅读 2015-09-22 20:57:52
    在我们的电视天线信号线里就只有两跟线,中间有一根很粗的线,外围包着一层的线,这是为了防止外界信号的干扰。在这两根线中一个是地线,一根是全电视信号线,外围的是地线。  做视频处理很难免要接触电视信号,...
  • 信号质量评估: 选择合适的信号特征表征信号质量。 文章目录信号质量评估方法分类ECG信号质量评估方法PPG信号质量评估方法 在使用PPG信号监测心率和血氧过程中,信号质量的好坏直接决定了心率和血氧值的准确性。因此...
  • CVBS信号解析过程

    万次阅读 2017-06-27 11:04:24
    在我们的电视天线信号线里就只有两跟线,中间有一根很粗的线,外围包着一层的线,这是为了防止外界信号的干扰。在这两根线中一个是地线,一根是全电视信号线,外围的是地线。做视频处理很难免要接触电视信号,了解全...
  • 传输线理论 特征阻抗

    万次阅读 多人点赞 2018-08-13 15:05:23
    特征阻抗: 传输线理论  电流永远都是一个回路。 信号频率: 如果传输线上传输的信号是低频信号,假设是1KHz,那么信号的波长就是300公里(假设信号速度为光速),即使传输线的长度有1米长,相对于信号来说还是很...
  • 常见采集脑电信号的四种技术

    千次阅读 2019-12-30 21:48:44
    目录脑电图(Electroencephalography,EEG)皮层脑电图(Electrocorticography, ECoG)深度...文章来源:常见采集脑电信号的四种技术 脑机接口(BCI)是可以不间断地进行通信或控制的设备。BCI检测到用户大脑活动的特定...
  • 信号与系统】复习总结笔记

    千次阅读 多人点赞 2016-12-18 15:05:00
    学习笔记(信号与系统) 来源:网络 第一章 信号和系统 信号的概念、描述和分类 信号的基本运算 典型信号 系统的概念和分类 1、常常把来自外界的各种报道统称为消息; 信息是消息中有意义的内容;...
  • 应用深度学习EEGNet来处理脑电信号

    千次阅读 2020-01-15 17:18:59
    本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195 EEGNet论文 EEGNet简介 脑机接口(BCI)使用神经活动作为控制信号,实现与计算机的直接通信。这种神经信号通常...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,188
精华内容 4,475
关键字:

交流信号的特征参数