【语音响度】基于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
标签:响度,声强,Length,fs,spl,声压级,语音,补零 来源: https://www.cnblogs.com/homeofmatlab/p/14941823.html