语音信号预处理(一)
对输入的数字声音信号进行预加重,其目的是为了对声音的高频部分进行加重,去除口唇辐射的影响,增加声音的高频分辨率。一般通过一阶FIR高通数字滤波器来实现预加重,其公式为:
H(z)=1-az^(-1) 0.9≤a≤1.0 (2-1)
其中a为预加重系数,这里a值取0.98。这样,预加重网络的输出(S(n)) ̅和输入声音信号S(n)的关系可用一个差分方程表示[8]:
(S(n)) ̅=S(n)-aS(n-1) (2-2)
图2-2中分别给出了预加重前和预加重后的一段浊音信号,可以看出,预加重后的频谱在高频部分的幅度得到了提升。
``
[x,sr]=audioread('0.wav'); %sr为采样频率,单声道
ee=x(1500:1755);
r=fft(ee,1024);
r1=abs(r);
pinlv=(0:1:255)*8000/512;
yuanlai=20*log10(r1);
signal(1:256)=yuanlai(1:256);
[h1,f1]=freqz([1,-0.98],[1],256,4000);
pha=angle(h1);
H1=abs(h1);
r2(1:256)=r(1:256);
u=r2.*h1';
u2=abs(u);
u3=20*log10(u2);
un=filter([1,-0.98],[1],ee);
figure(1);subplot(2,1,1);
plot(f1,H1);title('高通滤波器的幅频特性');
xlabel('频率/Hz');ylabel('幅度');
subplot(2,1,2);plot(pha);title('高通滤波器的相频特性');
xlabel('频率/Hz');ylabel('角度/rad');
figure(2);subplot(2,1,1);plot(ee);title('原始语音信号');
%axis([0 256 -3*10^4 2*10^4]);
xlabel('样点数');ylabel('幅度');
subplot(2,1,2);plot(un);title('经高通滤波后的语音信号');
%axis([0 256 -1*10^4 1*10^4]);
xlabel('样点数');ylabel('幅度');
figure(3);subplot(2,1,1);plot(pinlv,signal);title('原始语音信号频谱');
xlabel('频率/Hz');ylabel('幅度/dB');
subplot(2,1,2);plot(pinlv,u3);title('经高通滤波后的语音信号频谱');
xlabel('频率/Hz');ylabel('幅度/dB');
% 预加重功能测试
clc
close all
[filename,pathname]=...
uigetfile({'*.wav';'*.bmp';'*.gif'},'choose');
str=[pathname filename];
[s,fs] = audioread(str);%读取
e=s(2000:2225); %提取一段进行分析,容易看出变化
un=filter([1,-0.95],1,e); %预加重信号b=[1,-0.95];
%原始信号频谱
N=512;
pinlv=(0:1:N/2-1)*fs/N;
x=fft(e,N);
r1=abs(x);
t1=20*log10(r1);
signal=t1(1:N/2);
%预加重信号频谱
[h1,w1]=freqz([1,-0.95],1,256,fs);
pha=angle(h1);
H1=abs(h1);
r2=r1(1:N/2);
u=r2.*h1;
u2=abs(u);
signalPre=20*log10(u2);
figure(3);
subplot(211)
plot(e,'b*-')
ylim([-0.05,0.05])
hold on
plot(real(un),'ro-')
ylim([-0.5,0.5])
legend('原始语音信号','预加重后的语音信号')
title('原始语音信号和预加重后的语音信号');
xlabel('采样点');ylabel('幅度');
subplot(212);
plot(pinlv,signal,'g+-')
hold on
plot(pinlv,signalPre,'ro-')
legend('原始语音信号频谱','预加重后的语音信号频谱')
title('预加重前后的语音信号频谱');
xlabel('频率');ylabel('幅度/dB');