语音压缩

语音是人类最重要、最有效、最常用和最方便的交换信息的形式,是人们思想疏通和情感交流的最主要途径。在实际的语音通信中,有些信道难以扩宽且质量很差;有些信道正被广泛使用,短期内难以更新;有些昂贵的信道,每压缩一个比特都意味着节省开支。因此,语音压缩编码无疑在语音通信及人类信息交流中占有举足轻重的地位。

随着通信技术的快速发展,语音压缩编码技术得到了快速发展和广泛应用,尤其是最近20年,语音压缩编码技术在移动通信、卫星通信、多媒体技术以及IP电话通信中得到普遍应用,起着举足轻重的作用。语音编码就是将采集得到的数字语音信号作为数字信号传输、存储或处理,然后对数字语音信号进行压缩编码从而减小存储空间。

语音信号能够压缩的基本依据是语音信号中存在的冗余和人类的听觉感知机理。语音信号存在多种多样的冗余,可分别从时间域和频率域描述。语音压缩的第二个依据是人的听觉生理和心理特性对语音的感知,其影响主要表现在:

第一,人的听觉系统对声音具有掩蔽效应(Mask Effect),即一个强的声音能够抑制另一个同时存在相对较弱的声音,利用这一性质可以抑制与信号同时存在的量化噪声。

第二,对不同频段的声音的敏感程度不同。人的听觉对低频端比较敏感,而对高频端不太敏感,这主要是因为浊音的周期和共振峰在这里。

第三,人耳对语音信号的相位变化不敏感。人耳的听觉不像人的视觉对感知的信号相位那样敏感,一定程度的相位失真对听觉来说是可以容忍的。人耳听不到或感知极不灵敏的语音信号都可以认为是冗余,可以利用这些特性进行语音数据压缩。

语音压缩编码的目的是用尽可能低的数码率获得尽可能好的合成语音质量,同时又使要编码过程的计算代价尽可能小。降低数码率的实质就是压缩频带宽度,数码率低意味着算法的复杂度增加,延迟变大。因此研究语音压缩技术具有使用重要的意义。

本系统主要包括以下几个模块:多通道滤波器,DCT变换与反变换,量化与逆量化,哈夫曼编码译码,系统的结构框图如下所示:

图2.1 语音压缩系统的结构框图

本课题,我们将对每个模块进行理论分析,并通过MATLAB进行仿真分析。这里所使用的数字语音信号为现有的wav信号,通过matlab的自带函数wavread读入到MATLAB作为数字信号源,其时域波形图如图2.2所示。

    这里采用的语音信号的采样率为8000hz/s,目的是为了加快系统的仿真速度,整个测试语音信号为20254个采样点。这个音频文件大小占用硬盘资源32768字节。

2.2.1 多通道滤波

多通道滤波器被用来对多个输入数据流进行滤波,在通信、多媒体等领域被广泛使用。多通道的主要优势在于可以在输入数据流(通道)采样率较低的情况下,使用速度很快的运算单元。其基本结构如下所示:

 

图2.3 多通道滤波器基本结构

信号经过分析滤波器组后,变成一个个子带信号,最理想的情况就是各个子带信号没有重叠。但在实际中,是不可能实现这种情况的,各个子带信号相互之间会有不同程度的混叠。接着,综合滤波器组将N个子带信号综合为单一信号。将分成N个子带信号后,每个子带信号的带宽是原来的,因此,信号的速率(采样率)可以降低N倍。这样在实际应用中,为了其后处理系统的处理方便,应当需要在分析滤波器组后面加上一个N倍的抽取器。而在综合滤波器组后,又希望重建后的信号等于原信号。如果各通道采用相同的设计窗,保证中心频率及带宽的选择能覆盖-π到π频率范围(不管滤波器的中心频率和带宽如何分布),那么最终得到的实际复合响应一定是理想的,即具有平坦幅度和线性相位。

本系统,我们将设计一个拥有32个子通道的多通道滤波器组。首先计算各个通道下的滤波器H0,H1,H2,。。。。。H31。然后分别进行滤波。

其滤波输出结果的MATLAB代码如下所示:

data_filter(1,:) =filter(H(1,:),1,sounds);

data_filter(2,:) =filter(H(2,:),1,sounds);

……

data_filter(31,:)=filter(H(31,:),1,sounds);

data_filter(32,:)=filter(H(32,:),1,sounds);

32通道滤波器的频谱特性为:

图2.4 多通道滤波器的波形特性

系统调用的32通道滤波器顶层函数代码如下所示:

区别不同滤波器组的一个重要特征就是通道数、带宽和各个滤波器中心频率之间的间隔。这里N为滤波器的阶数,nbands为子带数。因此,从通道数上可以将滤波器组分为双通道滤波器组和多通道滤波器组;根据带宽可以分为均匀带宽滤波器组和非均匀带宽滤波器组。

由于每个通道的滤波器的特性是不同的,所以其滤波输出的结果也是不同的,图2.5给出了其中几个通道的滤波器的输出仿真图。

2.3.4 逆多通道滤波

    逆多通道滤波器,其计算过程和多通道滤波器相反,其MATLAB代码如下所示:

