基于ACF,AMDF算法的语音编码matlab仿真

1.算法运行效果图预览

 

 

 

2.算法运行软件版本

matlab2022a

 

3.算法理论概述

       语音编码是一种将连续的语音信号转换为数字数据的过程,以便在数字通信和存储应用中使用。基于ACF和AMDF的编码算法是一种经典的方法,它在语音信号处理领域得到了广泛应用。

 

基于ACF和AMDF的语音编码过程包括以下步骤:

 

预处理:对原始语音信号进行预加重、分帧、窗函数等处理,以提取有用的特征。

计算ACF和AMDF:计算每一帧的ACF和AMDF函数,以便估计基频的候选周期。

基频估计:通过在AMDF函数中寻找最小值,确定基频的候选周期。

量化:将基频的候选周期量化为离散值,以便编码和传输。

编码:使用合适的编码方法(如霍夫曼编码)对量化后的数据进行编码,以减小数据的传输带宽。

 

基于ACF和AMDF的语音编码方法在以下领域得到应用:

电话通信:在语音通话中,使用这些方法进行语音信号的压缩和传输。

语音存储:将语音信号转换为数字数据,以便在设备中进行存储。

语音识别:用于基频估计,有助于识别语音中的音素和音节。

语音合成:用于合成自然的语音声音。

 

 

       基于ACF和AMDF的语音编码方法利用了自相关性和平均差分来估计语音信号中的基频信息。这些方法在语音处理中有着重要的应用,为语音通信、存储和分析提供了有效的解决方案。

 

 

4.部分核心程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
plotFlag        = 0; %绘图标识位
istrain         = 0;
%1.预处理,滤波
%1.预处理,滤波
  
%2.预加重
%2.预加重
  
%3.清、浊音判决的分析及量化
%低带能量:通过一个截止频率为900Hz 阻带为10dB的低通滤波器
Wp   = 900/4000;
[b,a]= cheby2(6,10,Wp,'low');
yLF  = filter(b,a,yPre);
plot3;
  
%成帧
[yFrame,nF]    = func_enFrame(yLF);
  
%短时能量来区分清/浊音
VoiceSoundFlag = func_short_energy(yFrame,nF);
  
%二阶逆滤波(白化滤波)
yFrame         = inverseFilter(yFrame,nF);
  
%获得基音周期(AMDF)
pitchT         = func_GetPitch(yFrame,VoiceSoundFlag,nF);
  
%计算增益(RMS)
RMS            = func_RMS(yFrame,VoiceSoundFlag,pitchT,nF);
  
%LPC预测阶数
[Vlpc,Vlsf]    = func_LPC_Order(yFrame,nF);
  
%矢量量化采用王炳锡书5.8章红圈的方法,并组帧
%训练,得到码本,这里需要大量的语音库,这里仅仅提供算法流程,训练库使用少量样本
if istrain == 1
   tops;
   load Train\code_save.mat
else
   load Train\code_save.mat
end
  
figure;
K1 = 1;
K2 = 2;
plot(lsf{1}(K1,:), lsf{1}(K2,:), 'xr');
hold on;
plot(code{1}(K1,:),code{1}(K2,:), 'vk');
hold on;
plot(lsf{2}(K1,:), lsf{2}(K2,:),  'xb');
hold on;
plot(code{2}(K1,:),code{2}(K2,:), '+k');
hold on;
  
xlabel('2th Dimension');
ylabel('6th Dimension');
legend('Speaker 1', 'Codebook 1', 'Speaker 2', 'Codebook 2');
title('2D plot of accoustic vectors');
  
%VQ发送
Frame = func_vq_trans(Vlsf,pitchT,RMS,VoiceSoundFlag,nF,code);
  
%计算压缩对比
Rate = func_size_cal(yOri,Frame);
  
  
%接收,矢量解码器
[Vlsf3,VQ_decode,lsf_code,VoiceSoundFlag3,RMS3,pitchT3] = func_vq_rec(Frame,nF,code);
  
%解码
yCom = func_decode(Vlsf3,VoiceSoundFlag3,pitchT3,RMS3,nF);
  
%去加重
b    = 1;
a    = [1 -0.9375];
yCom = filter(b,a,yCom);
sound(yCom,Fs);
  
  
figure;
subplot(311);
plot(yOri);
  
subplot(312);
plot(pitchT);
  
subplot(313);
plot(yCom);

  

posted @   简简单单做算法  阅读(91)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示