打印
[疑难问答]

7种可选噪声估计算法的语音滤波

[复制链接]
2046|49
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dspmana|  楼主 | 2023-11-25 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
噪声估计对语音滤波/语音增强效果好坏很重要。若噪声估计过小,滤波后有烦人的残留噪声;若噪声估计过高,滤波结果会导致语音失真。我这实验,根据不同噪声环境的说话场合,采用可选的其中一种噪声估计算法配合谱减滤波,滤波后语音清晰度较好。 7种可选噪声估计算法是:
1.martin       最小跟踪算法
2.mcra         最小控制递归平均算法
3.mcra2       最小控制递归平均变体算法
4.imcra        改进的最小控制递归平均算法
5.doblinger   连续谱最小跟踪算法
6.hirsch        加权频谱平均值算法
7.conn_freq  连接时间_频率区域算法
参考书:《语音增强--理论与实践》 作者:罗艾洲

% -----------------------------------------------
% 我编辑的主程序: ns_specsubs.m
close; clear ; clc;
nbits =16;
alpha=0.9; %(幂指数)过减因子,值小则去噪效果增强但失真度增大
FLOOR=0.002;
load methods.mat;
disp('以下是7种噪声估计算法:');   
disp('1:martin, 2:mcra, 3:mcra2, 4:imcra,');   
disp('5:doblinger, 6:hirsch, 7:conn_freq');   
while  1
i = input('请选择噪声估计算法的编号 1~7: (输入0 则退出) ') ;
if i == 0
  return;
end   
while (i<0 | i>7 )
  i = input('请选择噪声估计算法的编号 1~7: (输入0 则退出) ') ;
end
method =char(meth(i));

[x0,fs] =audioread('signal.mp3'); % 读入带人群噪声的语音文件
x0 = x0(:,1);            % 取1声道
x0 = x0-mean(x0);        % 消除直流分量
x0 = x0/max(abs(x0));    % 幅值归一化
x  = x0 ;

head_time =0.9;     % 裁掉起始段无语音的秒数,依具体情况调整
head = fs*head_time;
x =x(head+1: length(x));

%  初始化变量 ===============
len=floor(40*fs/1000); % 样本的大小
if rem(len,2)==1
   len=len+1;
end
PERC=50; % 窗口重叠以帧大小的百分比表示
len1=floor(len*PERC/100);
len2=len-len1;
win=hamming(len); % 汉明窗
k=1;
nFFT=2*len;
img=sqrt(-1);
x_old=zeros(len1,1);
Nframes=floor(length(x)/len2)-1;
xfinal=zeros(Nframes*len2,1);

for n=1:Nframes %从第1帧至最末帧,逐幅处理
   insign=win.*x(k:k+len-1);  % Windowing 加窗  
   spec=fft(insign,nFFT);     % 计算一帧的傅立叶变换
   sig=abs(spec);            
   ns_ps=sig.^2;
   %  估计/更新噪声的psd --------
   if n == 1
         parameters = initialise_parameters(ns_ps,fs,method);   
    else
        parameters = noise_estimation(ns_ps,method,parameters);
   end
   noise_ps = parameters.noise_ps;
   noise_mu=sqrt(noise_ps);  % 噪声幅值谱
   theta=angle(spec);  %保存每帧的相位信息

   % 计算信噪比:
   SNRseg=10*log10(norm(sig,2)^2/norm(noise_mu,2)^2);

   % 依据过减因子alpha及信噪比选择下限系数beta:
   if alpha==1.0
      beta=berouti1(SNRseg);
      %beta = 4 ;
   else
     beta=berouti2(SNRseg);
   end

   % 功率谱减去噪:
   sub_speech=sig.^alpha - beta*noise_mu.^alpha;
   diffw = sub_speech-FLOOR*noise_mu.^alpha;

   % 将值朝负无穷方向舍入到最邻近的整数组件:
   z=find(diffw <0);  
   if~isempty(z)
      sub_speech(z)=FLOOR*noise_mu(z).^alpha;
   end

   % 复数的实部重构确保共轭对称              
   sub_speech(nFFT/2+2:nFFT)=flipud(sub_speech(2:nFFT/2));  

   % 将全帧fft与相位信息相乘:
   x_phase=(sub_speech.^(1/alpha)).*(cos(theta)+img*(sin(theta)));

   xi=real(ifft(x_phase));  % 逆傅立叶变换     

  % 重叠相加:
  xfinal(k:k+len2-1)=x_old+xi(1:len1);
  x_old=xi(1+len1:len);
  k=k+len2;
end   % EOF for n=1:Nframes

out = xfinal;
N =length(x);       %含噪信号长度
Nout=length(out);   %滤波后信号长度      
if Nout>N
    out=out(1:N);
elseif Nout<N
    %尾部补零,使输出信号与与原带噪信号等长
    out=[out; zeros(N-Nout,1)];
