目录
  1. 1. 谱减法
    1. 1.1. 噪声频谱
    2. 1.2. 原理
    3. 1.3. 具体流程
    4. 1.4. 音乐噪声和过减因子、谱下限的关系
    5. 1.5. 噪声估计流程
  2. 2. 改进频谱
    1. 2.1. 宋知用书本上介绍的方法
      1. 2.1.1. Boll改进
    2. 2.2. CSDN中查到的改进方法
      1. 2.2.1. 非线性谱减
      2. 2.2.2. 多带谱减法
      3. 2.2.3. MMSE谱减算法
      4. 2.2.4. 扩展谱减法(可以试着实践)
      5. 2.2.5. 自适应增益平均的谱减(看不懂)
      6. 2.2.6. 选择性谱减法(待细看)
      7. 2.2.7. 基于感知特性的谱减(这个可以有)
  3. 3. 参考资料
谱减法

谱减法

谱减算法为最早的语音降噪算法之一,基本原理:假设语音中的噪声只有加性噪声,只要将带噪语音谱减去噪声谱,就可以得到纯净语音幅度。这么做的前提是噪声信号是平稳的或者缓慢变化的

噪声频谱

不同的噪音类型,有不同的稳定区间,以下根据肉眼选择,其中white完全无规律,无论是频域还是时域都是覆盖整张图。说明:频域图中上面一张图是随机选择一帧的频域图,下面是整段语音的平均频域图。

type wlen time 时域图 频域图
car 200 12.5ms
white 400 25ms
cafe 1024 64ms

一般认为缓慢变化的含义是指包含1~3个周期波

例如当 Fs=8000 Hz,短时长=25ms,窗口长度可计算如下:
窗口长度 = 8000*0.025=200

原理

顾名思义,谱减法,就是用带噪信号的功率谱去噪声信号的功率谱。若时域信号相加,则频域谱也符合相加规律,那功率谱是否满足这种相加规律?

假设y(n)y(n)是纯净语音信号xnx_n和加性噪声dnd_n组成。其傅里叶后变换表示为:Y(ω)=X(ω)+D(ω)Y(\omega)=X(\omega)+D(\omega)

如果功率谱表示可以写为:

Y(ω)2=X(ω)2+D(ω)2+X(ω)D(ω)+X(ω)D(ω)=X(ω)2+D(ω)2+2Re{X(ω)D(ω)}\begin{aligned} |Y(\omega)|^2 = &|X(\omega)|^2+|D(\omega)|^2+X(\omega)\overline{D(\omega)}+\overline{X(\omega)}D(\omega) \\ = & |X(\omega)|^2+|D(\omega)|^2+2Re\{X(\omega)\overline{D(\omega)}\} \end{aligned}

若d(n)具有0均值,并且与x(n)不相关,则交叉项2Re{X(ω)D(ω)}2Re\{X(\omega)\overline{D(\omega)}\}为0,则公式则可简化为:

Y(ω)2=X(ω)2+D(ω)2|Y(\omega)|^2 =|X(\omega)|^2+|D(\omega)|^2

