
两个相同采样率的wav文件才能合并. wav文件读进来按数方法合并
[X, fs] = wavread('youvegotmail.wav')[Y, fs] = wavread('hello.wav')
Z = [Y X]
wavwrite(Z,fs,'helloyouvegotmail.wav')
% clc% clear all
% 产生信号
load handel
x=y(1:20000)%取前20000个采样点
sound(x,Fs)
%PCM编码
x1=x/0.8.*2048
yy=pcm_encode(x1)
figure
subplot(2,1,1)
stem(yy(1:80),'.')
title('PCM编码后的波形')
%加噪声
snr=10
sp=mean(yy.^2)
attn=sp./ 10^(snr/10)
attn = sqrt(attn)
noise=randn(1,length(yy)).*attn
np=mean(noise.^2)
snr1=10*log10(sp/np)
data=yy+noise
% data=yy%不加噪声
subplot(2,1,2)
stem(data(1:80),'.r')
title('PCM加噪声后波形')
%译码
demodata=data>0.5
zz=pcm_decode(demodata,0.8)
figure
subplot(2,1,1)
plot(x)
title('原始语音信号')
subplot(2,1,2)
plot(zz)
title('译码后的语音信号')
sound(zz,Fs)
figure
plot(x,'b')
hold on
plot(zz,'r')
legend('编译码前的语音信号','编译码后的语音信号')
title('编,译码前后的语音信号')
function y = pcm_encode( x )
y=zeros(length(x),8) %存储矩阵(全零)
z=sign(x) %判断x的正负
x=abs(x)%取绝对值
%%段落码判断段区间的取值范围为前开后闭区间
for k=1:length(x)
%符号位的判断
if z(k)>0
y(k,1)=1
elseif z(k)<0
y(k,1)=0
end
if x(k)>128 &x(k)<=2048 %在第五段与第八段之间,段位码第一位都为“1”
y(k,2)=1
end
if (x(k)>32 &x(k)<=128) || (x(k)>512 &x(k)<=2048)
y(k,3)=1 %在第三四七八段内,段位码第二位为“1”
end
if (x(k)>16&x(k)<=32)||(x(k)>64&x(k)<=128)||(x(k)>256&x(k)<=512)||(x(k)>1024&x(k)<=2048)
y(k,4)=1 %在二四六八段内,段位码第三位为“1”
end
end
%段内码判断程序
N=zeros(1,length(x))
for k=1:length(x)
N(k)=y(k,2)*4+y(k,3)*2+y(k,4)+1 %找到x位于第几段
end
a=[0,16,32,64,128,256,512,1024] %量化间隔
b=[1,1,2,4,8,16,32,64]%除以16,得到每段的最小量化间隔
for m=1:length(x)
q=ceil((x(m)-a(N(m)))/b(N(m))) %求出在段内的位置
if q==0
y(m,(5:8))=[0,0,0,0] %如果输入为零则输出“0”
else k=num2str(dec2bin(q-1,4)) %编码段内码为二进制
y(m,5)=str2num(k(1))
y(m,6)=str2num(k(2))
y(m,7)=str2num(k(3))
y(m,8)=str2num(k(4))
end
end
%将N行8列矩阵转换为1行8*N列的矩阵
y=y'
y=reshape(y,1,length(x)*8)
end
function x=pcm_decode(y,max)
%将1行8*N列的矩阵转换为N行8列矩阵
y=reshape(y,8,length(y)/8)
y=y'
%PCM译码
n=size(y,1) %求出输入码组的个数
a=[0,16,32,64,128,256,512,1024] %段落起点值
b=[1,1,2,4,8,16,32,64] %每段的最小量化间隔
for k=1:n
t1=y(k,1)%取符号
t2=y(k,2)*4+y(k,3)*2+y(k,4)+1%判断段落位置
t3=y(k,5)*8+y(k,6)*4+y(k,7)*2+y(k,8) %判断段内位置
if t3==0 %段内码为零时
m(k)=(a(t2)+1+0.5*b(t2))/2048*max
else
m(k)=(a(t2)+b(t2)*t3+0.5*b(t2))/2048*max%还原出量化后的电平值
end
%判断符号位
if t1==0
x(k)=-m(k)
else
x(k)=m(k)
end
end
end
1)用mp3录音,生成文件cricket.wav,把该文件放到matlab文件夹里面(就是你打开matlab后中间顶部的地址)。
2)使用如下程序,做波形显示以及fft变换。
[y,Fs,bits]=wavread('cricket.wav')%读出信号,采样率和采样位数。
y=y(:,1)%我这里假设你的声音是双声道,我只取单声道作分析,如果你想分析另外一个声道,请改成y=y(:,2)
sigLength=length(y)
Y = fft(y,sigLength)
Pyy = Y.* conj(Y) / sigLength
halflength=floor(sigLength/2)
f=Fs*(0:halflength)/sigLength
figureplot(f,Pyy(1:halflength+1))xlabel('Frequency(Hz)')
t=(0:sigLength-1)/Fs
figureplot(t,y)xlabel('Time(s)')
3)频率看频谱就有了,声音间隔看声音波形,周期看声音波形。
4)关于去噪声。
a)如果噪声是特定频率的周期噪声(periodic noise),比如说50hz,那么你可以用matlab的filter,作一个低通、高通、带通或者带阻滤波。
b)如果声音是高斯白噪声。那就用自适应滤波(adaptive filter,wiener filter)。这里涉及到对噪声的采样、计算特征值以及决定阶数的问题。
c)幸好我们可以“耍赖”——用cool editor。用它打开wav文件,用鼠标把一段噪声圈起来,采样,然后直接选择去噪就可以了。各大网站有介绍。
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)