首页 > 编程语言 >基于PSD-ML算法的语音增强算法matlab仿真

基于PSD-ML算法的语音增强算法matlab仿真

时间:2023-12-09 21:46:16浏览次数:47  
标签:ifft 信号 ML wiener PSD 算法 Len 语音

1.算法运行效果图预览

 

 

 

2.算法运行软件版本

matlab2022A

 

3.算法理论概述

       PSD-ML(Power Spectral Density Maximum Likelihood)算法是一种基于最大似然估计的语音增强算法,通过对语音信号的功率谱密度进行估计,并利用估计结果对原始语音信号进行滤波处理,以达到增强语音信号的目的。下面将详细介绍PSD-ML算法的原理和数学公式。

 

        PSD-ML算法的基本思想是利用最大似然估计对语音信号的功率谱密度进行估计,并根据估计结果对原始语音信号进行滤波处理。具体实现过程中,首先需要将语音信号分成多个重叠的帧,并对每帧信号进行加窗处理以减少频谱泄漏。然后,利用快速傅里叶变换(FFT)将每帧信号转换为频域表示,并根据功率谱密度的估计结果对频域信号进行滤波处理。最后,将滤波后的频域信号通过逆快速傅里叶变换(IFFT)转换回时域表示,并将重叠的帧进行合并以得到增强后的语音信号。

 

      假设原始语音信号为x(n),加窗后的信号为x_w(n),分帧后的第i帧信号为x_i(n),其对应的功率谱密度为P_i(k),其中k表示频率索引。则PSD-ML算法的数学公式可以表示为:

 

1.加窗处理:

x_w(n) = w(n) * x(n)

 

其中,w(n)为窗函数,如汉明窗或汉宁窗等。

 

2.分帧处理:

x_i(n) = x_w(n+iL)

 

其中,L为帧长,i为帧索引。

 

3.功率谱密度估计:

P_i(k) = |X_i(k)|^2 / N

 

其中,X_i(k)为第i帧信号的FFT变换结果,N为帧长。

 

4.滤波处理:

Y_i(k) = G_i(k) * X_i(k)

 

其中,G_i(k)为滤波器的增益函数,可以根据功率谱密度的估计结果计算得到。

 

5.逆变换处理:

y_i(n) = IFFT{Y_i(k)}

 

其中,IFFT表示逆快速傅里叶变换。

 

6.合并处理:

y(n) = ∑ y_i(n-iL)

 

其中,∑表示对所有重叠的帧进行合并。

 

       需要注意的是,在实际应用中,为了进一步提高语音增强的效果,可以采用一些优化策略,如自适应滤波器、多通道滤波器等。同时,也需要根据实际应用场景和需求来选择合适的窗函数、帧长、滤波器类型等参数。

 

 

 

 

4.部分核心程序

% 处理最后一帧,如果最后一帧的长度小于帧长,用零填充至帧长  
y_seg = y(1+(Nframe-1)*(Len_frame-Len_loop):end); 
y_seg = [y_seg; zeros(Len_frame-length(y_seg), 1)];
y_t   = [y_t y_seg];
%应用汉宁窗函数  
window= hann(Len_frame);%apply hanning window
y_fft   = zeros(size(y_t));
for idx = 1 : Nframe
    y_fft(:, idx) = fft(window .* y_t(:, idx)); 
end
 
 
%计算带噪语音的功率谱密度(PSD)估计值,采用Barlett方法,L为周期图的段数  
L    = 12;  
Pyy  = func_Bartlett(y_fft,L); 
 
% 噪声功率谱密度(PSD)估计,选择MS或MMSE方法,这里采用MS方法,M为段数,B为偏差补偿系数 
M     = 12;  
B     = 1;  
Pnn   = func_nPSD(Pyy,M,B);
 
% 目标语音功率谱密度(PSD)估计,选择ML或DD方法,这里采用ML方法,得到SNR的ML估计值SNR_ml  
SNR_ml       = func_PSDML(Pyy,Pnn);%DD方法的代码被注释掉了,alpha为平滑系数,取值一般在0.96-0.99之间 
% 使用wiener函数计算Wiener增益,得到降噪后的频域信号s_hat_k 
y_wiener_fft = func_wiener(y_fft,SNR_ml);
 
