matlab实现A律十三折编码解码(附完整代码)

原理介绍

代码内容

代码主要通过matlab,首先加载一段本地wav音频(语音)文件,对其进行8k频率的重采样,对重采样后的样本数据进行A律十三折编码,再对编码后的数据进行解码,将解码后的语音数据写入一个新的wav文件并保存。新的音频(语音)文件与原文件声音一致。下面是各部分代码。

声明:文章中所用A律编码以及解码函数参考自该博客:【通信原理实验】基于A律13折线的PCM编码与解码,侵删

代码详情

  • 按顺序输入编辑器即可运行。
  • 注意:需要修改文件路径和文件名为自己的

1)读取本地文件

%% 读取本地wav文件
filePath='安卓电话铃声.wav';
[y,Fs]=audioread(filePath);
y=y';           % 转置
yCh1=y(1,:);    % 取一个声道

2)对该文件进行重采样以及a律十三折编码

sampleVal=8000; %8k抽样率
% a13_moddata是编码后的数据
[sampleData,a13_moddata]=PCM_13Encode(yCh1,Fs,sampleVal);
% 保存编码数据,可自选需不需要
save('encode_data01.mat','a13_moddata');
whos sampleData %查看重采样后的数据格式,长度

3)a律十三折解码

% outdata为解码完成的数据
[outData] = PCM_13Decode( a13_moddata );
whos outData

4)将解码数据写入音频文件

writeData=[outData;outData]';%复制声道1数据到声道2,并转置
writeFilePath='decode_data06.wav';
audiowrite(writeFilePath,writeData,sampleVal); 

5)采样函数主体

function [sampleData,a13_moddata] = PCM_13Encode(inputData,Fs,sampleVal)
%要将采样率从Fs更改为8kHz,需要确定一个有理数(整数之比)P/Q,使得 P/Q 与原始采样率之积在某个指定容差内等于8k。
%要确定这些因子,使用rat。输入新采样率8000与原始采样率Fs之比
[P,Q]=rat(8000/Fs);
%将使用 rat 求得的分子和分母因子作为 resample 的输入,输出以8kHz 采样的波形。
sampleData = resample(inputData,P,Q);
MaxS = max(abs(sampleData));
sampleData = sampleData/MaxS;
[ a13_moddata ] = a_13coding( sampleData );
end

6)A 律编码主体

function  [ a13_moddata ] = a_13coding( x )
whos x
disp("x")
disp(x(100000:100040))
n=length(x);
disp(n)
a13_moddata=zeros(1,n*8);
for bb=1:n
    Is=x(1,bb);
    if Is>1||Is<-1,error('input must within [-1,1]'),end
    Is=round(Is*2048);
    C=zeros(1,8);  %将8位PCM编码初始化为全0
    if Is>0
        C(1)=1 ;  %判断抽样值的正负
    end
    
    % the polarity determins C(1)
    abIs=abs(Is);
    
    if 0<abIs && abIs<=16
        C(2:4)=[0 0 0];    %8级量化编码
        q=1;
        a=0;
        C(5:8)=e_coding(abIs,q,a); %16级量化编码
    end
     if 16<abIs && abIs<=32
        C(2:4)=[0 0 1];
        q=1;
        a=16;
        C(5:8)=e_coding(abIs,q,a);
    end
    if 32<abIs && abIs<=64
        C(2:4)=[0 1 0];
        q=2;
        a=32;
        C(5:8)=e_coding(abIs,q,a);
    end
    if 64<abIs && abIs<=128
        C(2:4)=[0 1 1];
        q=4;
        a=64;
        C(5:8)=e_coding(abIs,q,a);
    end
    if 128<abIs && abIs<=256
        C(2:4)=[1 0 0];
        q=8;
        a=128;
        C(5:8)=e_coding(abIs,q,a);
    end
    if 256<abIs && abIs<=512
        C(2:4)=[1 0 1];
        q=16;
        a=256;
        C(5:8)=e_coding(abIs,q,a);
    end
    if 512<abIs && abIs<=1024
        C(2:4)=[1 1 0];
        q=32;
        a=512;
        C(5:8)=e_coding(abIs,q,a);
    end
    if 1024<abIs && abIs<=2048
        C(2:4)=[1 1 1];
        q=64;
        a=1024;
        C(5:8)=e_coding(abIs,q,a);
    end
   
      a13_moddata(1,(bb-1)*8+1:bb*8)=C;  %得到8位pcm编码
end
end
 
%16级量化编码函数
function [ four ]=e_coding(Is,q,a)
four=zeros(1,4);
for k=1:16
    if Is>a+(k-1)*q && Is<=a+k*q
        four=dec2bin(k-1,4);
        four=str2num(four(:))';
    else
    end
end
 
end

7)A律十三折解码函数

function  [outData] = PCM_13Decode( inputData )
 
n=length(inputData);
outData=zeros(1,n/8);
MM=zeros(1,8);
 
for kk=1:n/8
    MM(1:8)=inputData(1,(kk-1)*8+1:kk*8); % 取得8位PCM码
    
    temp=MM(2)*2^2+MM(3)*2+MM(4)     ; % 将8位PCM码的第2~4位二进制数转化为10进制(三位二进制转十进制)
       %用于判断抽样值在哪个段落内
 
%     段落序号i=1                
    if temp==0
        q=1;    %段内量化间隔
        a=0;    %段落起始电平
    end
%     段落序号i=2   
    if temp==1
        q=1;
        a=16;
    end
%     段落序号i=3    
    if temp==2
        q=2;
        a=32;
    end
%     段落序号i=4    
    if temp==3
        q=4;
        a=64;
    end
%     段落序号i=5    
    if temp==4
        q=8;
        a=128;
    end
%     段落序号i=6    
    if temp==5
        q=16;
        a=256;
    end
%     段落序号i=7    
    if temp==6
        q=32;
        a=512;
    end
%     段落序号i=8    
    if temp==7
        q=64;
        a=1024;
    end
   
   A= MM(5)*2^3+MM(6)*2^2+MM(7)*2+MM(8)  ;% 8位PCM码的第5~8位二进制数转化为10进制
% 用于判断抽样值量化级数
                                     
    R=(a+A*q+q/2)/2048;%取量化间隔中点值进行译码
    if  MM(1)==0  %判断极性
        R=-R;
    end
    outData(1,kk)=R;%译码后数据
end
end

调试不易,如果代码成功运行并顺利编解码,请给我一个免费的赞吧!!!
这对我真的很重要!祝大家学习愉快~
以上就是matlab实现音频信号的PCM编码,基于A律十三折编解码并存为新音频的全部模块,新wav文件双击即可运行。

  • 18
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值