基于CNN卷积神经网络的语音信号识别算法matlab仿真

Posted 51matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于CNN卷积神经网络的语音信号识别算法matlab仿真相关的知识,希望对你有一定的参考价值。

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

2.算法涉及理论知识概要

       人工智能的应用中,语音识别在今年来取得显著进步,不管是英文、中文或者其他语种,机器的语音识别准确率在不断上升。其中,语音听写技术的发展最为迅速,目前已广泛在语音输入、语音搜索、语音助手等产品中得到应用并日臻成熟。但是,语音应用的另一层面,即语音转写,目前仍存在一定的难点,由于在产生录音文件的过程中使用者并没有预计到该录音会被用于语音识别,因而与语音听写相比,语音转写将面临说话风格、口音、录音质量等诸多挑战。

 

        语音转写的典型场景包括,记者采访、电视节目、课堂及交谈式会议等等,甚至包括任何人在日常的工作生活中产生的任何录音文件。 语音转写的市场及想象空间是巨大的,想象一下,如果人类可以征服语音转写,电视节目可以自动生动字幕、正式会议可以自动形成记要、记者采访的录音可以自动成稿……人的一生中说的话要比我们写过的字多的多,如果有一个软件能记录我们所说过的所有的话并进行高效的管理,这个世界将会多么的让人难以置信。

 

       卷积神经网络整体架构: 卷积神经网络是一种多层的监督学习神经网络,隐含层的卷积层和池采样层是实现卷积神经网络特征提取功能的核心模块。该网络模型通过采用梯度下降法最小化损失函数对网络中的权重参数逐层反向调节,通过频繁的迭代训练提高网络的精度。卷积神经网络的低隐层是由卷积层和最大池采样层交替组成,高层是全连接层对应传统多层感知器的隐含层和逻辑回归分类器。第一个全连接层的输入是由卷积层和子采样层进行特征提取得到的特征图像。最后一层输出层是一个分类器,可以采用逻辑回归,Softmax回归甚至是支持向量机对输入图像进行分类。

       CNN卷积神经网络一共有5个层次结构:

输入层

卷积层

激励层

池化层

全连接FC

 

1、 输入层:对原始图像数据进行预处理

1)原理:直接接收二维视觉模式,不再需要人工参与提取合适的特征作为输入,它自动地从原始图像数据提取特征、学习分类器,可大大减少开发的复杂性,有助于学习与当前分类任务最为有效的视觉特征。

2)与传统神经网络/机器学习一样,模型需要输入的进行预处理操作,常见的输入层中对图像预处理方式有:

去均值:把输入数据各个维度都中心化为0,即将样本的中心拉回到坐标系原点

归一化:幅度归一化到同样的范围

PCA/白化:用PCA降维,白化即将各个特征轴上的幅度进行归一化

 

 2、 卷积层:通过在原始图像上平移来提取特征

1) 卷积(convolution):是透过两个函数fg生成第三个函数的一种数学算子,表征函数f与经过翻转和平移的g的乘积函数

2) 卷积层(Convolutional layer),卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。

3)局部感知:网络部分连通,每个神经元只与上一层的部分神经元相连,只感知局部,而不是整幅图像

4、 池化层

1) 池化层夹在连续的卷积层中间,用于压缩数据和参数的量,减少过拟合。即输入的是图像的话,池化层的最主要作用就是压缩图像。(过拟合:过拟合其中一个可能的成因就是模型的vc维过高,使用了过强的模型复杂度(model complexity)的能力(参数多并且过训练)。还有一个原因是数据中的噪声,造成了如果完全拟合的话,也许与真实情景的偏差更大。最后还有一个原因是数据量有限,这使得模型无法真正了解整个数据的真实分布。权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征。)

2) 具体作用:

1.特征不变性:即图像压缩时去掉的信息只是一些无关紧要的信息,留下最能表达图像的特征

2.特征降维:即将最重要的特征抽取出来,将一些冗余信息去。

 

 

 

 

 

3.MATLAB核心程序

 

commands                 = categorical(["a","e","u","o","ye"]);
[adsTrain,adsValidation] = splitEachLabel(ads,0.75);
 
mysplit;
 
parameters;
 
randsels;
 
