语音信号的A律压缩和u律压缩matlab仿真

219 阅读4分钟

1.算法运行效果图预览

 

1.jpeg

2.jpeg

3.jpeg

4.jpeg

 

2.算法运行软件版本

MATLAB2022a

 

3.算法理论概述

       语音信号的量化过程是将采样后的信号按整个声波的幅度划分成有限个区段的集合,把落入某个区段内的样值归为一类,并赋于相同的量化值。采取二进制的方式,以8位或16位的方式来划分纵轴。也就是说在一个以8位为记录模式的音效中,其纵轴将会被划分为个量化等级,用以记录其幅度大小。采样原理的示意图如图所示:

b920fce3a9525da63e8c853a132a6eaf_82780907_202310122343560128852652_Expires=1697126036&Signature=9k3ujQ67SgBoe3IwaV02WU5pt30%3D&domain=8.png  

       非均匀量化,用数字值表示采样后的信号幅度值的过程即为量化,量化后信号就变成了数字信号。量化可以分为均匀量化和非均匀量化两种。量化过程会产生量化误差。而量化误差在接收端的表现形式即为量化噪声。非均匀量化根据幅度的不同区间来确定量化间隔,幅度小的区间量化间隔小,幅度大的区间量化间隔大,故可以有效改善小型号的量噪比。A律压缩和μ律压缩是一种常见的语音信号压缩技术,用于在数字通信中对语音信号进行编码。这些算法可以有效地减少数据传输所需的比特数,同时保持足够的音频质量。本文将详细介绍A律压缩和μ律压缩算法的原理、实现以及应用领域。

 

3.1 A律压缩算法

        A律压缩是一种非线性压缩算法,常用于8位PCM(脉冲编码调制)语音信号的压缩。其原理是通过对输入信号的幅度进行非线性映射,以便在更小的比特数上表示信号。A律压缩使用以下数学公式:

436dbaf072be0e79803a2e9bc5ff2c0e_82780907_202310122344060941582014_Expires=1697126046&Signature=3mR%2FQbPu8AbA%2BJBpTWGpjfLCJTE%3D&domain=8.png  

       其中x表示为归一化的压缩器输入电压;y为归一化的压缩器输出电压,A为压扩参数,表示压缩程度。很明显,小信号时为线性特性,大信号时近似为对数特性。这种压扩特性常把压缩、量化和编码合为一体。A律可用13段折线逼近(相当于A=87.6),便于用数字电路实现。

 

       A律13折线特性曲线如下所示:

8ff536ed942dc17408d6a2dc3c4190d1_82780907_202310122345110769315217_Expires=1697126111&Signature=Q0pa4QeI81Xxb%2FnblNkXfCy8aTA%3D&domain=8.png  

3.2 μ律压缩算法

       μ律压缩是一种类似于A律压缩的非线性压缩算法,通常在欧洲和亚洲地区使用。μ律压缩同样通过非线性映射来减小输入信号的幅度范围,从而降低所需的比特数。μ律压缩使用以下数学公式:

 

b9a12b5027085d8d5fce96319ddc6a07_82780907_202310122346010581248957_Expires=1697126161&Signature=2%2FExPg2fLAo8Q8HWM9pkv8A2JGM%3D&domain=8.png

 

       μ律压缩在欧洲和亚洲的语音通信系统中广泛应用。类似于A律压缩,它可以有效地降低传输带宽,并保持合理的语音质量。μ律(m-Law)压扩主要用在北美和日本等地区的数字电话通信中。m为确定压缩量的参数,它反映最大量化间隔和最小量化间隔之比,通常取100≤m≤500。

 

        A律压缩和μ律压缩算法是在数字通信中常用的语音信号压缩技术。通过非线性映射,它们可以有效地减小数据传输所需的比特数,同时保持合理的语音质量。选择适当的算法取决于地区和特定应用的要求。

 

 

 

4.部分核心程序 `clc;

clear;

close all;

warning off;

addpath(genpath(pwd));

rng('default')

 

[y, fs] = audioread('signal.wav');

 

%=======A律编解码===================================

figure(1);

subplot(311),plot(y);

title('语音信号');

code2=alaw(y);

subplot(312),plot(code2);

title('A律编码语音信号');

u_code2=unalaw(code2);

subplot(313),plot(u_code2);

title('A律解码语音信号');

error2=u_code2-y;

figure(2);

plot(error2);

title('A律编解码误差');

 

%=======U律编解码===================================

figure(3);

subplot(311),plot(y);

title('语音信号');

code3=mulaw(y);

subplot(312),plot(code3);

title('U律编码语音信号');

u_code3=unmulaw(code3);

subplot(313),plot(u_code3);

title('U律解码语音信号');

error3=u_code3-y;

figure(4);

plot(error3);

title('U律编解码误差');`