y相当于是你在025s录好的声音,在调用sound函数时你要用Fs作为参数,相当于正常速度录正常速度放,若改成Fs1相当于正常速度录而快速播放,反之当选择比Fs小的数时,相当于慢放,因此录放速度不同都会产生变调,它们直接控制声卡的输出速度。
如果是想将声音信号录制到matlab里面,则可以使用以下的函数。 R = audiorecorder( 44100, 16 ,2 ) ; %创建一个保存音频信息的对象,它包含采样率,时间和录制的音频信息等等。44100表示采样为44100Hz(可改为8000, 11025, 22050等
这种情况一般是功放前级引起的,前级信号受到干扰。正常情况下由于前级形成闭合回路,干扰信号由于电势极弱,被短路(即使电阻达到几百千欧)过滤掉了,所以听不到干扰声,但当前级开路后,信号输入端变成了天线,感应空中的大量电磁杂波信号,被功放放大形成尖啸声。
解决办法是,检查输入端线路是否有开路(换质量好的信号输入线),若换线后依然有尖啸,可以人为短路输入端,若尖啸声消失,说明问题出在音频信号输出设备上,如声卡、mp3随身听等。若短路依然存在噪音,则重点检查音量电位器接地端是否开路。根据上述原因逐个检查,就能找到故障原因。总之,这种尖刺声的原因是信号端开路和公共接地极形成无限大电阻造成的。
另有特殊例子就是功放电源滤波不良,但此种情况形成的噪音是50HZ的低频噪音,这种情况一般情况是不会发生的。
%语音信号为读入的声音文件
%噪声为正态随机噪声
sound=wavread('c12345wav');
count1=length(sound);
noise=005randn(1,count1);
for i=1:count1
signal(i)=sound(i);
end
for i=1:count1
y(i)=signal(i)+noise(i);
end
%在小波基'db3'下进行一维离散小波变换
[coefs1,coefs2]=dwt(y,'db3'); %[低频 高频]
count2=length(coefs1);
count3=length(coefs2);
energy1=sum((abs(coefs1))^2);
energy2=sum((abs(coefs2))^2);
energy3=energy1+energy2;
for i=1:count2
recoefs1(i)=coefs1(i)/energy3;
end
for i=1:count3
recoefs2(i)=coefs2(i)/energy3;
end
%低频系数进行语音信号清浊音的判别
zhen=160;
count4=fix(count2/zhen);
for i=1:count4
n=160(i-1)+1:160+160(i-1);
s=sound(n);
w=hamming(160);
sw=sw;
a=aryule(sw,10);
sw=filter(a,1,sw);
sw=sw/sum(sw);
r=xcorr(sw,'biased');
corr=max(r);
%为清音(unvoice)时,输出为1;为浊音(voice)时,输出为0
if corr>=08
output1(i)=0;
elseif corr<=01
output1(i)=1;
end
end
for i=1:count4
n=160(i-1)+1:160+160(i-1);
if output1(i)==1
switch abs(recoefs1(i))
case abs(recoefs1(i))<=0002
recoefs1(i)=0;
case abs(recoefs1(i))>0002 & abs(recoefs1(i))<=0003
recoefs1(i)=sgn(recoefs1(i))(0003abs(recoefs1(i))-0000003)/0002;
otherwise recoefs1(i)=recoefs1(i);
end
elseif output1(i)==0
recoefs1(i)=recoefs1(i);
end
end
%对高频系数进行语音信号清浊音的判别
count5=fix(count3/zhen);
for i=1:count5
n=160(i-1)+1:160+160(i-1);
s=sound(n);
w=hamming(160);
sw=sw;
a=aryule(sw,10);
sw=filter(a,1,sw);
sw=sw/sum(sw);
r=xcorr(sw,'biased');
corr=max(r);
%为清音(unvoice)时,输出为1;为浊音(voice)时,输出为0
if corr>=08
output2(i)=0;
elseif corr<=01
output2(i)=1;
end
end
for i=1:count5
n=160(i-1)+1:160+160(i-1);
if output2(i)==1
switch abs(recoefs2(i))
case abs(recoefs2(i))<=0002
recoefs2(i)=0;
case abs(recoefs2(i))>0002 & abs(recoefs2(i))<=0003
recoefs2(i)=sgn(recoefs2(i))(0003abs(recoefs2(i))-0000003)/0002;
otherwise recoefs2(i)=recoefs2(i);
end
elseif output2(i)==0
recoefs2(i)=recoefs2(i);
end
end
%在小波基'db3'下进行一维离散小波反变换
output3=idwt(recoefs1, recoefs2,'db3');
%对输出信号抽样点值进行归一化处理
maxdata=max(output3);
output4=output3/maxdata;
%读出带噪语音信号,存为'101wav'
wavwrite(y,5500,16,'c101');
%读出处理后语音信号,存为'102wav'
wavwrite(output4,5500,16,'c102');
给原始的语音信号加上一个高频余弦噪声,频率为38kHz。画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。要加入白噪声只需把余弦噪声换成白噪声,用randn函数产生高斯分布序列。我的源程序如下:
clc;
fs=8000;
x1=wavread('pb8kwav');
t=(0:length(x1)-1)/8000;
f=fs(0:1023)/2048;
Au=005;
d=[Aucos(2pi3800t)]'; %噪声为38kHz的余弦信号
x2=x1+d;
y1=fft(x1,2048);
y2=fft(x2,2048);
figure(1)
plot(t,x2)
grid on;axis tight;
title('加噪后的信号');
xlabel('time(s)');
ylabel('幅度');
figure(2)
subplot(2,1,1);
plot(f,abs(y1(1:1024)));grid on;axis tight;
title('原始语音信号频谱');
xlabel('Hz');ylabel('幅度');
subplot(2,1,2);
plot(f,abs(y2(1:1024)));grid on;axis tight;
title('加噪语音信号频谱');
xlabel('Hz');ylabel('幅度');
运行结果如下:
以上就是关于matlab中sound函数中取样频率变化了为什么声音也变了全部的内容,包括:matlab中sound函数中取样频率变化了为什么声音也变了、如何用MATLAB编辑一个录音机程序、MATLAB变声器做出来的声音很尖锐刺耳怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)