基于MATLAB的简单语音系统处理
摘要:语音数据的有效编码可以提高通信系统的有效性,大大减少存储设备的容量。子带编码是一种常用语音编码技术,子带编码中的子带分解和合成是子带编码中的重要组成部分。本文提出了使用非对称滤波器组实现语音信号的子带分解和合并,常用的平行结构滤波器虽然也可以实现自带的分解,实现对高频成分的压缩,但不如树形结构灵活,树形结构QMFB可以实现多分辨率的信号分解与压缩,同时重建信号失真度很低。
一. 设计方案
一个语音处理系统主要包括语音信号的采集,预处理,语音信号的压缩编码,语音信号的解码,语音信号的增强,最后通过音频输出设备输出。为了能够使采集到的语音信号能够完全恢复出来,一般信号的采样频率都是很高的,例如44100HZ,但是人耳能够识别的声音信号的频率范围在300~3400HZ,高于3400HZ的频率基本对人耳无效,因此可以滤除不予编码,同时在300~3400的频率段也有部分频率段占用很少一部分能量,可以子带分解后用较短的码长编码,以此来降低码率,而对低频部分可以通过抽取,来减少传输和处理的数据量。在接收端可以通过插值恢复出低频信号。
本系统主要实现的关键步骤是针对语音信号的频谱设计与之相适应的树形滤波器组,在信源段首先对音频信号进行预处理滤除多余的频段,然后就是设计信源端得分析滤波器组和信宿段综合滤波器组的设计。
分析滤波器组的设计:将信号经过2通道正交镜像滤波器组和2-抽取器,完成信号的第一次高低分频和抽取,然后将分解出来的低频信号再次通过2通道正交镜像滤波器组和2-抽取器,实现对第一次分解出来的低频信号的高低分频和抽取,这次分解出来的次低频成分就是音频信号的需要传输或者处理的有用信号,然后对分解出来的有用信号的高低频信号分别进行等分辨率的3级抽样的8通道分解,分解出16通道音频信号,这样信宿段的子带分解滤波器组就完成了,将音频信号分解成18通道信号,接下来就可以进行编码,存储或传输等一系列处理。
综合滤波器组的设计:综合滤波器组是分析滤波器组的逆过程,对解码出来的18通道信号中的16通道低频信号经过3级由2-内插器和高通滤波器或者低通滤波器组成的16通道综合滤波器,就将这16通道信号综合成一路低频信号,然后将这一路信号2-内插和低通滤波,然后将次高频信号经过2-内插和高通滤波器,将这两路信号相加合并为一路信号,然后将这一路信号再次通过2-内插和低通滤波器,再将最高频信号进行2-内插和高通滤波器,将这两路信号相加就合成了原来音频信号,这样音频信号就可以送到音频设备.
二.设计原理
1、抽取和内插的基本原理
信号的M-抽取是对原始信号每隔M-1个点取一个点,组成新的采样序列。抽取后的信号频谱发生了变化,输入信号x(n)与M—抽取后的输出信号y(n)在频域上的关系式如下:
Y(ejw)=
从上式可以知道,Y(ejw)是将X(ejw)扩展了M倍,幅度变为原来的1/M,在分别以2pi、4pi、6pi,···,2kpi移位叠加得到的;抽取后可能造成频谱混叠,为了避免抽取后的频谱混叠,信号X(n)的带宽必须限制在【-pi/M,pi/M】。通常情况下可以再抽取器前进行抗混叠滤波,所谓的抗混叠滤波就是在抽取前对信号进行低通滤波,把信号的频带限制在【-pi/M,pi/M】。
信号的内插是信号抽取的逆过程,是在已知信号相邻抽样点之间插入若干个抽样值的点。实际中的做法是在已知抽样序列之间插入若干零值,然后通过低通滤波器,几个实现内插。其实就相当于线性插值。L-内插输入信号x(n)与输出信号的频域关系式:
Y(ejw)=X(ejwL)
从上式我们知道,对信号的L-内插相当于对输入信号频谱的L倍压缩,内插后信号的采样周期变为原来的1/L倍。内插不会造成频谱混叠,不会造成信号信息量的丢失,但会使整个数字信号频率轴插入L-1个原始信号的频谱,称为镜像。因此在插值后我们可以通过一个低通滤波器,来消除内插带来的镜像,恢复出原始信号。
2、滤波器组的基本原理
滤波器组是一组拥有共同输入信号或共同输出信号的一组带通滤波器。(系统框图如下)
M通道滤波器组的系统结构
H0(z) |
H1(z) |
Hm-1(z) |
抽取M |
抽取M |
抽取M |
内插M |
内插M |
内插M |
G0(z) |
G1(z) |
Gm-1(z) |
信号的子带分解是通过树形结构滤波器组来实现。本系统中有一个分析滤波器组实现对输入信号的子带分解,一个综合滤波器组完成信号的重建。一个给定的信号经过分解滤波器组分解,然后编码、传输再通过综合滤波器组实现信号的恢复和重建。但是恢复和重建后的信号并不能与原始信号完全相同,两者之间会产生一定的误差,主要包括:
(1)混叠失真:由抽取和内插产生的混叠和镜像带来的误差所造成的。
(2)幅度失真:由滤波器组幅频特性波纹产生的误差所造成的。
(3)相位失真:由滤波器组的相频特性的非线性产生的误差所造成的。
(4)子带量化误差:由编解码产生的误差,与量化噪声相似。这是一种无法完全消除的误差。
完全重建滤波器组:无混叠失真的滤波器组,同时既无幅度失真,又无相位失真。
本系统所设计的树形结构滤波器组,是由两通道的正交镜像滤波器组通过级联或并联组建而成的。
3.正交镜像滤波器组
两通道正交镜像滤波器组的系统框图如下
X(ejw) |
↑2 |
↓2 |
G0(ejw) |
G1(ejw) |
↑2 |
↓2 |
H0(ejw) |
H1(ejw) |
Y(ejw) |
上图中可以设
H0(z)=H(z) (1.1)
H1(z)=H(-z) (1.2)
G0(z)=H(z) (1.3)
G1(z) =-H(-z) (1.4)
上式说明如果H(z)是低通滤波器,那么H1(在)则是高通滤波器。同时H0(ejw)与H1(ejw)关于pi/2成镜像对称,所以称这种滤波器成为正交镜像滤波器组,简称QMFB。满足1.1式~1.4式的滤波器组称为标准QMF滤波器组,它是一种无混叠失真的滤波器组。
树形结构的滤波器组:将两通道滤波器组的级联来实现多通道滤波器组。具体做法就是将各通道的输出作为下一个滤波器组的输入。这种实现方式的优点是:可根据两通道滤波器组的特性来推断它的特性(是否能够完全重建等),通过非对称来实现多抽样率的子带分割。
两通道QMFB非对称的分析滤波器框图
X(ejw) |
H0(ejw) |
H1(ejw) |
↓2 |
↓2 |
↓2 |
↓2 |
H0(ejw) |
H1(ejw) |
H0(ejw) |
H1(ejw) |
二. 设计框图
读取音频文件 |
预滤波(300~3400) |
18通道综合滤波器组 |
1通道 |
2通道 |
17通道 |
18通道 |
。。。。。。。。 低频-------》高频 |
中间过程(编码、信道、解码) |
保存为音频文件 |
18通道分解滤波器组 |
三. 设计程序
主程序
clear all ;
N=4096*256 ;%采集点数
LEN=N/8 ;
w=[400,800,1200,1600,2000,2400,2800,3200] ;
[y,fs,bits]=wavread('1.wav',[20000,20000+N-1]); %读取音频信息(双声道,16位,频率44100Hz)
Fs=fs ;
%仅处理1通道信号
y1=y(:,1) ;%the signal of channel one
%y2=y(:,2) ;%the signal of channel two
t=0:1/fs:(N-1)/fs;%time
figure(1) ;
subplot(2,1,1) ;
plot(t,y1) ;%1通道信号
title('原始信号') ;
%语音信号预处理人耳可识别范围(300~3400),因此多于此频率的信号可以滤掉而不用传输
y1_yu=pre_process(y1) ;
subplot(2,1,2) ;
plot(t,y1_yu) ;%滤波后的信号时域波形
title('预滤波后的信号') ;
figure(2) ;
subplot(2,1,1) ;
pinpu(y1,fs) ;
title('未滤波信号频谱') ;
axis([0,44100,0,300])
subplot(2,1,2) ;
pinpu(y1_yu,fs) ;
title('滤波后信号频谱') ;
axis([0,44100,0,300])
%2通道分解
[f1 f2]=fenjie(y1_yu) ;%1次分解
figure(3) ;
subplot(2,1,1) ;
g1=interp(f1,2) ;
pinpu(g1,fs)
title('1次分解的低频成分') ;
subplot(2,1,2) ;
g2=interp1(f2) ;
title('1次分解后的高频成分') ;
pinpu(g2,fs) ;
[f1_1,f1_2]=fenjie(f1) ;%2次分解
[f1_1_1,f1_1_2]=fenjie(f1_1) ;%3次分解
[y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2]=fenjie8(f1_1_1) ;%等分辨率分解8
[x1_1_1,x1_1_2,x1_2_1,x1_2_2,x2_1_1,x2_1_2,x2_2_1,x2_2_2]=fenjie8(f1_1_2) ;%等分辨率分解8
%信号的合成
f1_1_1=hebing8(y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2) ;%低频信号8通道合成
f1_1_2=hebing8(x1_1_1,x1_1_2,x1_2_1,x1_2_2,x2_1_1,x2_1_2,x2_2_1,x2_2_2) ;%高频信号8通道合成
f1_1=hebing(f1_1_1,f1_1_2) ;%3次合并
f1=hebing(f1_1,f1_2) ;%2次合并
figure(8) ;
subplot(2,1,1) ;
plot(y1_yu) ;
title('预滤波后的信号') ;
y=hebing(f1,f2) ;%1次合并
subplot(2,1,2) ;
plot(y) ;%合成后的信号
title('信宿端恢复信号') ;
%将处理后的信号写入文件
wavwrite(y1,fs,'2.wav') ;
树形结构分解子程序(完成信号的2通道分解以及降采样率)
function [y1,y2]=fenjie(x,n1,n2,fp)
fs=44100
t2=0:1/fs:(length(x)-1)/fs ;
% a1=[1 1];
% b1=[1];
% a2=[1 -1];
% b2=[1];
a1=fir1(100,1/2);
%a2=fir1(200,1/2,'high') ;
a2=qmf(a1) ;
% w1=0.707*filter(a1,1,x); %低通滤波
% w2=0.707*filter(a2,1,x); %高通滤波
w1=filter(a1,1,x); %低通滤波
w2=filter(a2,1,x); %高通滤波
%抽取
y1=downsample(w1,2); %抽取2
y2=downsample(w2,2); %抽取2
树形结构综合子程序(完成2通道信号的综合)
function y=hebing(y1,y2,n1,n2)
%信号的零插值和低通滤波
y1=interp(y1,2) ;
%信号的零插值和高通滤波
y2=interp1(y2) ;
%进行插值后的信号可能长度不一样,因此要进行长信号的截取
n=min(length(y1),length(y2)) ;
y1=y1(1:n) ;
y2=y2(1:n) ;
%信号的合并
y=y1+y2 ;
信号插值子程序(完成信号的零插值和高通滤波)
function f=interp1(x)
%实现信号的零插值
f=interp(x,2) ;
for i=1:length(x)
f(2*i)=0 ;
end
%设计高通滤波器
a1=fir1(200,1/2,'high');
%完成对信号的高通滤波
f=filter(a1,1,f);
信号的8通道的分解子程序()
function [f1 f2 f3 f4 f5 f6 f7 f8]=fenjie8(x)
%信号的两通道1次分解
[y1,y2]=fenjie(x,1,10) ;
%对1次分解后的信号进行再分解,得到信号的2次分解信号
[y1_1,y1_2]=fenjie(y1,1,10) ;
%对2次分解的信号进行在分解,从而完成3级8通道的信号分解
[f1,f2]=fenjie(y1_1,1,10) ;
[f3,f4]=fenjie(y1_2,1,10) ;
[y2_1,y2_2]=fenjie(y2,1,10) ;
[f5,f6]=fenjie(y2_1,1,10) ;
[f7,f8]=fenjie(y2_2,1,10) ;
function f=hebing8(y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2)
%信号的3次合并
y1_1=hebing(y1_1_1,y1_1_2,1,10) ;
y1_2=hebing(y1_2_1,y1_2_2,1,10) ;
y2_1=hebing(y2_1_1,y2_1_2,1,10) ;
y2_2=hebing(y2_2_1,y2_2_2,1,10) ;
%信号的2次合并
y1=hebing(y1_1,y1_2,1,10) ;
y2=hebing(y2_1,y2_2,1,10) ;
%信号的1次合并
f=hebing(y1,y2,1,10) ;
四. 设计结果图
原始信号和预滤波后信号的时域波形对比(图一)
原始信号和预滤波后的信号的频域对比(图二)
三次分解后高频信号和低频信号的频谱(图三)
子带分解后的16通道时域波形(图四)
16通道综合后的高频信号和低频信号频谱(图六)
原始信号与信宿端恢复出来的信号的时域对比(图七)
原始信号与信宿端恢复出来的信号的频域对比(图八)
五. 设计分析
本系统首先对输入的信号进行预滤波,滤除频段(300~3400)以外的信号,本系统设计了一个200阶的FIR带通滤波器,从图二看出,本系统设计的预滤波器完全满足系统的滤波要求,滤除了低于300HZ和高于3400HZ的频率分量,同时也没有带来相位失真。
然后将预滤波后的信号进行3级非对称分解,得到低频信号和高频信号,从图三可以看出进行三级分解后的低频信号和高频信号均扩展到整个数字频率轴,且高频信号的能量已经占到很大比重,此时已经把有用信号的频率分量已经分离出来,可以对这部分信号进行等抽样率的3级分解,分解出16个子带(如图四)。
从图四可以看出,16通道信号能量由低频到高频,呈现由高到低完全符合声音信号的能量分布,分解效果很好。
在接受端进行信号的综合,从图六可以看出综合后的高频信号频谱和低频信号频谱,通过与图四对比可以看出,信源端分解前的信号频谱,分解后再综合信号的频谱相似度很高,符合设计的要求。
图七和图八分别是重建后信号与原始信号的时域对比图和频域对比图,从这两幅图上可以看出,恢复出来的信号与原始信号仅在能量上存在一定的线性失真,可以通过放大器予以恢复和重建。
最后将恢复出来的信号写入文件,在播放器上进行播放,与原始信号相比,听不出来差别,本系统完全满足设计要求。
六. 设计心得
通过本次课程设计,收获颇多:
主程序
clear all ;
N=4096*256 ;%采集点数
LEN=N/8 ;
w=[400,800,1200,1600,2000,2400,2800,3200] ;
[y,fs,bits]=wavread('1.wav',[20000,20000+N-1]); %读取音频信息(双声道,16位,频率44100Hz)
Fs=fs ;
%仅处理1通道信号
y1=y(:,1) ;%the signal of channel one
%y2=y(:,2) ;%the signal of channel two
t=0:1/fs:(N-1)/fs;%time
figure(1) ;
subplot(2,1,1) ;
plot(t,y1) ;%1通道信号
title('原始信号') ;
%语音信号预处理人耳可识别范围(300~3400),因此多于此频率的信号可以滤掉而不用传输
y1_yu=pre_process(y1) ;
subplot(2,1,2) ;
plot(t,y1_yu) ;%滤波后的信号时域波形
title('预滤波后的信号') ;
figure(2) ;
subplot(2,1,1) ;
pinpu(y1,fs) ;
title('未滤波信号频谱') ;
axis([0,44100,0,300])
subplot(2,1,2) ;
pinpu(y1_yu,fs) ;
title('滤波后信号频谱') ;
axis([0,44100,0,300])
%2通道分解
[f1 f2]=fenjie(y1_yu) ;%1次分解
figure(3) ;
subplot(2,1,1) ;
g1=interp(f1,2) ;
pinpu(g1,fs)
title('1次分解的低频成分') ;
subplot(2,1,2) ;
g2=interp1(f2) ;
title('1次分解后的高频成分') ;
pinpu(g2,fs) ;
[f1_1,f1_2]=fenjie(f1) ;%2次分解
[f1_1_1,f1_1_2]=fenjie(f1_1) ;%3次分解
[y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2]=fenjie8(f1_1_1) ;%等分辨率分解8
[x1_1_1,x1_1_2,x1_2_1,x1_2_2,x2_1_1,x2_1_2,x2_2_1,x2_2_2]=fenjie8(f1_1_2) ;%等分辨率分解8
%信号的合成
f1_1_1=hebing8(y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2) ;%低频信号8通道合成
f1_1_2=hebing8(x1_1_1,x1_1_2,x1_2_1,x1_2_2,x2_1_1,x2_1_2,x2_2_1,x2_2_2) ;%高频信号8通道合成
f1_1=hebing(f1_1_1,f1_1_2) ;%3次合并
f1=hebing(f1_1,f1_2) ;%2次合并
figure(8) ;
subplot(2,1,1) ;
plot(y1_yu) ;
title('预滤波后的信号') ;
y=hebing(f1,f2) ;%1次合并
subplot(2,1,2) ;
plot(y) ;%合成后的信号
title('信宿端恢复信号') ;
%将处理后的信号写入文件
wavwrite(y1,fs,'2.wav') ;
树形结构分解子程序(完成信号的2通道分解以及降采样率)
function [y1,y2]=fenjie(x,n1,n2,fp)
fs=44100
t2=0:1/fs:(length(x)-1)/fs ;
% a1=[1 1];
% b1=[1];
% a2=[1 -1];
% b2=[1];
a1=fir1(100,1/2);
%a2=fir1(200,1/2,'high') ;
a2=qmf(a1) ;
% w1=0.707*filter(a1,1,x); %低通滤波
% w2=0.707*filter(a2,1,x); %高通滤波
w1=filter(a1,1,x); %低通滤波
w2=filter(a2,1,x); %高通滤波
%抽取
y1=downsample(w1,2); %抽取2
y2=downsample(w2,2); %抽取2
树形结构综合子程序(完成2通道信号的综合)
function y=hebing(y1,y2,n1,n2)
%信号的零插值和低通滤波
y1=interp(y1,2) ;
%信号的零插值和高通滤波
y2=interp1(y2) ;
%进行插值后的信号可能长度不一样,因此要进行长信号的截取
n=min(length(y1),length(y2)) ;
y1=y1(1:n) ;
y2=y2(1:n) ;
%信号的合并
y=y1+y2 ;
信号插值子程序(完成信号的零插值和高通滤波)
function f=interp1(x)
%实现信号的零插值
f=interp(x,2) ;
for i=1:length(x)
f(2*i)=0 ;
end
%设计高通滤波器
a1=fir1(200,1/2,'high');
%完成对信号的高通滤波
f=filter(a1,1,f);
信号的8通道的分解子程序()
function [f1 f2 f3 f4 f5 f6 f7 f8]=fenjie8(x)
%信号的两通道1次分解
[y1,y2]=fenjie(x,1,10) ;
%对1次分解后的信号进行再分解,得到信号的2次分解信号
[y1_1,y1_2]=fenjie(y1,1,10) ;
%对2次分解的信号进行在分解,从而完成3级8通道的信号分解
[f1,f2]=fenjie(y1_1,1,10) ;
[f3,f4]=fenjie(y1_2,1,10) ;
[y2_1,y2_2]=fenjie(y2,1,10) ;
[f5,f6]=fenjie(y2_1,1,10) ;
[f7,f8]=fenjie(y2_2,1,10) ;
function f=hebing8(y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2)
%信号的3次合并
y1_1=hebing(y1_1_1,y1_1_2,1,10) ;
y1_2=hebing(y1_2_1,y1_2_2,1,10) ;
y2_1=hebing(y2_1_1,y2_1_2,1,10) ;
y2_2=hebing(y2_2_1,y2_2_2,1,10) ;
%信号的2次合并
y1=hebing(y1_1,y1_2,1,10) ;
y2=hebing(y2_1,y2_2,1,10) ;
%信号的1次合并
f=hebing(y1,y2,1,10) ;