matlab程序求注释,语音增强的,减谱法.....

matlab程序求注释,语音增强的,减谱法.....,第1张

原来想注释完,有事要出去,基本的思想已写完,后面的看程序吧。

不外乎是,分帧,加窗,估计噪音,傅里叶变换,反傅里叶变换等。

%输入参数s 语音数据,fs 采样频率,p 下面有说明,共11个,可不输入,有默认值

%“过度减法(oversubtraction)”作减法的时候,保留一小部分原来的背景噪音,用这部分背景噪音来掩盖住音乐噪音的谱峰,从而消除了令人不悦的音乐噪音。

%通过给的参数p,估计噪音,做谱减法。从而消除噪音。

function [ss,po]=specsubm(s,fs,p)

%利用频谱相减(spectral subtraction)增强 [SS,PO]=(S,FS,P)

%

% implementation of spectral subtraction algorithm by R Martin (rather slow)

% algorithm parameters: t in seconds, f in Hz, k dimensionless

% 1: tg = smoothing time constant for signal power estimate (004): high=reverberant, low=musical

% 2: ta = smoothing time constant for signal power estimate

% used in noise estimation (01)

% 3: tw = fft window length (will be rounded up to 2^nw samples)

% 4: tm = length of minimum filter (15): high=slow response to noise increase, low=distortion

% 5: to = time constant for oversubtraction factor (008)

% 6: fo = oversubtraction corner frequency (800): high=distortion, low=musical

% 7: km = number of minimisation buffers to use (4): high=waste memory, low=noise modulation

% 8: ks = oversampling constant (4)

% 9: kn = noise estimate compensation (15)

% 10:kf = subtraction floor (002): high=noisy, low=musical

% 11:ko = oversubtraction scale factor (4): high=distortion, low=musical

%检查函数的输入参数,如果输入少于三个,po为默认值,po的参数上面有说明

if nargin<3 po=[004 01 0032 15 008 400 4 4 15 002 4]'; else po=p; end

ns=length(s);

ts=1/fs;

ss=zeros(ns,1);

ni=pow2(nextpow2(fspo(3)/po(8)));

ti=ni/fs;

nw=nipo(8);

nf=1+floor((ns-nw)/ni);

nm=ceil(fspo(4)/(nipo(7)));

win=05hamming(nw+1)/108;win(end)=[];

zg=exp(-ti/po(1));

za=exp(-ti/po(2));

zo=exp(-ti/po(5));

px=zeros(1+nw/2,1);

pxn=px;

os=px;

mb=ones(1+nw/2,po(7))nw/2;

im=0;

