谱减法(Spectral Subtraction)

谱减法(Spectral Subtraction),第1张

本文简要探讨了语音信号的基本特性,并介绍了谱减法的基本原理,同时基于Matlab实现了原始谱减法及其一种改进版。最后给出音频波形、频谱,从主观的人耳和客观的评判标准来量化所达到的效果。

在现实世界中,我们获得的所有信号波形都是其对应分布的一组观测值。平稳信号指的是其分布及分布的参数不会发生变化,非平稳信号则是其分布或分布的参数发生变化。对于语音信号来说,由于信号直接由说话者控制,其分布和分布的参数都是不确定的。以一个宏观的角度来看,语音信号具有非平稳性。而在 - 这个尺度,受人的发声器官所限定,语音信号是平稳的,即在微观下,语音信号具有平稳性。正是这种特性,导致了在语音信号处理过程中,短时分析成为一个重坦乱慎要的手段。

噪声的基本假设

基于以上的假设,我们如下定义

则有

对加噪让敬后的语音信号做傅里叶变换可得

可得加噪后的能量谱如下

又因为噪声与纯净的语音信号不相关,则

亦由于语音信号的质量与其频率幅度谱密陪毕切相关,而与频率相位图并无太大关联。则,我们可以保留加噪后的语音信号的频率相位谱,并且估计出噪声的能量谱,就通过以上式子进行语音增强

我们复现了M.Berouti等人的 Enhancement of speech corrupted by acoustic noise 中提出的一种改进版本的谱减法,并使用了Dong Wang等人发布的开源语言数据集 THCHS-30

winsize=256%窗长

n=0.1%噪声水平

a=2

b=6

[speech,fs,nbits]=wavread('E:\matlab\louyin.wav')%读入wav文件

size=length(speech)%语音长度

numofwin=floor(size/winsize)%窗举斗数

%定义汉明窗

ham=hamming(winsize)'

hamwin=zeros(1,size)

enhanced=zeros(1,size)

improved=zeros(1,size)

%生成噪声信号

noise=n*randn(1,size)

y=speech'+noise

%噪声处理

noisy=n*randn(1,winsize)

N=fft(noisy)

npow=abs(N)

for q=1:2*numofwin-1

yframe=y(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)%分正正磨帧

hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham%

%加噪信号FFT

y1=fft(yframe.*ham)

ypow=abs(y1)%加噪信号幅度

yangle=angle(y1)%相位

%计算功率谱密度

Py=ypow.^2

Pn=npow.^2

Pyy=ypow.^a

Pnn=npow.^a

%基本谱减

for i=1:winsize

if Py(i)-Pn(i)>0

Ps(i)=Py(i)-Pn(i)

else

Ps(i)=0

end

end

s=sqrt(Ps).*exp(j*yangle)

for i=1:winsize

if Pyy(i)-b*Pnn(i)>0

Pss(i)=Pyy(i)-b*Pnn(i)

else

Pss(i)=0

end

end

ss=Pss.^(1/a).*exp(j*yangle)

%去噪语音IFFT

enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(s))

improved(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=improved(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(ss))

end

%去除汉明窗引起的增益

for i=1:size

if hamwin(i)==0

enhanced(i)=0

improved(i)=0

else

enhanced(i)=enhanced(i)/hamwin(i)

improved(i)=improved(i)/hamwin(i)

end

end

SNR1=10*log10(var(speech')/清或var(noisy))%加噪语音信噪比

SNR2=10*log10(var(speech')/var(enhanced-speech'))%增强语音信噪比

SNR3=10*log10(var(speech')/var(improved-speech'))

figure(1)plot(speech')%原始语音波形

title(['Original Voice(n=',num2str(n),')'])

figure(2)plot(y)

title(['Noise Added(SNR=',num2str(SNR1),'dB)'])

figure(3)plot(enhanced)

title(['Enhanced Voice(SNR=',num2str(SNR2),'dB)'])

figure(4)plot(improved)

title(['Improved Voice(SNR=',num2str(SNR3),'dB)'])


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12271413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存