怎么在matlab中看滤波后的信噪比,为什么滤波之后信噪比反而降了?新手求大神指教...

本帖最后由 ppptt 于 2015-4-22 19:45 编辑

求大神指教,对音频信号先进行加噪处理然后求信噪比是3.3967,然后进行形态滤波,再求信噪比不知道哪里出了问题,变成了3.1410,反而降了,调试了很久都不知道哪里出了错:'( ,是毕设的代码,所以有点着急,新手求大神指教,感激不尽~:)

[y,fs,bits]=wavread('C:\Users\Administrator\Desktop\sample.wav');

%  sound(y,fs)      % 回放语音信号

n=length(y)  %选取变换的点数

y_p=fft(y,n);      %对n点进行傅里叶变换到频域

f=fs*(0:n/2-1)/n;   % 对应点的频率

figure(1)

subplot(2,1,1);

plot(y);                    %语音信号的时域波形图

title('原始语音信号采样后时域波形');

xlabel('时间轴')

ylabel('幅值 A')

subplot(2,1,2);

plot(f,abs(y_p(1:n/2)));     %语音信号的频谱图

title('原始语音信号采样后频谱图');

xlabel('频率Hz');

ylabel('频率幅值');

%加噪处理%

L=length(y)        %计算音频信号的长度

noise=0.1*randn(L,2);  %产生等长度的随机噪声信号(这里的噪声的大小取决于随机函数的幅度倍数)

y_z=y+noise;        %将两个信号叠加成一个新的信号——加噪声处理

%sound(y_z,fs)

%对加噪后的语音信号进行分析

Ps=sum(sum((y-mean(mean(y))).^2));

Pn=sum(sum((y-y_z).^2));

Snr1=10*log10(Ps/Pn) ;  %求加入噪声后的信噪比Snr1

disp('Snr1=');

disp(Snr1);

n=length(y);  %选取变换的点数

y_zp=fft(y_z,n);      %对n点进行傅里叶变换到频域

f=fs*(0:n/2-1)/n;   % 对应点的频率

figure(2)

subplot(2,1,1);

plot(y_z);                    %加噪语音信号的时域波形图

title('加噪语音信号时域波形');

xlabel('时间轴')

ylabel('幅值 A')

subplot(2,1,2);

plot(f,abs(y_zp(1:n/2)));     %加噪语音信号的频谱图

title('加噪语音信号频谱图');

xlabel('频率Hz');

ylabel('频率幅值');

u=linspace(0,2,200);

OSELen=3;

for i=1:OSELen

NHOD2(i)=1;

if(i==OSELen)

OSE2(i)=u(1);

else

OSE2(i)=u(i);%三角形结构元素

end

end

figure(3)

plot(1:OSELen,OSE2)

title('结构元素');

refSE=strel('arbitrary',NHOD2,OSE2);

% se2=strel('arbitrary',OSE,OSE);

%做广义闭开运算(broad sense:广义的)

BSCO1=imclose(y_z,refSE);%去除负向脉冲

BSCO1=imopen(BSCO1,refSE);%去除正向脉冲

% 做广义开闭运算

BSOC=imopen(y_z,refSE);

BSOC=imclose(BSOC,refSE);

% 做平均

BSCO=(BSCO1+BSOC)/2;

%滤除噪声后信号

figure(4)

plot(0:1:length(BSCO)-1,BSCO);

title('滤除噪声后信号');

fs=200;

N=length(BSCO);

y_a=fft(BSCO);

magy=abs(y(1:1:N/2))*2/N;

f=(0:N/2-1)*fs/N;

figure(5)

plot(f,magy);

title('滤除噪声后信号频谱');

ZS=y_z-BSCO;%噪声信号

figure(6)

plot(ZS);

title('噪声信号');

Ps=sum(sum((BSCO-mean(mean(BSCO))).^2));

Pn=sum(sum((y-BSCO).^2));

Snr2=10*log10(Ps/Pn);     %求滤波后含噪信号的信噪比Snr2

disp('Snr2=');

disp(Snr2);

a=Snr2-Snr1;

你可能感兴趣的:(怎么在matlab中看滤波后的信噪比,为什么滤波之后信噪比反而降了?新手求大神指教...)