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

状态方程

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​=Φk​xk​+Γ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+1​xk+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−​=xk​−x^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{ek−​ek−​T}=E{(xk​−x^k−​)(xk​−x^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​(yk​−Hk​x^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​=xk​−x^k​=xk​−[x^k−​+Kk​(yk​−Hk​x^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​=Φk​xk​+Γuk​yk+1​=Hk+1​xk+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−​=Φk​x^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−​=Φk​Ck​Φ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+1−​Hk+1T​(Hk+1​Ck+1−​Hk+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+1​−Hk+1​x^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​=(I−Kk+1​Hk+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{nk​niT​}={​Rk​i=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{uk​uiT​}={​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;endi = 1;if l < iterj = 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.

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

  1. 语音增强--维纳滤波介绍及MATLAB实现

    语音增强-------------维纳滤波 原理介绍 时域维纳滤波 若输入信号y(n)y\left( n \right)y(n)和期望信号d(n)d\left( n \right)d(n)是联合广义平 ...

  2. 语音增强--子空间算法及MATLAB实现

    语音增强--------------子空间算法 原理介绍 子空间方法的原理是将观测信号的向量空间分解为信号子空间和噪声子空间,通过消除噪声子空间并保留信号子空间从而估计出干净语音,子空间分解的过程是对 ...

  3. 基于matlab语音增强,基于MATLAB的语音增强系统的设计

    187 2010 年第 05 期,第 43 卷 通 信 技 术 Vol.43,No.05,2010 总第 221 期 Communications Technology No.221,Totally ...

  4. 【信号处理】基于小波变换的语音增强matlab源码

    一.简介 语音通信是人类传播信息,进行交流时使用最多.最自然.最基本的一种手段.而这种通信中的信息载体-语音信号却是一种时变的.非平稳的信号,只有在很短的一段时间内(通常为10~30ms)才被认为是平 ...

  5. 语音信号处理 | 基于卡尔曼滤波的语音增强算法

    文章目录 1.概述 2.卡尔曼滤波原理 被估计的信号 离散卡尔曼滤波算法 参数选择 3.基于卡尔曼滤波的语音增强算法 语音模型分析 参数确定 4.程序实现 语音数据的导入.加噪与分帧 卡尔曼滤波器参数 ...

  6. 基于维纳滤波的语音增强算法 matlab,基于维纳滤波语音增强算法的改进实现

    通过对维纳滤波的介绍,实现了基本维纳滤波效果;利用两级维纳滤波和两级滤波器组滤波方法实现了语音增强,达到了良好的效果. 维普资讯 http://doc.docsou.com 文章编号:0 2 8 8 ...

  7. matlab 的谱相减语音增强算法的研究,基于MATLAB的谱相减语音增强算法的研究

    语音处理 谱减法 语音增加 去噪 维普资讯 http://www.wendangwang.com 第2卷第3 3期 文章编号:06- 3 8 2 0 ) 3-07 0 10 9 4 (0 6 0 2 ...

  8. Matlab神经网络语音增强,基于BP神经网络的语音增强研究

    曰髯? 分类号: 论文编号:2丛坦丝旦生丛 密级:公开 贵州大学 2009届硕士研究生学位论文 基于即神经网络的语音增强研究 学科专业:电路与系统 研究方向:模式识别 导师:刘宇红教授 研究生:周元芬 ...

  9. 【语音增强】基于matlab人耳掩蔽效应语音增强【含Matlab源码 428期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[语音增强]基于matlab人耳掩蔽效应语音增强[含Matlab源码 428期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

最新文章

  1. PHP数据结构之——链表
  2. 服务器端执行javascript脚本
  3. 网工协议基础(4)TCP/UDP协议
  4. java method_JAVA Method的解析
  5. queue java 用法_Java队列(Queue)用法
  6. 从物联网发展历程看区块链挑战
  7. 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常(转)...
  8. 园龄一年了,可还未动笔.
  9. python基础—正则表达式即re模块
  10. Android 查看內存使用
  11. hashcode的作用_【09期】说说hashCode() 和 equals() 之间的关系?
  12. java 事件分发机制_读Android源码之事件分发机制最全总结
  13. 人像处理:不要用减淡工具了!用柔光叠加去擦!加深也不如正片叠底
  14. 掌握这些的Linux命令,你基本稳了
  15. 用逻辑门设计一个CPU
  16. 海思Hi3516--移动侦测原理与理解
  17. android 9.0系统下载地址,安卓9.0正式版下载地址
  18. Java 100以内的质数
  19. 网站如何知道浏览器的用户在使用什么语言?
  20. 关于python语言和人工智能以下哪个说法不正确_民用建筑包括()和()。

热门文章

  1. 齿轮箱诊断,基于小波特征和BP神经网络分析
  2. mysql decimal类型排序
  3. 爬虫php1论坛,网络爬虫技术是什么意思?
  4. 我们来看看CAN转以太网的典型应用
  5. 公共关系与人际交往能力答案
  6. C语言循环语句基础入门教学(一)
  7. 【模拟试题】德雷克的追捕
  8. 线上开盘,地产开发商的新战场
  9. 13、域渗透提权分析工具 BloodHound 1.3 中的ACL攻击路径介绍
  10. Obadiah Stane