谱减法去噪matlab,最基本的谱减法去噪程序

各位大大好,新人刚学matlab,需要设计一个最基本的谱减法去噪程序;我按照课题要求写了,运行无错误,但是输出结果明显不对,还请高人解惑,感谢在先。我估计是哪里犯了严重错误……

clear

clc

[x,fs] = wavread('0db.wav');                           % read in the file, fs = frequency=48000

y = downsample(x,3);                                    % downsampling (fs/3)

figure;plot(y)

ind = vadsohn(y,16000,'n');                            %相当于vad检测silent或者voiced段,输出是0或者1

f=enframe(y,hamming(320),160);                   % enframing加窗,汉明窗,50%overlap

nmag = [];smag = [];r = [];                           %初始化

for i = 1:5                                                     %这里开始是获取初始噪音,按照课题要求直接拿开头5个frame

fi = f(i,:);

mag(i) = sum(abs(fft(fi,320)))/length(fi);

end

nmag = sum(mag)/length(mag);                     %初始噪音,按照要求是求平均值

for j = 6:length(f)                                          %第六个frame开始进行处理

smag = abs(fft(f(j,:),320));

%indicator = vadsohn(y((j-1)*160+1:j*160),160); 这里两行可以忽略,用于判断是否silent

%if sum(indicator) ~= 0

if ind(j,3)==1

r(j,:) = (smag - nmag).*(+(smag-nmag)>0);

else

nmag = sum(smag)/320;                        %这里是比较搞不懂的地方,噪音更新完了以后需要对当前信号进行处理吗?

%r(j,:) = (smag - nmag).*(+(smag-nmag)>0);

%r(j,:) = smag;

end

end

F = ifft(r,320,2);                                           %这个逆变换我也不确定是否用对了

X = overlapadd(F,hamming(320),160);           %用overlapadd函数还原信号

figure;plot(X)

学校要求用的overlapadd和vadsohn之类函数都是voicebox这个toolbox的。

1.jpg

(39.97 KB, 下载次数: 5)

2013-4-13 08:53 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

采样后的信号;按理说处理后的差不多也是这样

谱减法去噪matlab,最基本的谱减法去噪程序_第1张图片

2.jpg

(47.47 KB, 下载次数: 5)

2013-4-13 08:53 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

我的程序运行出来的结果……强度小了不说,图也完全不靠谱

谱减法去噪matlab,最基本的谱减法去噪程序_第2张图片

你可能感兴趣的:(谱减法去噪matlab)