声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1479|回复: 9

[综合讨论] 我晕头了,还望请教

[复制链接]
发表于 2007-3-2 23:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
经常我们提到信噪比,都知道是越大越好,可是有谁能告诉我,污染语音去噪后的信噪比怎么计算啊?是用去噪后的语音功率/噪音功率吗?但去噪前的信噪比是去噪前的语音功率/噪音功率,这两个信噪比比较起来,发现是后者大,这岂不是说明,去噪后的语音还没有去噪后好啊????
我有点晕头了,还望请教!!!
回复
分享到:

使用道具 举报

发表于 2007-3-3 00:53 | 显示全部楼层
这句话本身是正确的,可能你没有理解好。信噪比的定义在不同领域可能不一样,但都是指信号的有用成份与噪声的强弱对比。另外,去噪后,计算其信噪比时公式中分母对应的噪声决不是去噪前的噪声,不要搞错了。

[ 本帖最后由 eight 于 2007-3-3 02:58 编辑 ]
 楼主| 发表于 2007-3-3 10:15 | 显示全部楼层
谢谢,其实你说的这个我也知道,但就是不知道怎么求,概念有些模糊,还望指教,例如:
原始语音信号:x1
加入白噪音后的语音信号s=x1+0.04*randn(size(x1));
去噪前的信噪比是snr=10log10(power1/power2)
其中power1表示s的功率,power2表示噪音0.04*randn(size(x1))的功率,去噪前的信噪比这样求是正确的吗?????

然后用阀值法对s进行去噪,得到了去噪后的语音信号c
那么这个时候的信噪比怎么求呢???
snr=snr=10log10(power1/power2)
其中power1表示c的功率,那么 power2表示谁的功率呢,怎么求啊,难道是用c的功率减去x1的功率吗???
还请高手点拨!!!!!!!谢谢
发表于 2007-3-3 10:47 | 显示全部楼层
原帖由 harejavahill 于 2007-3-3 10:15 发表
谢谢,其实你说的这个我也知道,但就是不知道怎么求,概念有些模糊,还望指教,例如:
原始语音信号:x1
加入白噪音后的语音信号s=x1+0.04*randn(size(x1));
去噪前的信噪比是snr=10log10(power1/power2)
其 ...



你还没有看懂我写的“信号的有效成分”的意思,去噪前,power1是x1而不是s。至于去噪后,我认为应该是:power1依然是x1,power2是(c-x1)的功率,建议看看关于信噪比的精华贴
 楼主| 发表于 2007-3-3 11:25 | 显示全部楼层
