声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4401|回复: 12

[综合讨论] 如何在MATLAB里给语音信号加噪声

[复制链接]
发表于 2008-3-12 15:21 | 显示全部楼层 |阅读模式

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

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

x
现在遇到一个棘手的问题,急待解决,谢谢大家指点!

[ 本帖最后由 eight 于 2008-3-12 15:37 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-3-12 15:38 | 显示全部楼层
 楼主| 发表于 2008-3-12 15:48 | 显示全部楼层
好的,谢谢!
我好好看看
发表于 2008-3-12 18:10 | 显示全部楼层
可用degrade函数把噪声加到信号中去
发表于 2008-3-12 18:38 | 显示全部楼层
原帖由 songzy41 于 2008-3-12 18:10 发表
可用degrade函数把噪声加到信号中去
>> help degrade
degrade.m not found.
Use the Help browser Search tab to search the documentation, or
type "help help" for help command options, such as help for methods.

我的matlab版本是2007a,没有这个函数。是否不是matlab自带的函数?
 楼主| 发表于 2008-3-12 22:39 | 显示全部楼层
fs=22050;
x1=wavread('d:\2.wav');
f=fs*(0:511)/1024;
t=0:1/22050:(size(x1)-1)/22050;
Au=0.03;
d=[Au*cos(2*pi*5000*t)]';
x2=x1+d;
sound(x2,22050);
y2=fft(x2,1024);
figure(1);
plot(t,x2);
title('加噪后的信号');
xlabel('time n');
ylabel('fuzhi n');
figure(2)
subplot(2,1,1);
plot(f,abs(y1(1:512)));
xlabel('Hz');
ylabel('fuzhi');
subplot(2,1,2);
plot(f,abs(y2(1:512)));
title('加噪后的信号频谱');
xlabel('Hz');
ylabel('fuzhi');
我试了试,这个程序还是不能用,还是出现的错误:
??? Error using ==> plus
Matrix dimensions must agree.

Error in ==> Untitled25 at 7
x2=x1+d;
这里x1是2维的,而d是1维的,怎么变一下呀?
发表于 2008-3-13 07:57 | 显示全部楼层
由wavread读入的数据往往是一列数据,而d是一行数据,所以在x2=x1+d中把一行数据与一列数据相加产生了错误。
 楼主| 发表于 2008-3-13 09:03 | 显示全部楼层
能用什么语句给他变一下吗?转置好像也不行
发表于 2008-3-13 09:23 | 显示全部楼层
原帖由 yo_yolu 于 2008-3-12 22:39 发表
fs=22050;
x1=wavread('d:\2.wav');
f=fs*(0:511)/1024;
t=0:1/22050:(size(x1)-1)/22050;
Au=0.03;
d=[Au*cos(2*pi*5000*t)]';
x2=x1+d;
sound(x2,22050);
y2=fft(x2,1024);
figure(1);
plot(t,x2);
tit ...

只有你自己才知道怎样变,其他人如何知道?建议用一个小例子外加说明,参考这个:写文件时的格式问题
发表于 2008-3-13 09:32 | 显示全部楼层
我附上degrade函数:
% [Y] = degrade(X,SNR,NOISE)
% adds SNR dB NOISE to the speech signal X and returns the noisy signal in Y
% By default SNR=10dB and NOISE is AWGN.
function [Y] = degrade(X,SNR,NOISE)
if isstr(X)==1, X=read(X); end
if nargin < 3, NOISE=randn(size(X)); end
if nargin < 2, SNR=10; end
if length(NOISE) < length(X),
   disp('Length of speech signal X should be greater than noise NOISE');
   break
end
signal_power = 1/length(X)*sum(X.*X);
noise_variance = signal_power / ( 10^(SNR/10) );
Y=X+sqrt(noise_variance)/std(NOISE)*NOISE(1:length(X));
Y=32000/max(abs(Y))*Y;
 楼主| 发表于 2008-3-13 10:05 | 显示全部楼层
还是不太明白,degrade语句放在matlab语句的什么位置?怎么加这个语句呀?谢谢指点
发表于 2008-3-14 13:02 | 显示全部楼层
你的程序可以这样写:
fs=22050;
x1=wavread('d:\2.wav');
f=fs*(0:511)/1024;
t=0:1/22050:(size(x1)-1)/22050;
x2=degrade(x1,20);
x2中信噪比是20dB。你不妨把加噪前后的信号画出来看看,就能明白了。
发表于 2009-10-12 16:43 | 显示全部楼层
原帖由 songzy41 于 2008-3-13 09:32 发表
我附上degrade函数:
% [Y] = degrade(X,SNR,NOISE)
% adds SNR dB NOISE to the speech signal X and returns the noisy signal in Y
% By default SNR=10dB and NOISE is AWGN.
function [Y] = degrade(X,SNR,N ...


请问下这段代码最后两行表示的是什么意思。我实现了下。可以加噪,但原理还是有点迷糊。
谢谢。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-16 21:48 , Processed in 0.082272 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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