g0=-wrev(H(1,:));

g1=-wrev(H(2,:));

…………

首先对各个H,取逆。然后作为反滤波器函数G。然后再次分别进行滤波从而得到各个通道下的滤波后的数据,然后将各个通道下的数据相加得到原始的信号。

x_recon=filter(g0,1,datas(1,:))  +filter(g1,1,datas(2,:))  +...

        filter(g2,1,datas(3,:))  +filter(g3,1,datas(4,:))  +...

        filter(g4,1,datas(5,:))  +filter(g5,1,datas(6,:))  +...

        filter(g6,1,datas(7,:))  +filter(g7,1,datas(8,:))  +...

        filter(g8,1,datas(9,:))  +filter(g9,1,datas(10,:)) +...

        filter(g10,1,datas(11,:))+filter(g11,1,datas(12,:))+...

        filter(g12,1,datas(13,:))+filter(g13,1,datas(14,:))+...

        filter(g14,1,datas(15,:))+filter(g15,1,datas(16,:))+...

        filter(g16,1,datas(17,:))+filter(g17,1,datas(18,:))+...

        filter(g18,1,datas(19,:))+filter(g19,1,datas(20,:))+...

        filter(g20,1,datas(21,:))+filter(g21,1,datas(22,:))+...

        filter(g22,1,datas(23,:))+filter(g23,1,datas(24,:))+...   

        filter(g24,1,datas(25,:))+filter(g25,1,datas(26,:))+...

        filter(g26,1,datas(27,:))+filter(g27,1,datas(28,:))+...

        filter(g28,1,datas(29,:))+filter(g29,1,datas(30,:))+...

        filter(g30,1,datas(31,:))+filter(g31,1,datas(32,:)); 

本系统采用的32通道的仿真模式。其滤波器组的仿真结果如下所示:

图2.11 32个子滤波器重构后仿真结果

滤波之后这个就是重构以后的音频信号。

·main.m

clc;

clear;

close all;

warning off;

tic

select = 1;%0为单通道操作,1为多通道操作

%% step1:读取wave文件

resources = 'wav\source.wav';

[x,Fs,nbits] = func_readwav(resources);

save x.mat x

figure;

plot(x);

title('原始的音乐');

grid on;

%% step2:编码

%step2.1:filter bank

%子通道数目,这里暂时设置为4,因为整个系统运行比较缓慢,设置为多通道后,仿真时间

%为原来的N倍,所以这里暂时取N=2,即2通道滤波器组。

N      = 127;

nbands = 32;

data_filter       = func_32_filter(N,nbands,x,select);

%step2.2:DCT

data_DCT          = func_dct(data_filter,select);

figure;

plot(data_DCT(1,:),'r');grid on;title('其中一个通道的DCT变化后的效果仿真');

%step2.3:量化

data_quantization = func_q(data_DCT,select);

%step2.4:huffman 编码

[data_Huffman1 ,data_Huffman2 ,data_Huffman3 ,data_Huffman4,...

 data_Huffman5 ,data_Huffman6 ,data_Huffman7 ,data_Huffman8,...

 data_Huffman9 ,data_Huffman10,data_Huffman11,data_Huffman12,...

 data_Huffman13,data_Huffman14,data_Huffman15,data_Huffman16,...

 data_Huffman17,data_Huffman18,data_Huffman19,data_Huffman20,...

 data_Huffman21,data_Huffman22,data_Huffman23,data_Huffman24,...

 data_Huffman25,data_Huffman26,data_Huffman27,data_Huffman28,...

 data_Huffman29,data_Huffman30,data_Huffman31,data_Huffman32] = func_huffman2(data_quantization,select);

save y.mat data_Huffman1

%% step3:解码

%step3.1 huffman解码

data_unhuffman      = func_invhuffman2(data_Huffman1 ,data_Huffman2 ,data_Huffman3 ,data_Huffman4,...

data_Huffman5 ,data_Huffman6 ,data_Huffman7 ,data_Huffman8,...

data_Huffman9 ,data_Huffman10,data_Huffman11,data_Huffman12,...

data_Huffman13,data_Huffman14,data_Huffman15,data_Huffman16,...

data_Huffman17,data_Huffman18,data_Huffman19,data_Huffman20,...

data_Huffman21,data_Huffman22,data_Huffman23,data_Huffman24,...

data_Huffman25,data_Huffman26,data_Huffman27,data_Huffman28,...

data_Huffman29,data_Huffman30,data_Huffman31,data_Huffman32,...

                                       select);

%step3.2 反量化

data_inquantization = func_unq(data_unhuffman,select);

%step3.3 反DCT

data_IDCT           = func_IDCT(data_inquantization,select);

figure;

plot(data_IDCT(:,1),'r');hold on; grid on;title('其中一个通道IDCT后的效果');

%step3.4 反滤波器

reconstruct_sound   = func_inv32_filter(data_IDCT',select);

figure;

plot(reconstruct_sound,'r');

title('重构后的音乐');

grid on;

%% step4:解码之后播放

wavwrite(reconstruct_sound,Fs,nbits,'wav\source2.wav')

sound(reconstruct_sound,Fs,nbits);

toc

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/108850495
今日推荐