end
out=out/max(abs(out));  %输出信号幅值归一化
B = 30;                 % debug的输入参数,B值依具体情况调整
out2 = debug(out,B);    %清除残留噪声

% 绘处理前后对比波形图:
figure('position',[50,50,600,700] );
subplot(4,1,1);
plot(x0(1:length(x0)));
title('原带噪语音波形');
axis([0 N, -1 1]); grid on;
subplot(4,1,2);
plot(x(1:length(x)));
axis([0 N, -1 1]); grid on;
subplot(4,1,3);
plot(out(1:length(out)));
title([ num2str(method) '估计噪声算法>谱减降噪后的波形' ]);
axis([0 N, -1 1]); grid on;
subplot(4,1,4);
plot(out2(1:length(out2)));
title('清除残留噪声后的波形' );
axis([0 N, -1 1]); grid on;
% sound(x0,fs)     ;%播放原带噪语音
% sound(out,fs)    ;%播放去噪后的语音
sound(out2,fs)     ;%播放清除残留噪声后的语音
end   % EOF while 1
% ----------------------------------------
处理前后的语音波形对比图:

使用特权

评论回复
沙发
belindagraham| | 2023-12-7 21:58 | 只看该作者
噪声估计是语音滤波的关键步骤,其准确性直接影响到滤波的效果。

使用特权

评论回复
板凳
zerorobert| | 2023-12-8 08:31 | 只看该作者
语音滤波器需要具有一定的适应性,能够根据噪声的变化自动调整滤波参数

使用特权

评论回复
地板
yeates333| | 2023-12-8 09:19 | 只看该作者
不同的噪声估计算法需要调整相应的参数,以获得最佳滤波效果。

使用特权

评论回复
5
wangdezhi| | 2023-12-8 16:19 | 只看该作者
滤波器的设计还需要考虑到实时性的要求,以确保在有限的时间内完成滤波操作。

使用特权

评论回复
6
deliahouse887| | 2023-12-8 17:03 | 只看该作者
在设计滤波器时,需要选择合适的参数和结构,以提高滤波效果和降低计算复杂度。

使用特权

评论回复
7
chenjun89| | 2023-12-8 19:48 | 只看该作者
在MCU里面用这类算法效果咋样?

使用特权

评论回复
8
albertaabbot| | 2023-12-9 15:45 | 只看该作者
前有多种噪声估计算法可供选择,如最小均方误差(MMSE)、最大后验概率(MAP)等。

使用特权

评论回复
9
xiaoyaodz| | 2023-12-9 16:11 | 只看该作者
在实时语音处理场景中,需要 算法的运算速度足够快

使用特权

评论回复
10
deliahouse887| | 2023-12-9 21:51 | 只看该作者
滤波器的设计需要考虑到频率响应、相位响应等因素,以确保在去除噪声的同时,不会对语音信号造成过大的损失。

使用特权

评论回复
11
pl202| | 2023-12-9 22:23 | 只看该作者
尽量选择计算复杂度较低的滤波算法

使用特权

评论回复
12
claretttt| | 2023-12-9 22:37 | 只看该作者
常需要通过在线噪声估计和自适应滤波算法来实现。

使用特权

评论回复
13
yeates333| | 2023-12-10 16:15 | 只看该作者
在实际应用中,噪声环境可能发生变化, 需要考虑噪声估计算法的鲁棒性

使用特权

评论回复
14
jkl21| | 2023-12-10 16:41 | 只看该作者
噪声估计算法主要根据语音的特性进行估计。

使用特权

评论回复
15
sheflynn| | 2023-12-10 17:24 | 只看该作者
噪声估计在语音降噪中起着关键的作用,其准确性直接决定了降噪效果的好坏

使用特权

评论回复
16
phoenixwhite| | 2023-12-10 17:31 | 只看该作者
评估指标可以包括信噪比、语音识别率等指标。

使用特权

评论回复
17
10299823| | 2023-12-10 18:02 | 只看该作者
在噪声稳定的环境下,可以选择基于最小方差无失真响应波束成形方法或基于超高斯联合的增益函数等方法;而在噪声变化较大的环境下,可以选择基于多窗谱估计或改进的维纳滤波方法等。

使用特权

评论回复
18
febgxu| | 2023-12-12 10:09 | 只看该作者
在实施语音滤波时,选择合适的滤波器也同样重要。

使用特权

评论回复
19
adolphcocker| | 2023-12-12 10:19 | 只看该作者
在去除噪声的同时,需要尽量保持语音的质量,避免产生失真

使用特权

评论回复
20
everyrobin| | 2023-12-12 12:20 | 只看该作者
在应用可选噪声估计算法进行语音滤波时,需要准备好相应的语音数据集,并对数据进行预处理

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

2553

帖子

2

粉丝