具体流程

  1. 分帧

  2. 对每一帧做一次DFT

  3. 保留每个分量的幅值和相角,幅值是Xi(k)|X_i(k)|,相角为是

    Xanglei(k)=arctan[lm(Xi(k))Re(Xi(k))]X_{\text {angle}}^{i}(k)=\arctan \left[\frac{\operatorname{lm}\left(X_{i}(k)\right)}{\operatorname{Re}\left(X_{i}(k)\right)}\right]

  4. 计算噪声段的平均能量值

    D(k)=1Ni=1NXi(k)2D(k) = \frac{1}{N}\sum_{i=1}^N|X_i(k)|^2

  5. 谱减

    X^i(k)2={Xi(k)2a×D(k)Xi(k)2a×D(k)b×D(k)Xi(k)2<a×D(k)\left|\hat{X}_{i}(k)\right|^{2}=\left\{\begin{array}{ll} \left|X_{i}(k)\right|^{2}-a \times D(k) & \left|X_{i}(k)\right|^{2} \geqslant a \times D(k) \\ b \times D(k) & \left|X_{i}(k)\right|^{2}<a \times D(k) \end{array}\right.

    其中aa过减因子bb称为增益补偿因子

    过减因子a:**范围大于等于1,主要影响语音谱的失真程度。在高信噪比中,a应取小值;对低信噪比中,a建议取大值。

    **增益补偿因子b:**范围在0至1之间。可以控制残留噪声的多少以及音乐噪声的大小。

    Berouti等人做了大量实验来确定alpha与beta的最优值,在这里我们直接使用就可以了。具体请参考论文:《Enhancement of speech corrupted by a acoustic noise》。

  6. 还原回时域,加上之存储的相角信息

音乐噪声和过减因子、谱下限的关系

若直接将带噪语音的幅度谱(或功率谱)直接与估计出来的噪声谱相减,有可能出现负值,早期的话直接设置下限为0,会导致信号频域谱的随机位置上出现小的,独立的峰值。

转换到时域后,会听到帧与帧之间的随机频率的多频音。(可能上一帧高频,下一帧低频)尤其在清音段尤其明显,这种由于半波整流?引起的“噪声”被称为**“音乐噪声”,可能导致音乐噪声**的原因为:

  1. 对谱减算法的负数部分进行了非线性处理(如:直接置零)
  2. 对噪声谱的估计不准
  3. 抑制函数具有较大的可变性

噪声估计流程

  1. 计算前导无语段语音NIS

  2. 根据NIS,利用对数谱距离的端点检测方法,调用VAD

  3. 根据每一帧的SIGNALFLAG,对噪声进行平滑处理

    Noise_new=(Noise_old×L+Noise)/(L+1)Noise\_new = (Noise\_old\times L + Noise)/(L+1)

    其中,Noise_old 是本帧以前的噪声平均幅值;Noise是本帧的复制普;L取9;Noise_new是通过带噪语音的噪声段计算出新的噪声平均幅值。

改进频谱

宋知用书本上介绍的方法

Boll改进

S.F.Boll 在1979年给出了一种改进的谱减法。由E.Zavarehel编写Matlab。

  • Gamma 参数:

X^i(k)γ={Xi(k)γα×D(k)Xi(k)γα×D(k)β×D(k)Xi(k)γ<α×D(k)\left|\hat{X}_{i}(k)\right|^{\gamma}=\left\{\begin{array}{ll} \left|X_{i}(k)\right|^{\gamma}-\alpha \times D(k) & \left|X_{i}(k)\right|^{\gamma} \geqslant \alpha \times D(k) \\ \beta \times D(k) & \left|X_{i}(k)\right|^{\gamma}<\alpha \times D(k) \end{array}\right.

  • 相邻帧的平滑处理

    Yi(k)=12M+1j=MMXi+j(k)Y_{i}(k)=\frac{1}{2 M+1} \sum_{j=-M}^{M} X_{i+j}(k)

    目的是为了得到较小的谱估计方差,下面的程序中,M=1

  • 保留噪声的最大值NRM

    NRM = max(NRM,YS(:,i)-N) % 把每帧的最大残差谱线保留到NRM中

    比较每一条谱线残差判断是否小于NRM,若小于,对第i帧第j条谱线将在D(j),YS(j,i1)N(j),YS(j,i+1)N(j)D(j),YS(j,i-1)-N(j),YS(j,i+1)-N(j)相邻3帧之间找最小值的一条谱线。

SSBoll79.m

function output=SSBoll79(signal,fs,IS)
if (nargin<3 | isstruct(IS))
IS=.25; %seconds
end
W=fix(.025*fs); %Window length is 25 ms
nfft=W;
SP=.4; %这部分就是帧移
wnd=hamming(W);

NIS=fix((IS*fs-W)/(SP*W) +1);%number of initial silence segments
Gamma=1;% 1代表是幅度谱,2代表功率谱
y=segment(signal,W,SP,wnd);
Y=fft(y,nfft);
YPhase=angle(Y(1:fix(end/2)+1,:)); % 噪声的相位
Y=abs(Y(1:fix(end/2)+1,:)).^Gamma; % 噪声的幅度
numberOfFrames=size(Y,2); % 帧数
FreqResol=size(Y,1); % 帧长

N=mean(Y(:,1:NIS)')'; % 噪声谱的平均幅值(或功率)
NRM=zeros(size(N)); % 噪声残差最大值(初始化)
NoiseCounter=0;
NoiseLength=9; %平滑因子

Beta=.03;

for i=2:(numberOfFrames-1)
YS(:,i)=(Y(:,i-1)+Y(:,i)+Y(:,i+1))/3;
end

for i=1:numberOfFrames
[NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(Y(:,i).^(1/Gamma),...
N.^(1/Gamma),...
NoiseCounter); %VAD算法(有问题)
if SpeechFlag==0
N = (NoiseLength*N+Y(:,i))/(NoiseLength+1); % 根据噪声段:更新和平滑噪声
NRM = max(NRM,YS(:,i)-N); % 更新最大噪声残差
X(:,i)=Beta*Y(:,i);
else
D=YS(:,i)-N; % 噪声段: 谱减
if i>1 && i<numberOfFrames % i在2到end-1的区间
for j=1:length(D) % D是当前帧下的频率谱
if D(j)<NRM(j) % 假如D小于最大的残差量
D(j)=min([D(j) YS(j,i-1)-N(j) YS(j,i+1)-N(j)]); % 选择前后3帧的最小值,减少噪声的干扰
end
end
end
X(:,i)=max(D,0);
end
end
output=OverlapAdd2(X.^(1/Gamma),YPhase,W,SP*W);
end

CSDN中查到的改进方法

非线性谱减

原始的谱减法,只用了一个常数(过减因子)来减去对噪声的过估计。现实世界中的噪声多种多样,可以设置一个频率相关的过减因子来处理不同类型的噪声。

多带谱减法

多带算法,即将语音频域划分N个互不重叠的子带,将谱减法在每个子带独立运行。这个过程有两种方法实践:

  1. 在时域使用带通滤波器
  2. 在频域使用适当的窗(推荐:因为实现起来有更小的运算量)

多带谱减与非线性谱减的主要区别在于对过减因子a的估计。非线性谱减算法针对每一个频点,导致频点上的信噪比可能有很大变化,剧烈变化是导致音乐噪声的重要原因。而多带算法针对频带估计减法因子,故子带信噪比变化不会特别剧烈。

MMSE谱减算法

上面的方法中,谱减参数a和b通过实验确定,无论如何都不会是最优的选择。

MMSE谱减法能够在均方意义下最优地选择谱减参数。具体请参考论文:《A parametic formulation of the generalized spectral subtractor method》

扩展谱减法(可以试着实践)

基于自适应维纳滤波与谱减原理的结合。维纳滤波用于估计噪声谱,然后从带噪语音信号中减去该噪声谱。具体请参考以下两篇论文:
《Extended Spectral Substraction:Description and Preliminary Results. 》
《Extended Spectral Substraction》

自适应增益平均的谱减(看不懂)

谱减法中导致音乐噪声的两个因素在于谱估计的大范围变化以及增益函数的不同。对于第一个问题,Gustafsson等人建议将分析帧划分为更换小的子帧以得到更低分辨率的频谱。子帧频谱通过连续平均以减小频谱的波动。对于第二个问题Gustafsson等人提出使用自适应指数平均,在时间上对增益函数做平滑。此外,为了避免因使用零相位增益函数导致的非因果滤波问题,Gustafsson等人建议在增益函数中引入线性相位。具体请参考论文:Spectral subtraction using reduced delay convolution and adaptive averaging

选择性谱减法(待细看)

前面提到的方法对所有语音都做同样处理。并不区分是浊音段还是清音段。区分浊音与清音的谱减法有

  1. 双频带谱减法。通过将带噪语音能量与某一阈值进行比较,把语音帧分为浊音和清音。对于浊音帧,用算法确定一个截止频率,在该截止频率之上,语音被认为是随机信号。浊音段则通过滤波分为两个频带,一个频带位于截止频率之下(低通滤波后的语音),另外一个频带高于截止频率(高通滤波后的语音)。然后对低通和高通后的语音信号使用不同的算法进行处理。对低通语音部分在短时傅立叶变换的基础上使用过减算法,对于高通部分以及清音段,使用Thomson的多窗谱估计器取代FFT估计器。主要目的在于减小高频部分的频谱值的波动。具体请参考论文:Adaptive two-band spectral subtraction with multi-window spectral estimation
  2. 双激励语音模型法,该算法把语音分为两个独立的组成部分–浊音分量和清音分量。也就是说,语音由这两个分量的和来表示(注意不同于将语音分为浊音段和清音段)。浊音分量的分析是基于对基音频率和谐波幅度的提取。然后从带噪语音谱中减去浊音谱就得到了清音谱。然后使用一个双通道系统,基中一个包括改进的维纳滤波器,被用于增强清音谱。最终增强的语音由增强后的浊音分量和清音分量求和得到。具体请参考论文:Speech enhancement using the dual excitation speech model
  3. 还有一种基于浊音、清音的谱减算法,在该算法中语音帧首先根据能量和过零率被划分为浊音和清音。然后将带噪语音谱与锐化函数进行卷积,清音的频谱就会被锐化(用锐化函数进行镨锐化的目的在于增加谱对比度,即在抑制谱谷的同时使谱峰更加突出)。具体请参考论文:Spectral subtraction based on phonetic dependency and masking effects

基于感知特性的谱减(这个可以有)

前面提到的方法,谱减参数要么是通过实验计算短时信噪比得到,要么是通过最优均方误差得到,均没有考虑听觉系统的特性,该算法的主要目的是使残余噪声在听觉上难以被察觉。利用了人类听觉系统改进系统的可懂度(即人耳的掩蔽效应)

参考资料

  1. https://www.cnblogs.com/riddick/p/6848673.html?utm_source=itdadao&utm_medium=referral
  2. 详细地介绍了改进的谱减法