function code=PCMcoding(S)
z=sign(S);
MaxS=max(abs(S));
S=abs(S/MaxS); %对采样信号S进行归一化
Q=2048*S; %对采样信号S进行量化,分为2048个区间,
%采样13折线律作为压缩律进行非均匀量化
code=zeros(length(S),8); %代码存储矩阵(全零)
% 段落码判断程序
for i=1:length(S)
if (Q(i)>=128)&&(Q(i)<=2048)
code(i,2)=1; %对段位码的第一位进行判断
end
if (Q(i)>32)&&(Q(i)<128)||(Q(i)>=512)&&(Q(i)<=2048)
code(i,3)=1; %对段位码的第二位进行判断
end
if (Q(i)>=16)&&(Q(i)<32)||(Q(i)>=64)&&(Q(i)<128)||(Q(i)>=256)&&(Q(i)<512)||(Q(i)>=1024)&&(Q(i)<=2048)
code(i,4)=1; %对段位码的第三位进行判断
end
end
%段内码判断程序
N=zeros(length(S));
for i=1:length(S)
N(i)=bin2dec(num2str(code(i,2:4)))+1; %判断该量化值所在的段位
end
a=[0,16,32,64,128,256,512,1024];
b=[1,1,2,4,8,16,32,64];
for i=1:length(S)
q=ceil((Q(i)-a(N(i)))/b(N(i))); %求段内码(10进制)
if q==0
code(i,(5:8))=[0,0,0,0];
else k=num2str(dec2bin(q-1,4)); %进行段内码10进制与2进制之间的转换
code(i,5)=str2num(k(1));
code(i,6)=str2num(k(2));
code(i,7)=str2num(k(3));
code(i,8)=str2num(k(4));
end
if z(i)>0 %判断编码的正负(8位码组的第1位)
code(i,1)=1;
elseif z(i)<0
code(i,1)=0;
end
end
code = reshape(code', 1, []);
end
语明芃
- 粉丝: 8
- 资源: 4
最新资源
- 嵌入式开发概述及其常用编程语言介绍
- 5G模组升级刷模块救砖以及5G模组资料路由器固件
- C183579-123578-c1235789.jpg
- Qt5.14 绘画板 Qt Creator C++项目
- python实现Excel表格合并
- Java实现读取Excel批量发送邮件.zip
- 【java毕业设计】商城后台管理系统源码(springboot+vue+mysql+说明文档).zip
- 【java毕业设计】开发停车位管理系统(调用百度地图API)源码(springboot+vue+mysql+说明文档).zip
- 星耀软件库(升级版).apk.1
- 基于Django后端和Vue前端的多语言购物车项目设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