- 计算有效声压
- 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 向量中。绘制图形:
绘制原始语音波形和对应的声压级图形。