语音增强--卡尔曼滤波介绍及MATLAB实现

2023-05-16

语音增强--------------卡尔曼滤波

状态方程

x k + 1 = Φ k x k + Γ u k {{\mathbf{x}}_{k+1}}={{\mathbf{\Phi }}_{k}}{{\mathbf{x}}_{k}}+\mathbf{\Gamma }{{\mathbf{u}}_{k}} xk+1=Φkxk+Γuk

观测方程

y k + 1 = H k + 1 x k + 1 + n k + 1 {{\mathbf{y}}_{k+1}}={{\mathbf{H}}_{k+1}}{{\mathbf{x}}_{k+1}}+{{\mathbf{n}}_{k+1}} yk+1=Hk+1xk+1+nk+1

原理介绍

假设在时刻 t k {{t}_{k}} tk,基于 t k {{t}_{k}} tk时刻以前所获得的全部知识,对状态变量 x k {{\mathbf{x}}_{k}} xk做出一个预测估计,记为 x ^ k − \mathbf{\hat{x}}_{k}^{-} x^k,则预测估计的误差为
e k − = x k − x ^ k − \mathbf{e}_{k}^{-}={{\mathbf{x}}_{k}}-\mathbf{\hat{x}}_{k}^{-} ek=xkx^k
称为预测误差。预测误差是零均值的,其协方差矩阵为
C k − = E { e k − e k − T } = E { ( x k − x ^ k − ) ( x k − x ^ k − ) T } \mathbf{C}_{k}^{-}=E\left\{ \mathbf{e}_{k}^{-}\mathbf{e}{{_{k}^{-}}^{T}} \right\}\left. =E\left\{ \left( {{\mathbf{x}}_{k}}-\mathbf{\hat{x}}_{k}^{-} \right){{\left( {{\mathbf{x}}_{k}}-\mathbf{\hat{x}}_{k}^{-} \right)}^{T}} \right. \right\} Ck=E{ekekT}=E{(xkx^k)(xkx^k)T}
在预测估计 x ^ k − \mathbf{\hat{x}}_{k}^{-} x^k的基础上,利用 t k {{t}_{k}} tk时刻所获取的新观测数据 y k {{\mathbf{y}}_{k}} yk来进一步改善对 x k {{\mathbf{x}}_{k}} xk的估计,记为 x ^ k {{\mathbf{\hat{x}}}_{k}} x^k,称为更新估计,更新估计通过下式完成:
x ^ k = x ^ k − + K k ( y k − H k x ^ k − ) {{\mathbf{\hat{x}}}_{k}}=\mathbf{\hat{x}}_{k}^{-}+{{\mathbf{K}}_{k}}\left( {{\mathbf{y}}_{k}}-{{\mathbf{H}}_{k}}\mathbf{\hat{x}}_{k}^{-} \right) x^k=x^k+Kk(ykHkx^k)
其中 K k {{\mathbf{K}}_{k}} Kk为待定的增益矩阵,称为卡尔曼增益。
更新估计的误差记作 e k {{\mathbf{e}}_{k}} ek,则有
e k = x k − x ^ k = x k − [ x ^ k − + K k ( y k − H k x ^ k − ) ] {{\mathbf{e}}_{k}}={{\mathbf{x}}_{k}}-{{\mathbf{\hat{x}}}_{k}}={{\mathbf{x}}_{k}}-\left[ \mathbf{\hat{x}}_{k}^{-}+ \right.\left. {{\mathbf{K}}_{k}}\left( {{\mathbf{y}}_{k}}-{{\mathbf{H}}_{k}}\mathbf{\hat{x}}_{k}^{-} \right) \right] ek=xkx^k=xk[x^k+Kk(ykHkx^k)]
矢量卡尔曼滤波的实质就是寻找适当的增益矩阵 K k {{\mathbf{K}}_{k}} Kk,使更新估计的均方误差达到最小。
具体推导过程可以参照参考文献[1],这里只给出最终的递推过程
(1) 建立状态空间模型
x k + 1 = Φ k x k + Γ u k y k + 1 = H k + 1 x k + 1 + n k + 1 \begin{aligned} & {{\mathbf{x}}_{k+1}}={{\mathbf{\Phi }}_{k}}{{\mathbf{x}}_{k}}+\mathbf{\Gamma }{{\mathbf{u}}_{k}} \\ & {{\mathbf{y}}_{k+1}}={{\mathbf{H}}_{k+1}}{{\mathbf{x}}_{k+1}}+{{\mathbf{n}}_{k+1}} \\ \end{aligned} xk+1=Φkxk+Γukyk+1=Hk+1xk+1+nk+1
(2) 设置初始化条件
x ^ 0 = E { x 0 } C 0 = V a r { x 0 } \begin{aligned} & {{{\mathbf{\hat{x}}}}_{0}}=E\left\{ {{\mathbf{x}}_{0}} \right\} \\ & {{\mathbf{C}}_{0}}=Var\left\{ {{\mathbf{x}}_{0}} \right\} \end{aligned} x^0=E{x0}C0=Var{x0}
(3) 预测
x ^ k + 1 − = Φ k x ^ k \mathbf{\hat{x}}_{k+1}^{-}={{\mathbf{\Phi }}_{k}}{{\mathbf{\hat{x}}}_{k}} x^k+1=Φkx^k
(4) 计算预测误差的协方差
C k + 1 − = Φ k C k Φ k T + Γ Q k Γ T \mathbf{C}_{k+1}^{-}={{\mathbf{\Phi }}_{k}}{{\mathbf{C}}_{k}}\mathbf{\Phi }_{k}^{T}+\mathbf{\Gamma }{{\mathbf{Q}}_{k}}{{\mathbf{\Gamma }}^{T}} Ck+1=ΦkCkΦkT+ΓQkΓT
(5) 计算卡尔曼增益
K k + 1 = C k + 1 − H k + 1 T ( H k + 1 C k + 1 − H k + 1 T + R k + 1 ) − 1 {{\mathbf{K}}_{k+1}}=\mathbf{C}_{k+1}^{-}\mathbf{H}_{k+1}^{T}{{\left( {{\mathbf{H}}_{k+1}}\mathbf{C}_{k+1}^{-}\mathbf{H}_{k+1}^{T}+{{\mathbf{R}}_{k+1}} \right)}^{-1}} Kk+1=Ck+1Hk+1T(Hk+1Ck+1Hk+1T+Rk+1)1
(6) 更新
x ^ k + 1 = x ^ k + 1 − + K k + 1 ( y k + 1 − H k + 1 x ^ k + 1 − ) {{\mathbf{\hat{x}}}_{k+1}}=\mathbf{\hat{x}}_{k+1}^{-}+{{\mathbf{K}}_{k+1}}\left( {{\mathbf{y}}_{k+1}}-{{\mathbf{H}}_{k+1}}\mathbf{\hat{x}}_{k+1}^{-} \right) x^k+1=x^k+1+Kk+1(yk+1Hk+1x^k+1)
(7) 估计误差的协方差
C k + 1 = ( I − K k + 1 H k + 1 ) C k + 1 − {{\mathbf{C}}_{k+1}}=\left( \mathbf{I}-{{\mathbf{K}}_{k+1}}{{\mathbf{H}}_{k+1}} \right)\mathbf{C}_{k+1}^{-} Ck+1=(IKk+1Hk+1)Ck+1
(8) 令 k = k + 1 k=k+1 k=k+1 ,重复步骤(3)-(8)直到当前时刻
其中
E { n k n i T } = { R k i = k 0    i ≠ k E\left\{ {{\mathbf{n}}_{k}}\mathbf{n}_{i}^{T} \right\}=\left\{ \begin{aligned} & {{\mathbf{R}}_{k}}\quad i=k \\ & 0\quad \ \ i\ne k \\ \end{aligned} \right. E{nkniT}={Rki=k0  i=k
E { u k u i T } = { Q k      i = k 0       i ≠ k E\left\{ {{\mathbf{u}}_{k}}\mathbf{u}_{i}^{T} \right\}=\left\{ \begin{aligned} & {{\mathbf{Q}}_{k}}\ \ \ \text{ }i=k \\ & 0\ \ \ \ \text{ }i\ne k \\ \end{aligned} \right. E{ukuiT}={Qk    i=k0     i=k
仿真参数为

参数名称参数值
信噪比5dB
采样率16KHz

仿真结果如下
在这里插入图片描述
随着卡尔曼滤波收敛的过程中,误差的协方差矩阵会变得越来越小,从图中也可以看出,经过卡尔曼滤波之后的语音信号,噪声很大程度地被滤除,进一步地提高了语音的质量。

主函数

clear;
close all;
clc;
%% 读入数据
[signal,~]=audioread('clean.wav');      %读入干净语音
[noise,fs]=audioread('noise.wav');       %读入噪声
N=3*fs;                                              %选取3秒的语音
signal=signal(1:N);
noise=noise(1:N);
t=(0:N-1)/fs;
SNR=5;                 %信噪比大小
noise=noise/norm(noise,2).*10^(-SNR/20)*norm(signal);
x=signal+noise;          %产生固定信噪比的带噪语音
Time = (0:1/fs:(length(signal)-1)/fs)';      %时间轴
Noise=x(1:fs,1);                     %选取前1秒语音作为噪声方差估计
len_win = 0.0025;       % 窗长2.5ms
shift_percent = 1;       % 窗移占比
AR_order = 20;           % 滤波器阶数
iter = 7;                      %迭代次数设置
%% 分帧加窗处理
len_winframe = fix(len_win * fs);
window = ones(len_winframe,1);
[y, num_frame] = KFrame(x, len_winframe, window, shift_percent);

%% 初始化
H = [zeros(1,AR_order-1),1];   % 观测矩阵
R = var(Noise);                       % 噪声方差
[filt_coeff, Q] = lpc(y, AR_order);              % LPC预测,得到滤波器的系数
C = R * eye(AR_order,AR_order);              % 误差协方差矩阵
enhanced_speech = zeros(1,length(x));    % 增强后的语音信号
enhanced_speech(1:AR_order) = x(1:AR_order,1)';   %初始化
updata_x = x(1:AR_order,1);

% 迭代器的次数.
i = AR_order+1;
j = AR_order+1;

%% 卡尔曼滤波
for k = 1:num_frame   %一次处理一帧信号
    jStart = j;     %跟踪每次迭代AR_Order+1的值.
    OutputOld = updata_x;    %为每次迭代保留第一批AROrder预估量
    
    for l = 1:iter               %迭代次数
        fai = [zeros(AR_order-1,1) eye(AR_order-1); fliplr(-filt_coeff(k,2:end))];
        
        for ii = i:len_winframe
            %% 卡尔曼滤波
            predict_x = fai * updata_x;
            predict_C = (fai * C * fai') + (H' * Q(k) * H);
            K = (predict_C * H')/((H * predict_C * H') + R);
            updata_x = predict_x + (K * (y(ii,k) - (H*predict_x)));
            enhanced_speech(j-AR_order+1:j) = updata_x';
            C = (eye(AR_order) - K * H) * predict_C;
            j = j+1;
        end
        i = 1;
        if l < iter
            j = jStart;
            updata_x = OutputOld;
        end
        % 更新滤波后信号的lpc
        [filt_coeff(k,:), Q(k)] = lpc(enhanced_speech((k-1)*len_winframe+1:k*len_winframe),AR_order);
    end
end
enhanced_speech = enhanced_speech(1:N)';
figure(1)
subplot(321);
plot(t,signal);ylim([-1.5,1.5]);title('干净语音');xlabel('时间/s');ylabel('幅度');
subplot(323);
plot(t,x);ylim([-1.5,1.5]);title('带噪语音');xlabel('时间/s');ylabel('幅度');
subplot(325);
plot(t,real(enhanced_speech));ylim([-1.5,1.5]);title('卡尔曼滤波增强后的语音');xlabel('时间/s');ylabel('幅度');
subplot(322);
spectrogram(signal,256,128,256,16000,'yaxis');
subplot(324);
spectrogram(x,256,128,256,16000,'yaxis');
subplot(326);
spectrogram(enhanced_speech,256,128,256,16000,'yaxis');

KFrame.m

function [Output, NumSegments] = KFrame(Input, WindowLength, Window, HoppingSize)
% Chopper windows the signal based on window length, shift percantage and
% uses Hamming windowing technique.

% Number of samples to hop.
HoppingSamples = fix(WindowLength.*HoppingSize);

% Number of segments.
NumSegments = fix(((length(Input)-WindowLength)/HoppingSamples) + 1);

% Index matrix which guides the signal through chopping process.
Index = (repmat(1:WindowLength,NumSegments,1) + repmat((0:(NumSegments-1))'*HoppingSamples,1,WindowLength))';

% Final window which multiplies with original signal to give pieces of it.
FinalWindow = repmat(Window,1,NumSegments);

% Ta-da... 
Output = Input(Index).*FinalWindow;
end

关于语音及噪声文件,具体请参考:语音信号处理常用语料库下载地址

参考文献:
[1] 叶中付. 统计信号处理[M]. 中国科学技术大学出版社, 2013.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语音增强--卡尔曼滤波介绍及MATLAB实现 的相关文章

  • Hadoop入门-WordCount示例

    WordCount的过程如图 xff0c 这里记录下入门的过程 xff0c 虽然有很多地方理解的只是皮毛 Hadoop的安装 安装比较简单 xff0c 安装完成后进行单机环境的配置 hadoop env sh 指定JAVA HOME spa
  • Phaser入门教程

    入门教程 xff0c 我可不会讲什么概念 xff0c 我只会讲一个入门例子 xff0c 通过这个例子 xff0c 你就知道 phaser有多么强大 xff0c 而照着这个例子做 xff0c 你就能知道怎么使用 phaser了 需要说明的是
  • IDEA插件activiti工具actiBPM

    最新的IDEA中Marketplace搜索不到actiBPM xff08 2020 2 xff09 离线安装 下载https plugins jetbrains com 选择版本 导入jar 重启IDEA 验证 右键新建 表明添加成功 使用
  • 【内推找我】阿里社招面试16轮,终于拿到offer(2020年2月更新)

    内推私信我 xff0c 标题党了 xff0c 其实是这么回事 一 背景及原因 个人背景 xff1a 17年普本毕业Java开发 想换工作原因 xff1a 19年7月公司裁员了一波 xff0c 内部较动荡 xff0c 想看看外面机会 xff1
  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • 网络编程——Socket(套接字)

    网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯 网络编程中 有两个主要的问题 xff0c 一个是如何准确的定位网络上一台或多台主机 xff0c 另一个就是找到主机后 如何可靠高效的进行数据传输 在TCP IP协议
  • 【Linux 驱动】netfilter/iptables (三) 注册和注销Netfilter hook

    继前面介绍了 netfilter hook xff0c 这里我们开始进行简单的实例讲解 xff0c 主要是Netfilter hook的注册与注销 xff1a wqlkp c xff1a span class hljs preprocess
  • Uboot网络设备驱动(一)---两种连接架构

    本系列将针对NXP的s32v234芯片及s32v234evb开发板讲解Uboot中网络相关的设备驱动程序 本文前提是你有基本的计算机网络知识 xff08 TCP IP协议及OSI ISO七层网络协议 xff09 一般BSP工程师涉及的主要工
  • ESP8266物联网远距离控制实现

    ESP8266物联网远距离控制实现 转载请注明出处 xff01 重要的事情放在前面源码在GitHub上面欢迎issue xff0c 如果可以的话Star一下也是表示对作者的支持 有很多不足 xff0c 希望可以得到指教 https gith
  • JACK报错(Ensure Jack server is installed and started)&多用户编译

    目录 报错内容 报错原因 解决方法 备注 报错内容 20 4823 23656 Ensure Jack server is installed and started FAILED bin bash c 34 prebuilts sdk t
  • linux常用命令

    linux常用命令 pwd 查看当前工作目录的绝对路径 cat input txt 查看input txt文件的内容 cat v input txt 查看input txt文件的编码格式 sed
  • UML中类的关系:关联关系、聚合关系、依赖关系、泛化关系、实现关系

    一 关联关系 关联关系是一种结构化的关系 xff0c 指一种对象和另一种对象有联系 给定关联的两个类 xff0c 可以从其中的一个类的对象访问到另一个类的相关对象 在UML图中 xff0c 关联关系用一条实线表示 另外 xff0c 关联可以
  • 互补滤波

    互补滤波 加速度计对小车的加速度比较敏感 xff0c 取瞬时值计算倾角误差比较大 xff1b 而陀螺仪积分得到的角度不受小车加速度的影响 xff0c 但是随着时间的增加积分漂移和温度漂移带来的误差比较大 所以这两个传感器正好可以弥补相互的缺
  • Linux 网络通讯 : smbclient 命令详解

    smbclient命令属于samba套件 xff0c 它提供一种命令行使用交互式方式访问samba服务器的共享资源 语法 smbclient 选项 参数 选项 B lt ip地址 gt xff1a 传送广播数据包时所用的IP地址 xff1b
  • 云计算的三种部署模式:公有云、私有云、混合云

    随着云时代的到来 xff0c 慢慢的演化出了更有针对性的产品服务 xff0c 公有云 xff0c 私有云 xff0c 混合云 那么这三者之间有什么区别呢 xff1f 我们用打比方的方式来说明 例如我们来到一个城市需要睡觉 xff0c 就要去
  • 机器学习之随机森林(sklearn)

    文章目录 1 概述1 1 集成算法的概述1 2 sklearn中的集成算法 2 RandomForestClassfier2 1 重要参数2 1 1 控制基评估器的参数2 1 2 n estimators2 1 3 random state
  • AM5728 高性能计算(并行计算)OpenCL/OpenMP简介及测试

    一 OpenCL OpenMP简介 OpenCL Open Computing Language 是一个为异构平台编写程序的框架 xff0c 属于API xff0c 和OpenGL架构类似 xff0c 此异构平台可由CPU xff0c GP
  • Linux线程调度

    对于一个嵌入式多任务 多线程操作系统 xff0c 所启动的应用进程至少拥有一个线程或多个线程 xff0c 线程在进程中执行代码 一个进程能够 同时 运行多个线程 xff0c 同时 加上引号 xff0c 因为实际上 xff0c 在单处理CPU
  • /usr/bin/xauth: file /.../.Xauthority does not exist

    继我这篇博客解决了x11forwarding问题 xff0c 安装了xorg x11 xauth后 xff0c 又出现了新问题 xff0c Xauthority does not exist xff0c 真是够了 https blog cs
  • ORB-SLAM2在window下的配置 (4)

    配置DBoW2 接下来谈一谈DBoW2的配置 xff0c 难度稍微大一点点 xff0c 它存在于ORB SLAM2的源码中 xff0c 其作者也说了 xff0c 它跟g2o一样都被修改过了 xff0c 所以我们还是直接用ORB SLAM2自

随机推荐

  • ORB-SLAM2在window下的配置 (7)[END]

    部署ORB SLAM2 此系列博客终于接近尾声 xff0c 走过前方配置依赖库的漫漫长路 xff0c 我们终于要来部署ORB SLAM2了 xff01 ORB SLAM2源码下载 xff1a https github com raulmur
  • ubuntu18.04 apt源的添加、修改

    1 软件源 在Ubuntu下 安装软件常时 xff0c 常用apt命令如下 sudo apt get install name 如果源里面没有找到name xff0c 则无法安装该软件 2 源安装的原理 Ubuntu 自带了 apt的软件包
  • H3C链路聚合

    实验拓扑 图 1 1 注 xff1a 如无特别说明 xff0c 描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备 xff0c R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备 xff0c 以此类推 xff1b
  • MapReduce实现二次排序

    默认情况下 xff0c Map输出的结果会按照key进行排序 xff0c 但在实际的应用中 xff0c 有时间我们不仅要对key进行排序 xff0c 同时还要对value进行排序 xff0c 这时候就要用到mapreduce中的二次排序 一
  • rosbag 从旧topic,迁移到新topic

    rosbag 从旧topic xff0c 迁移到新topic source 目标devel setup bash文件生成rules bmr迁移规则 rosbag check in bag g rules bmr修改迁移规则文件rules b
  • 研究生阅读文献技巧

    研究生如何做文献阅读和阅读笔记 以后大部分内容综合自PPT 研究生如何做文献阅读和阅读笔记 和 How to Read Paper 若侵权删 首先是一位研究生老师的建议 xff1a 今后大家提交的论文阅读笔记和工作报告尽量用英文写 可以直接
  • asp.net中执行exe应用程序

    在asp net中执行应用程序有两种方法 xff1a 1 调用win32函数ShellExecute 2 用 NET Framework中的Process类 下面我分别用这两种方法执行Windows中的记事本程序notepad exe 新建
  • Win10 安装Tensorflow-GPU版教程(附CUDA安装 could not fine compatible graphic hardware问题解答)

    入了深度学习的坑 xff0c 需要搭建Tensorflow环境 xff0c 虽然渣渣显卡 xff0c 但是总比CPU来得快 xff0c 果断选择GPU版 在网上找了很多资料 xff0c 受益颇多 但是由于tensorflow最近更新了 xf
  • 带你了解无人机的大脑-飞控

    无人机大脑 xff1a 飞控 无人机之所以能够在空中自主飞行就是因为无人机也和人一样 xff0c 也拥有一个大脑 xff0c 究竟是什么样的一个大脑才能够控制一架飞机在空中自动驾驶呢 xff1f 一起来看看 通俗点说 xff0c 能够自主起
  • STM32F103串口(ISP)下载

    1 ISP简介 ISP Iin System Programming 在系统可编程 xff0c 指电路板上的空白器件可以编程写入最终用户代码 xff0c 而不需要从电路板上取下器件 xff0c 已经编程的器件也可以用SP方式擦除或再编程 I
  • 用Docker搭建更酷的本地开发环境

    以前要在本地跑一些有意思的工程和实验 xff0c 都需要通过在本地装上一大堆软件来实现 最近发现有一种更酷的方式 xff1a Docker 用Docker在本地搭建开发环境有一系列显而易见的优势 xff1a 不用依赖公司的资源 xff0c
  • 只需修改一个像素,让神经网络连猫都认不出 | 论文+代码

    夏乙 编译整理 量子位 出品 公众号 QbitAI 想骗过神经网络 xff0c 让它认错图像 xff0c 需要对图像做多少修改 xff1f 一个像素就够了 一项来自日本的研究表明 xff0c 改动图片上的一个像素 xff0c 就能让神经网络
  • 小米迎来NLP首席科学家王斌:中科院研究员,雷军崔宝秋亲学弟

    雷刚 发自 凹非寺 量子位 报道 公众号 QbitAI 曾经武大郎 xff0c 今日小米科学家 小米又有AI科学家加盟 xff0c 这次是中国科学院信息工程研究所研究员王斌 xff0c 他将出任小米AI实验室NLP首席科学家 xff0c 负
  • IGMPv1,v2,v3详解

    简介 IGMP IGMP Internet Group Management Protocol xff09 作为因特网组管理协议 xff0c 是TCP IP协议族中负责IP组播成员管理的协议 xff0c 它用来在IP主机和与其直接相邻的组播
  • 华为最强AI芯片麒麟980发布:全球首款7nm手机芯片,双核NPU,6项世界第一

    安妮 雷刚 发自 凹非寺 量子位 报道 公众号 QbitAI 遥遥领先 xff01 这是华为消费者业务CEO余承东放下的狠话 xff0c 他说自家即将推出的手机芯片麒麟980 xff0c 将在全球范围内遥遥领先 而且领先的不是别家 xff0
  • Haar小波提升算法

    传统的小波变换是在傅里叶变换的基础上演变而来 xff0c 计算过程中存在着大量的卷积运算或是乘累加的计算 xff0c 如若在硬件上实现 xff0c 势必会消耗大量的寄存器资源 xff0c 而且速度也上不去 提升小波又称为第二代小波 xff0
  • 【Docker学习】Docker Hub + GitHub实现镜像自动构建

    近期学习Docker的相关知识 xff0c 尝试了一下Docker Hub 43 GitHub自动构建镜像 xff0c 在此记录一下过程 将GitHub账号关联到Docker Hub账号 设置位置 下滑到Linked Accounts xf
  • spring整合mybatis报错Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容

    在spring的配置文件中配置mybatis时使用的是 xff1a span class hljs comment lt 控制和MyBatis整合 gt span span class hljs tag lt span class hljs
  • linux中UDP编程

    在前面的文件中 xff0c 我们介绍了linux网络编程中与IP相关的知识和常用的函数总结 xff0c 本文针对具体的UDP通信 xff0c 来详细的介绍UDP通信的使用 xff0c 包括UDP通信中的点对点通信 xff0c 多播 xff0
  • 语音增强--卡尔曼滤波介绍及MATLAB实现

    语音增强 卡尔曼滤波 状态方程 x k 43 1 61