Java教程

【语音响度】基于matlab语音声强与响度【含Matlab源码 541期】

本文主要是介绍【语音响度】基于matlab语音声强与响度【含Matlab源码 541期】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、简介

基于matlab语音声强与响度

二、源代码

clear all;
%%----------------------------------------------读取文件------------------------------------------
% 从wav文件读入语音数据,该语音采样率16k,故信号最高频率8k。
[x,fs]=wavread('C2_3_y.wav');
% 取x的一个通道
x=x(:,1);
% 将x从列向量转为行向量
x=x';
% max(x)
% 得到向量x的长度
Length=length(x);
%%----------------------------------------------语音分帧------------------------------------------
% 每帧大小为M,当语音长度不是帧长的整数倍时:
% (1)若剩余长度大于等于帧长的二分之一,则补零至帧长
% (2)若剩余长度小于帧长的二分之一,则舍弃

% 用于计算声压级值的语音帧长分别为20ms、50ms、100ms、200ms以及500ms
framlen = 100;
% 每帧信号的离散点数
M=fs*framlen/1000;
% m为Length/M后得到的余数
m = mod(Length,M);
if m >= M/2 % 补零
    % 补零后的语音
    x = [x,zeros(1,M-m)];
    % 补零后的语音帧长
    Length = length(x);
else   % 即m < M/2,则将剩余的语音帧舍弃
    % l为Length/M后得到的商
    l = floor(Length/M);
    % 舍弃后的语音
    x = x(1,1:M*l);
    % 舍弃后的语音帧长
    Length = length(x);
end
% 最终的语音分帧总帧数
N = Length/M;
%%--------------------------------------------计算声压级-----------------------------------------
s = zeros(1,1:M);
% N帧信号的声压级值存储在spl向量里
spl = zeros(1,N);
for k = 1:N
    % 读取第k帧信号
    s = x((k-1)*M + 1:k*M);
    % 计算第k帧信号的声压级值
    spl(1,k) = SPLCal(s,fs,framlen);
end
%%------------------------------------------------画图--------------------------------------------
t = 1:Length;
SPL = zeros(1,Length);
for r = 1:N
    SPL(1,(r-1)*M+1:r*M) = spl(r);
end
figure(1)
subplot(211)
plot(t/fs,x);
grid on
xlabel('时间(s)');
title('输入语音波形');
subplot(212)
stairs(t/fs,SPL,'r');
grid on
[spl,freq]=iso226(phon);                    %计算声压级

figure(1)
semilogx(freq,spl,':','color','k')
axis([20,20000,-10,130])
title('Phon=50')
xlabel('频率(Hz)')
ylabel('声压级别(dB)')

三、运行结果

在这里插入图片描述

在这里插入图片描述

四、备注

版本:2014a
完整代码或代写加1564658423

这篇关于【语音响度】基于matlab语音声强与响度【含Matlab源码 541期】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!