% 进行逆变换和重叠相加操作,得到降噪后的时域信号s_t 
y_wiener_ifft= ifft(y_wiener_fft);% Inverse FFT transform
% 取s_t的前半部分作为s_t_est1  
y_wiener2    = y_wiener_ifft(1:Len_frame-Len_loop/2, 1);
% 取s_t的后半部分作为s_t_est2  
y_wiener3    = y_wiener_ifft(1+Len_loop/2:end,end);
% 去掉s_t的第一列和最后一列 
y_wiener_ifft(:, 1)   = [];
y_wiener_ifft(:, end) = [];
% 去掉s_t的前hop_length/2行和后hop_length/2行
y_wiener_ifft(1:Len_loop/2, :)            = [];
y_wiener_ifft(end-(Len_loop/2-1): end, :) = [];
% 将s_t重塑为一列向量  
y_wiener_ifft         = reshape(y_wiener_ifft, [], 1);
% 取s_t的实部作为最终的降噪后的时域信号s_t  
y_wiener_ifft         = real(y_wiener_ifft);

  

标签:ifft,信号,ML,wiener,PSD,算法,Len,语音
From: https://www.cnblogs.com/matlabworld/p/17891533.html

相关文章

  • 【教3妹学编程-算法题】需要添加的硬币的最小数量
    3妹:2哥2哥,你有没有看到新闻,有人中了2.2亿彩票大奖!2哥 :看到了,2.2亿啊,一生一世也花不完。3妹:为啥我就中不了呢,不开心呀不开心。2哥 :得了吧,你又不买彩票,还是脚踏实地的好~3妹:小富靠勤,中富靠德,大富靠命,可能是我命不好。2哥 :哎,想我口袋只有几个硬币,叮咚作响。3妹:说到硬币,我......
  • 【Cpp 基础】泛型算法 stable_sort() 的应用
    最近在刷牛客的题。经常遇到排序问题,经常有一个附加的规则:相同的数值的,按照录入的顺序排序。可是C++的sort()的底层是快速排序,并不能保证相同数值的顺序不改变。所以最后我不得不自己写冒泡排序。(冒泡排序不改变相同数值的录入顺序)写了那么多的排序,但是其实C++里封装有排序函数......
  • Mybatis使用generator逆向工程生成器生成entity、mapper、.xml模版类
    前言今天将表建好了,但是一个一个的建实体类、Mapper接口、Mapper.xml文件就十分的麻烦,所以我就想到了MyBatis逆向,今天就操作一把!这里我们采用maven来进行操作。一、新建generatorConfig.xml文件首先建好表,在你的项目的resource文件中新建generatorConfig.xml文件。代码如下:<?xmlv......
  • 常见算法的复杂度
    算法 平均时间复杂度 最差空间复杂度快速排序nlognlogn归并排序nlognntimsort  nlogn  n堆排序nlogn  1冒......
  • 机器学习的算法——线性回归
    1.回归问题的定位我们知道机器学习分为有监督学习和无监督学习,无监督学习主要是聚类方面的算法,而有监督问题主要分为回归和分类两类而这线性回归就属于有监督学习,且属于其中的回归类问题,另外有一种逻辑回归,他却是属于分类问题的一部分。2.线性回归(1)大体思路首先它是利用......
  • 【算法】【线性表】搜索旋转排序数组(有重复数据)
    1 题目跟进“搜索旋转排序数组”,假如有重复元素又将如何?是否会影响运行时间复杂度?如何影响?为何会影响?写出一个函数判断给定的目标值是否出现在数组中。样例1:输入:A=[]target=1输出:false 解释:数组为空,1不在数组中。样例2:输入:A=[3,4,4,5,7,0,1,2]t......
  • vue3 vite.config.ts 如何增加构建时间,并展示在index.html里面
    首先需要安装vite-plugin-html插件在vite.config.ts文件中增加如下代码:plugins:[createHtmlPlugin({minify:true,pages:[{template:'index.html',filename:'index.html',injectOptions:{data:......
  • 直播系统源码,常见的混音算法有哪些?
    声音是由于物体的振动对周围的空气产生压力而传播的一种压力波,转成电信号后经过抽样,量化,仍然是连续平滑的波形信号,量化后的波形信号的频率与声音的频率对应,振幅与声音的音量对应,在直播系统源码中,量化的语音信号的叠加等价于空气中声波的叠加,所以当采样率一致时,混音可以实现为将各......
  • 1.理论、算法、协议
    1.CAP理论CAP也就是Consistency(一致性)、Availability(可用性)、PartitionTolerance(分区容错性)这三个单词首字母组合。在理论计算机科学中,CAP定理(CAPtheorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:一致性(Consistency):所有节点访问......
  • 电台覆盖区域的贪心算法
    1.贪心算法电台覆盖区域求最优解问题题目:假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号广播台覆盖地区K1“北京”,“上海”,“天津”K2“广州”,“北京”,“深圳”K3“成都”,“......