基于DCT变换和huffman编码的语音压缩算法matlab仿真

1.算法运行效果图预览

 

 

2.算法运行软件版本

matlab2022a

 

3.算法理论概述

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

 

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

 

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

 

4.1 多通道滤波

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

 

 

 

4.3 哈夫曼编码

     huffman编码经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法,用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的。

 

        本系统发送端最后的编码模块,需要将量化后的数据进行压缩,得到二进制比特率进行发送,这里我们使用huffman编码。Huffman编码的基本原理如下所示:哈夫曼编码是用于数据文件压缩的一个十分有效的编码方法,压缩率通常在20%~90%之间。哈夫曼编码算法使用字符在文件中出现的频率表来建立一个0,1串,以表示各个字符的最优表示方式。

 

 

 

4.部分核心程序

%% 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:解码之后播放
sound(reconstruct_sound,Fs);
toc

  

posted @ 2023-09-22 23:51  简简单单做算法  阅读(71)  评论(0编辑  收藏  举报