%Convolutional neural network
 
 
classWeights = 1./countcats(YTrain);
classWeights = classWeights\'/mean(classWeights);
numClasses   = numel(categories(YTrain));
timePoolSize = ceil(numHops/8);
dropoutProb  = 0.2;
numF         = 12;
layers = [
    imageInputLayer([numHops numBands])
    convolution2dLayer(3,numF,\'Padding\',\'same\')
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,\'Stride\',2,\'Padding\',\'same\')
    convolution2dLayer(3,2*numF,\'Padding\',\'same\')
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,\'Stride\',2,\'Padding\',\'same\')
    convolution2dLayer(3,4*numF,\'Padding\',\'same\')
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(3,\'Stride\',2,\'Padding\',\'same\')
    convolution2dLayer(3,4*numF,\'Padding\',\'same\')
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,4*numF,\'Padding\',\'same\')
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer([timePoolSize,1])
    dropoutLayer(dropoutProb)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    weightedClassificationLayer(classWeights)
    ];
miniBatchSize       = 64;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions(\'adam\', ...
    \'InitialLearnRate\',2e-4, ...
    \'MaxEpochs\',50, ...
    \'MiniBatchSize\',miniBatchSize, ...
    \'Shuffle\',\'every-epoch\', ...
    \'Plots\',\'training-progress\', ...
    \'Verbose\',false, ...
    \'ValidationData\',XValidation,YValidation, ...
    \'ValidationFrequency\',validationFrequency, ...
    \'LearnRateSchedule\',\'piecewise\', ...
    \'LearnRateDropFactor\',0.1, ...
    \'LearnRateDropPeriod\',20);
trainedNet = trainNetwork(XTrain,YTrain,layers,options);
save R.mat

 

  

 

使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类

本篇博客以及之后的一个系列,我将记录下我是如何从一个没学过信号处理,不懂什么是深度学习,没接触过心电信号的小白,一步步做出基于CNN的心电信号识别分类的过程。网络上关于ECG方面的相关博客内容不多,可以直接运行的相关代码也寥寥无几,这给初学者造成了很大的困难。希望通过自己的总结和整理能够帮助自己更好的理解这些知识和技术,也能够为同为新接触这方面研究的小伙伴们一些入门的帮助。本篇博客的相关代码由Python3写成,使用了TensorFlow2的框架,已经开源到了我的GitHub上,地址如下https://github.com/lxy764139720/mit-bih_ecg_recognition。这里还有一个其他博主使用MATLAB进行研究的相关博客,地址如下https://blog.csdn.net/qq_15746879/article/details/80329711

心电信号简介

在一个心跳周期中,心脏受到外界刺激后会有规律的持续收缩并产生电激动,之后刺激消失后又会舒张,在这个过程中,会有大量的心肌细胞产生有规律的电位变化,通过人体表面的电极可以记录到电位变化的曲线,曲线经过放大也就是临床上的心电图,即心电信号(ECG)。心电信号是一种微弱生物电信号,有以下特征:

(1)微弱性:心电信号的幅值在10uV-5mⅤ范围,是低幅值信号。

(2)不稳定性:心电信号在不断地变化且容易受到环境干扰,覆盖大量噪声,导致心电信号的很多有价值信息被淹没,很难检测,且不同个体在不同时刻下的心电图都是不同的,即使同一个体在不同生理状态下波形也可能不同。

(3)低频性:心电信号的频率范围主要在0.05-100Hz内,主要能量集中分布在0.5-40Hz。

一个完整的心拍主要由P波、QRS波群、T波、PR波段以及ST波段构成,不同波段分别反映了兴奋传导至心脏各部位的具体变化情况。PR间期和QT间期可以传递心电信号非常重要的生理信息,是心电信号中非常重要的特征。一个完整的心电波形如下图所示:

技术图片

常见心律失常疾病

心律失常是十分常见的心血管疾病,主要表现为心脏搏动频率或节律的异常。心律失常若得不到及时治疗,可发作导致人死亡。正常心率记为(Normal,N),常见的心律失常疾病主要包括:房性期前收缩( Premature Atrial Contraction,A)、室性期前收缩( Premature Ventricular Contraction,V)、左束支传导阻滞( Left bundle branch block,L)和右束支传导阻滞(Right Bundle Branch Block,R)等。

心电信号自动分类识别算法流程

技术图片

由于心电信号通常十分微弱,采集过程中容易受到各种因素的干扰,心电信号的噪声种类繁多,所以心电图分类识别的首要步骤就是对信号进行预处理。国内外研究学者针对去噪方面做了很多研究,主要的去噪手段有经典的数字滤波器和基于小波变换的阈值去噪等。经典的数字滤波器根据频率范围的不同对噪声进行去噪:对于基线漂移使用高通滤波器去噪、对于肌电干扰使用低通滤波器去噪、对于工频干扰使用带通滤波器去噪。近年来,小波变换技术的快速发展催生出了一系列基于小波阈值去噪技术。该类技术是根据信号和噪声的频率在不同尺度上的分布,先对信号进行小波变换,再根据阈值对各层小波系数进行处理,最后重构信号实现去噪。小波阈值去噪技术对于非平稳信号具有优秀的处理效果,与传统处理方法相比有显著的优越性。

在对心电信号进行预处理和特征提取的基础之上,使用深度学习对心电信号进行自动分类识别。深度学习的研究与神经网络有着密不可分的联系。2006年,Hinton提出了深度置信网络,成为了深度学习领域的一个里程碑。如今在大数据、计算机算力大幅度增加的背景下,深度学习已经在图像处理、语音识别和NLP等众多领域的研究中取得了巨大进展。而卷积神经网络模型经历了从最早的LeNet模型到现在的GoogleNet、ResNet等不断的演进,识别率已经十分优秀。在研究心电分类算法时,利用深度学习在大量数据处理方面表现出的优势,使得分类效果有着显著的提升。

以上是关于基于CNN卷积神经网络的语音信号识别算法matlab仿真的主要内容,如果未能解决你的问题,请参考以下文章

图像识别基于卷积神经网络CNN实现车牌识别matlab源码

图像识别基于卷积神经网络CNN实现车牌识别matlab源码

图像识别基于卷积神经网络CNN实现车牌识别matlab源码

图像识别基于卷积神经网络CNN实现车牌识别matlab源码

图像识别基于卷积神经网络CNN实现车牌识别matlab源码

卷积神经网络(CNN)在语音识别中的应用