matlab判断信号哪些是语音,matlab语音信号处理如何判别清浊音?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这是我一个学长给的程序,他说里面要算得基本上已经实现了改一下就可以用了。。。但是i本人不是主攻matlab的说白了就是不怎么会,,想问下该怎么改来实现判断清浊音的功能。

%对语音信号采样分帧

clear

clc

X= wavread('E:\003\luyin.wav');

%对信号进行预加重

x=X;

x4=filter([1,-0.9375],1,x);

figure(1)

subplot(2,1,1),plot(x)

title('原始语音信号');

xlabel('样本序列n');

ylabel('幅值');

subplot(2,1,2),plot(x4)

title('原始语音信号的预加重');

xlabel('样本序列n');

ylabel('幅值');

% 幅度归一化到[-1,1]

x=double(x);

x=x/max(abs(x));

% 常数设置

FrameLen=240; % 帧长取30ms,8kHz的采样率

FrameInc=80; % 帧移取10ms,1/3

amp1=3;

amp2=2;

zcr1=10;

zcr2=5;

maxsilence=3; % 3*10ms=30ms

minlen=15; % 15*10ms=150ms

status=0;

count=0;

silence=0;

% 短时过零率(矢量法)

tmp1=enframe(x(1:length(x)-1),FrameLen,FrameInc);

tmp2=enframe(x(2:length(x)),FrameLen,FrameInc);

signs=(tmp1.*tmp2)< 0;

diffs=(tmp1-tmp2)> 0.02;

zcr=sum(signs.*diffs,2);

figure(2)

subplot(2,1,1)

plot(zcr);

title('短时过零率');

ylabel('zcr')

%计算短时能量

amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);

inz=find(amp>1);

amm=amp(inz);

ll=min(amm);

figure(2)

subplot(2,1,2)

plot(amp);

title('短时能量');

ylabel('amp')

%调整能量门限

amp1=ll+(max(amp)-ll)/8;

amp2=ll+(max(amp)-ll)/16;

%开始端点检测

x1=0;

x2=0;

for n=1:length(zcr)

goto = 0;

switch status

case{0,1} % 0=静音,1=可能开始

if amp(n) > amp1 % 确信进入语音段

x1=max(n-count-1,1);

status=2;

silence=0;

count=count+1;

elseif amp(n) >amp2 | zcr(n) > zcr2 % 可能处于语音段

status=1;

count=count+1;

else % 静音状态

status=0;

count=0;

end

case 2, % 2=语音段

if amp(n) > amp2 | zcr(n) > zcr2 % 保持在语音段

count=count+1;

else

silence=silence+1;

if silence < maxsilence % 静音还不够长,尚未结束

count=count+1;

elseif count < minlen % 语音长度太短,认为是噪声

status=0;

silence=0;

count=0;

else % 语音结束

status=3;

end

end

case 3, % 3=语音结束

break;

end

end

count=count-silence;

x2=x1+count-1;

figure(3)

subplot(2,1,1)

plot(x)

title('语音信号的端点检测');

axis([1 length(x) -1 1])

ylabel('Speech');

line([x1*FrameInc x1*FrameInc],[-1,1],'color','red');

line([x2*FrameInc x2*FrameInc],[-1,1],'color','red');

%n1=(x1*FrameInc-x2*FrameInc)+1;

yy=x(x1*FrameInc:x2*FrameInc);%x1*FrameInc=3760,x2=8320,

%yy的长度是4560

figure(3)

subplot(2,1,2)

plot(yy)

axis([1 length(yy) -1 1]) %将此处的横坐标改值就可以取不同的语音段现在是整个语音段,

title('原始语音信号进行端点检测后得到的有用的语音信号段')

fs=11.025;%设定采样频率

y=fft(yy);%进行fft变换

mag=abs(y);%求幅值

f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换

figure(4);

plot(f,mag);%做频谱图

xlabel('频率(Hz)');

ylabel('幅值');

title('信号波幅频谱图');

grid;

z=0.1*rand(1,length(yy));

figure(5);

plot(z)

fs=11.025;%设定采样频率

Z=fft(z);%进行fft变换

mag=abs(Z);%求幅值

f=(0:length(Z)-1)'*fs/length(Z);%进行对应的频率转换

figure(6);

plot(f,mag);%做频谱图

xlabel('频率(Hz)');

ylabel('幅值');

title('噪声波幅频谱图')

grid;

m=yy'+z;

figure(7);

subplot(2,1,1);

plot(m)

fs=11.025;%设定采样频率

M=fft(m);%进行fft变换

mag=abs(M);%求幅值

f=(0:length(M)-1)'*fs/length(M);%进行对应的频率转换

figure(8);

plot(f,mag);%做频谱图

xlabel('频率(Hz)');

ylabel('幅值');

title('混合信号波幅频谱图')

grid;

%wavwrite(m,'s01')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值