%{
函数名称:
pcm ,对(一维行矢量,语音信号采样值)进行PCM编码,输出(一维行矢量,PCM码)
输入参数:
一维行矢量,语音信号采样值
输出参数:
一维行矢量,PCM码
%}
%PCM编码
%[output]=encode(input)
%input:语音信号采样值
%output:PCM码
function [output]=pcm(input)
col=size(input,2);%把采样个数作为列数
C=zeros(8,col);%初始化,产生8行col列零值,用来放置采样信号的编码
%符号位的判断
for i=1:col
if input(i)>0
C(1,i)=1;
elseif input(i)<0
C(1,i)=0;
end
end
input=abs(input);
%段落码判断
for i=1:col
if input(i)>=128 %在5-8量化段,C2置1
C(2,i)=1;
if input(i)>=512 %在7-8量化段,C3置1
C(3,i)=1;
if input(i)>=1024%在8量化段,C4置1
C(4,i)=1;
else
C(4,i)=0;%在7量化段,C4置0
end
elseif input(i)>=256 %在6量化段,C4置1
C(4,i)=1;
end
else
if input(i)>=32 %在3-4量化段,C2仍然是初始的0,C3置1
C(3,i)=1;
if input(i)>=64%在4量化段,C4置1
C(4,i)=1;
else %在3量化段,C4置0
C(4,i)=0;
end
elseif input(i)>=16%在2量化段,C4置1
C(4,i)=1;
else %在1量化段,C4置0
C(4,i)=0;
end
end
end
num=zeros(1,col);%初始化,用来放置其位于的量化段号
num(1:col)=C(2,1:col)*4+C(3,1:col)*2+C(4,1:col)+1;%找到它位于第几段
I=[0,16,32,64,128,256,512,1024]; %段落起始电平
deltV=[1,1,2,4,8,16,32,64]; %量化间隔
%段内码判断
for i=1:col
p=ceil((input(i)-I(num(i)))/deltV(num(i)));%求出在段内的位置【(抽样值-起始电平)/量化间隔】,得到余数
if p==0
C(5:8,i)=[0,0,0,0];
else
k=num2str(dec2bin(p-1,4));%十进制转换成4位二进制,再把数字转换成字符
C(5,i)=str2double(k(1));%把上面得到的4位二进制数分别赋给C5、C6、C7、C8
C(6,i)=str2double(k(2));
C(7,i)=str2double(k(3));
C(8,i)=str2double(k(4));
end
end
output=reshape(C,1,8*col);%调整矩阵的行数和列数,变成1行8*col列
PCM.zip_distanceq3k_pcm_pcm qpsk_信号 取样_相位抖动
版权申诉
127 浏览量
2022-09-20
11:24:03
上传
评论
收藏 3KB ZIP 举报
weixin_42653672
- 粉丝: 89
- 资源: 1万+
评论0