谱减法模型
实际听觉环境中,肯定是含有噪声的,那掺杂有噪声的声音信号中原声音信号和噪声信号是怎样体现的呢?一种普遍被使用的方法是:採集到的声音信号永远都是原信号与噪声信号的叠加,即
模型是信号的直接叠加,这就要满足:原信号与噪声信号不相关。事实上有些情况下这个条件是不满足的,所以依旧有非常多其它的模型,如有人觉得原信号和噪声信号是卷积的关系。当然。这些都是模型,还没有明白的理论证明那种是对的,反正哪种好用我们就捡谁。谱减法就是基于噪声的加法模型。
语音信号本身是非平稳过程,但假如取非常短的一段(10~30ms),则具有短时平稳特性。
因此,使用窗函数取含噪语音信号的一帧(N点)进行处理。
信号叠加模型两边同一时候进行傅里叶变换,并取模,
则对原信号幅值的预计就可通过|S(k)|=|Y(k)|-|N(k)|求得,但仅这样存在2个问题:
- |S(k)|可能为负值。语音信号的FFT谱幅值怎么可能为负值呢
- |S(k)|中不包括相位信息。必需在取模时同一时候保留相位信息
因此,谱减法考虑到这两点,其流程例如以下:
在语音增强的应用中,因为人耳对相位信息的感知不敏感,信号恢复时仍使用的相位信息为带噪信号的相位。相位信息保存在哪里呢?我们知道FFT的结果是复数。
ϕ(w) 就是相位。详细一些。复数在直角坐标系上表示。
在上面的谱减法流程中。考虑噪声的高斯分布特性。用噪声的均值E[N(k)]替换N(k),考虑减完后可能为负值的情况,将值小于0的部分所有截断为0,这样处理尽管带来一定的方便性,但同一时候引入了新的噪声,习惯上称之为“音乐噪声”。通过FFT谱进行谱减法并非最普遍的方法,很多其它情况下是用功率谱取代FFT谱。
Matlab的谱减法实例
clcclear all;% 选择.wav音频文件[fname,pname]=uigetfile(... { '*.wav';'*.*'},... 'Input wav File');[x,fs] = audioread(fullfile(pname,fname));x = x(1:8912,1); % 假设是双声道。取单通道N = length(x); % 帧长max_x = max(x);noise_add = random('norm', 0, 0.1*max_x, [N,1]);% 加入高斯噪声y = x + noise_add;noise_estimated = random('norm', 0, 0.1*max_x, [N,1]);fft_y = fft(y);fft_n = fft(noise_estimated);E_noise = sum(abs(fft_n)) / N;mag_y = abs(fft_y);phase_y = angle(fft_y); % 保留相位信息mag_s = mag_y - E_noise;mag_s(mag_s<0)=0;% 恢复fft_s = mag_s .* exp(1i.*phase_y);s = ifft(fft_s);subplot(311);plot(x);ylim([-1.5,1.5]);title('原始干净信号');subplot(312);plot(y);ylim([-1.5,1.5]);title('加噪信号');subplot(313);plot(real(s));ylim([-1.5,1.5]);title('谱减法去噪后信号');
上图取了一段wav文件的脚步声。从第二张图到第3张图,有一些去噪效果。但信号本身也有衰减。
谱减法应用范围还是非常有限。在实际应用中。主要限制在环境噪声的特性上大部分情况不是简单的高斯特性,并且也非常难满足噪声加法模型。另外,在谱减之后截断为0引入的新的音乐噪声至今没办法全然解决。但在高SNR的条件下,使用谱减法进行语音信号的增强确也能达到不错的效果。
參考文献
- Navneet Upadhyay etc. Spectral Subtractive-Type Algorithms for Enhancement of Noisy Speech: An Integrative Review. 2013.
- 林琴,张道信,吴小培. 一种基于改进谱减法的语音去噪新方法. 计算机技术与发展, 2007年7月.
- Marc Karam, Hasan F. Khazaal, Heshmat Aglan, Cliston Cole. Noise Removal in Speech Processing Using Spectral Subtraction. Journal of Signal and Information Processing, 2014, 5, 32-41.