基于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