计算有效声压
clear all;
%%----------------------------------------------读取文件------------------------------------------
% 从wav文件读入语音数据,该语音采样率16k,故信号最高频率8k。
[x,fs]=audioread('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,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
xlabel('时间(s)');
ylabel('声压级(dB)');
title('语音信号的声压级(dB)');
-
读取语音文件:
使用audioread
函数读取 WAV 格式的语音文件,并获取其采样率fs
。 -
语音分帧:
将语音信号分成若干帧,每帧的长度由framlen
决定。如果语音长度不是帧长的整数倍,则进行补零或舍弃操作。 -
计算声压级:
对每一帧的语音信号计算声压级值,并存储在spl
向量中。 -
绘制图形:
绘制原始语音波形和对应的声压级图形。