计算有效声压
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)');
  1. 读取语音文件

    使用 audioread 函数读取 WAV 格式的语音文件,并获取其采样率 fs
  2. 语音分帧

    将语音信号分成若干帧,每帧的长度由 framlen 决定。如果语音长度不是帧长的整数倍,则进行补零或舍弃操作。
  3. 计算声压级

    对每一帧的语音信号计算声压级值,并存储在 spl 向量中。
  4. 绘制图形

    绘制原始语音波形和对应的声压级图形。

计算有效声压-LMLPHP

05-08 08:15