十分感谢eight,但是我按照你所说的那样,在matlab中编程,比较去噪前与去噪后的信噪比,结果令人十分失望。程序如下:
去噪前:
fs=22050;                  %语音信号采样频率为22050
x1=wavread('d:\huzhoushifanxueyuan.wav'); %读取语音信号的数据,赋给变量x1   
noise=0.04*randn(size(x1));
s=x1+noise;
sigpower=sum(abs(x1(:)).^2)/length(x1(:));
nospower=sum(abs(noise(:)).^2)/length(noise(:));
snr=10*log10(sigpower/nospower);
disp(snr)
得到的结果为10.9
去噪后:
fs=22050;                  %语音信号采样频率为22050
x1=wavread('d:\huzhoushifanxueyuan.wav'); %读取语音信号的数据,赋给变量x1   
noise=0.04*randn(size(x1));
s=x1+noise;
xd=wden(s,'sqtwolog','s','one',3,'sym8');
%对上述信号进行图示
sigpower=sum(abs(x1(:)).^2)/length(x1(:));
noise=xd-x1;
nospower=sum(abs(noise(:)).^2)/length(noise(:));
snr=10*log10(sigpower/nospower);
disp(snr)
得到的结果为:5.6
这是在matlab中运行的结果,发现去噪后的信噪比反而变小了,很奇怪,希望指教,谢谢!!!!!!!
发表于 2007-3-3 11:34 | 显示全部楼层
原帖由 harejavahill 于 2007-3-3 11:25 发表
十分感谢eight,但是我按照你所说的那样,在matlab中编程,比较去噪前与去噪后的信噪比,结果令人十分失望。程序如下:
去噪前:
fs=22050;                  %语音信号采样频率为22050
x1=wavread('d:\huzh ...



1. 你前后两次读取文件得到x1,两者是否一样的?
2. 你前后两次用randn生成噪声,显然不对,随机的结果令两次噪声不一样,snr结果不可信
发表于 2007-3-3 11:40 | 显示全部楼层

  1. x1=sin(1:0.05:10);
  2. noise=0.04*randn(size(x1));
  3. s=x1+noise;
  4. sigpower=sum(abs(x1(:)).^2)/length(x1(:));
  5. nospower=sum(abs(noise(:)).^2)/length(noise(:));
  6. snr=10*log10(sigpower/nospower);
  7. disp(snr)
  8. xd=wden(s,'sqtwolog','s','one',3,'sym8');
  9. %对上述信号进行图示
  10. noise=xd-x1;
  11. nospower=sum(abs(noise(:)).^2)/length(noise(:));
  12. snr=10*log10(sigpower/nospower);
  13. disp(snr)
复制代码


以上代码我运行了6次,每次显示的信噪比都是后者比前者大,没有问题

[ 本帖最后由 eight 于 2007-3-3 11:51 编辑 ]
 楼主| 发表于 2007-3-3 11:52 | 显示全部楼层
这个倒是奇怪了,两次读取的x1是一样的,其中x1是我自己用话筒在pc上录制的一段语音。我也按照你的程序运行了几次,的确是对的,可运行我的程序就不一样了呢。
我就把你的x1改成了我自己录制的语音信号,可结果还是去噪后的信噪比比去噪前的小,如下程序:
fs=22050;                  %语音信号采样频率为22050
x1=wavread('d:\huzhoushifanxueyuan.wav'); %读取语音信号的数据,赋给变量x1   
noise=0.04*randn(size(x1));
s=x1+noise;
sigpower=sum(abs(x1(:)).^2)/length(x1(:));
nospower=sum(abs(noise(:)).^2)/length(noise(:));
snr=10*log10(sigpower/nospower);
disp(snr)
xd=wden(s,'sqtwolog','s','one',3,'sym8');
%对上述信号进行图示
noise=xd-x1;
nospower=sum(abs(noise(:)).^2)/length(noise(:));
snr=10*log10(sigpower/nospower);
disp(snr)
还望多多指教,谢谢!~!!
因为我不是信号专业的,所以有很多不是很懂,还望eight耐心指教!!
发表于 2007-3-3 11:57 | 显示全部楼层
原帖由 harejavahill 于 2007-3-3 11:52 发表
这个倒是奇怪了,两次读取的x1是一样的,其中x1是我自己用话筒在pc上录制的一段语音。我也按照你的程序运行了几次,的确是对的,可运行我的程序就不一样了呢。
我就把你的x1改成了我自己录制的语音信号,可结果 ...



1. 试试修改噪声的强度,即调整0.04这个值
2. 用其他去噪方法试试,或者调整wden函数的参数。有可能这个去噪方法对你的信号不适用
3. plot x1 和 xd,一般去噪效果有否改善可以通过肉眼分辨出来

[ 本帖最后由 eight 于 2007-3-3 11:58 编辑 ]
 楼主| 发表于 2007-3-3 13:04 | 显示全部楼层
谢谢eight,当我调整了噪音的强度后,发现只有在一定的区域里,去噪后的信噪比比去噪前的信噪比要大,这是为什么啊??希望指教。
而且信噪比都比较小,一般在2.0左右,这是正确的吗??
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-24 21:25 , Processed in 0.059694 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表