osf=po(11)(1+(0:nw/2)'fs/(nwpo(6)))^(-1);

imidx=[13 21]';

x2im=zeros(length(imidx),nf);

osim=x2im;

pnim=x2im;

pxnim=x2im;

qim=x2im;

for is=1:nf

idx=(1:nw)+(is-1)ni;

x=rfft(s(idx)win);

x2=xconj(x);

pxn=zapxn+(1-za)x2;

im=rem(im+1,nm);

if im

mb(:,1)=min(mb(:,1),pxn);

else

mb=[pxn,mb(:,1:po(7)-1)];

end

pn=po(9)min(mb,[],2);

%os= oversubtraction factor

os=zoos+(1-zo)(1+osfpn/(pn+pxn));

px=zgpx+(1-zg)x2;

q=max(po(10)sqrt(pn/x2),1-sqrt(ospn/px));

ss(idx)=ss(idx)+irfft(xq);

end

if nargout==0

soundsc([s; ss],fs);

end

直接用两个矩阵相见就可以啦,例如a和b矩阵相减 直接用c=a-b即可 需要注意a和b的矩阵行、列数要相等 比如可以编程 a=[1 1;2 2]; b=[3 4;5 6]; c=a-b

用MATLAB编程实现谱减法,维纳滤波法的语音增强

如果你找到另一种的,可不可以也发给我一份,若是有维纳滤波,卡尔曼滤波,自适应滤波,最小均方误差估计法,听觉掩蔽法其中任一种也行

winsize=256;%窗长

n=01;%噪声水平

a=2;

b=6;

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

size=length(speech);%语音长度

numofwin=floor(size/winsize);%窗数

%定义汉明窗

ham=hamming(winsize)';

hamwin=zeros(1,size);

enhanced=zeros(1,size);

improved=zeros(1,size);

%生成噪声信号

noise=nrandn(1,size);

y=speech'+noise;

%噪声处理

noisy=nrandn(1,winsize);

N=fft(noisy);

npow=abs(N);

for q=1:2numofwin-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(yframeham);

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(jyangle);

for i=1:winsize

if Pyy(i)-bPnn(i)>0

Pss(i)=Pyy(i)-bPnn(i);

else

Pss(i)=0;

end

end

ss=Pss^(1/a)exp(jyangle);

%去噪语音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=10log10(var(speech')/var(noisy));%加噪语音信噪比

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

SNR3=10log10(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)']);

clear;

[x,fs]=audioread('D:\2wav');

y=x(1:4096,1);

Y=fft(y);

magY=abs(Y);

b=[];

for i=0:126;

n=4096;

x1=x(1+ni:n+ni);

X1=fft(x1);

magX=abs(X1);

S=(magX^2-magY^2);

S1=abs(S)^05;

s1=ifft(S1);

m=mean(s1)300;

for j=1:4096;

if abs(s1(j))>m;

s1(j)=s1(j)/4;

end

end

a=s1';

b=[b a];

end

x2=b';

plot(x2);

sound(x2,fs);

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

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

对噪声的基本假设

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

则有

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

可得加噪后的能量谱如下

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

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

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

不好意思,没看到维纳滤波,程序就不删了

%谱减法语音增强

%输入参数s 语音数据,fs 采样频率,p 下面有说明,共11个,可不输入,有默认值

%“过度减法(oversubtraction)”作减法的时候,保留一小部分原来的背景噪音,用这部分背景噪音来掩盖住音乐噪音的谱峰,从而消除了令人不悦的音乐噪音。

%通过给的参数p,估计噪音,做谱减法。从而消除噪音。

function [ss,po]=specsubm(s,fs,p)

%利用频谱相减(spectral subtraction)增强 [SS,PO]=(S,FS,P)

%

% implementation of spectral subtraction algorithm by R Martin (rather slow)

% algorithm parameters: t in seconds, f in Hz, k dimensionless

% 1: tg = smoothing time constant for signal power estimate (004): high=reverberant, low=musical

% 2: ta = smoothing time constant for signal power estimate

%

used in noise estimation (01)

% 3: tw = fft window length (will be rounded up to 2^nw samples)

% 4: tm = length of minimum filter (15): high=slow response to noise increase, low=distortion

% 5: to = time constant for oversubtraction factor (008)

% 6: fo = oversubtraction corner frequency (800): high=distortion, low=musical

% 7: km = number of minimisation buffers to use (4): high=waste memory, low=noise modulation

% 8: ks = oversampling constant (4)

% 9: kn = noise estimate compensation (15)

% 10:kf = subtraction floor (002): high=noisy, low=musical

% 11:ko = oversubtraction scale factor (4): high=distortion, low=musical

%检查函数的输入参数,如果输入少于三个,po为默认值,po的参数上面有说明

if nargin<3 po=[004 01 0032 15 008 400 4 4 15 002 4]'; else po=p; end

ns=length(s);

ts=1/fs;

ss=zeros(ns,1);

ni=pow2(nextpow2(fspo(3)/po(8)));

ti=ni/fs;

nw=nipo(8);

nf=1+floor((ns-nw)/ni);

nm=ceil(fspo(4)/(nipo(7)));

win=05hamming(nw+1)/108;win(end)=[];

zg=exp(-ti/po(1));

za=exp(-ti/po(2));

zo=exp(-ti/po(5));

px=zeros(1+nw/2,1);

pxn=px;

os=px;

mb=ones(1+nw/2,po(7))nw/2;

im=0;

osf=po(11)(1+(0:nw/2)'fs/(nwpo(6)))^(-1);

imidx=[13 21]';

x2im=zeros(length(imidx),nf);

osim=x2im;

pnim=x2im;

pxnim=x2im;

qim=x2im;

for is=1:nf

idx=(1:nw)+(is-1)ni;

x=rfft(s(idx)win);

x2=xconj(x);

pxn=zapxn+(1-za)x2;

im=rem(im+1,nm);

if im

mb(:,1)=min(mb(:,1),pxn);

else

mb=[pxn,mb(:,1:po(7)-1)];

end

pn=po(9)min(mb,[],2);

%os= oversubtraction factor

os=zoos+(1-zo)(1+osfpn/(pn+pxn));

px=zgpx+(1-zg)x2;

q=max(po(10)sqrt(pn/x2),1-sqrt(ospn/px));

ss(idx)=ss(idx)+irfft(xq);

end

if nargout==0

soundsc([s; ss],fs);

end

以上就是关于matlab程序求注释,语音增强的,减谱法.....全部的内容,包括:matlab程序求注释,语音增强的,减谱法.....、MATLAB实现谱减法降噪、用MATLAB编程实现谱减法,维纳滤波法的语音增强等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/10109998.html

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

发表评论

登录后才能评论

评论列表(0条)

保存