MATLAB实现十三折线编码

MATLAB实现十三折线编码

源代码:
%主函数:
function pcm()
t=0:0.1:6pi;
x=sin(t); %模拟信源
subplot(2,1,1);
plot(t,x);
title ( ‘原始模拟信号’ );
t1=0:2
pi/32:6*pi; %按每周期取32个点抽样
x1=sin(t1);
subplot(2,1,2);
plot(t1,x1);
stem(t1,x1);
title ( ‘抽样信号’ );
x2=zhexian_(x1); %13折线
x3=bianma(x2); %调用编码函数
x1
x2
x3
%编码函数
`function y=bianma(x)

z=sign(x);
x=x/max(x); %归一化
x=abs(x); %取绝对值
x=2048*x;
x=fix(x); %量化,靠0取整
y=zeros(length(x),8); %储存矩阵(全零)
%段落码判断
for m=1:length(x)
if x(m)>128&&x(m)<2048 %在第五段与第八段之间,段落码第一位为1
y(m,2)=1;
end
if (x(m)>32&&x(m)<128)||(x(m)>512&&x(m)<2048)%在第三第四第七第八段内,段落码第二位为1
y(m,3)=1;
end
if (x(m)>16&&x(m)<32)||(x(m)>64&&x(m)<128)||(x(m)>256&&x(m)<512)||(x(m)>1024&&x(m)<2048)%在第二第四第六第八段内,段落码第三位为1
y(m,4)=1;
end
%符号位判断
if z(m)>0 %符号为正,符号位为1
y(m,1)=1;
else if z(m)<0 %符号为负,符号位为0
y(m,1)=0;
end
end
%段内码判断
n=zeros(length(x));
for m=1:length(x)
n(m)=y(m,2)*4+y(m,3)*2+y(m,4)+1; %找到位于第几段
end
a=[0,16,32,64,128,256,512,1024]; %量化间隔
b=[1,1,2,4,8,16,32,64]; %除以16,得到每段最小的量化间隔
for m=1:length(x)
q=ceil((x(m)-a(n(m)))/b(n(m))); %求出在段内的位置
if q==0
y(m,(5:8))=[0,0,0,0]; %输入为0,输出为0
else k=num2str(dec2bin(q-1,4)); %段内码编码为二进制
y(m,5)=str2num(k(1));
y(m,6)=str2num(k(2));
y(m,7)=str2num(k(3));
y(m,8)=str2num(k(4));
end
end
end`
编码结果:
抽样值:
在这里插入图片描述
对应十三折线值:
在这里插入图片描述
编码值:
在这里插入图片描述

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Matlab代码实现语音信号的13折线编码和译码的过程: 13折线编码: ```matlab % 读取语音信号 [sound, fs] = audioread('speech.wav'); % 设置量化步长 step = 0.1; % 计算最大值和最小值 max_value = max(sound); min_value = min(sound); % 计算量化区间数 num_intervals = (max_value - min_value) / step; % 量化信号 quantized = round((sound - min_value) / step); % 转换为PCM13折线编码 pcm13 = zeros(size(quantized)); for i = 1:length(quantized) if i == 1 pcm13(i) = quantized(i); else diff = quantized(i) - quantized(i-1); if diff > num_intervals/2 pcm13(i) = diff - num_intervals - 1; elseif diff < -num_intervals/2 pcm13(i) = diff + num_intervals + 1; else pcm13(i) = diff; end end end % 写入文件 fid = fopen('pcm13.bin', 'wb'); fwrite(fid, pcm13, 'int16'); fclose(fid); ``` 首先读取语音信号,然后设置量化步长和计算最大值和最小值。将信号量化为整数,然后按照PCM13折线编码的规则进行编码。最终得到的PCM13折线编码存储在`pcm13`,然后将其写入文件`pcm13.bin`13折线译码: ```matlab % 读取PCM13折线编码 fid = fopen('pcm13.bin', 'rb'); pcm13 = fread(fid, 'int16'); fclose(fid); % 计算最大值和最小值 max_value = max(pcm13); min_value = min(pcm13); % 计算量化区间数 num_intervals = (max_value - min_value) / 13; % 将PCM13折线编码转换为量化信号 quantized = zeros(size(pcm13)); for i = 1:length(pcm13) if i == 1 quantized(i) = pcm13(i); else diff = pcm13(i); if diff > 0 quantized(i) = quantized(i-1) + diff; else quantized(i) = quantized(i-1) + diff + num_intervals + 1; end end end % 将量化信号还原为语音信号 sound = quantized * step + min_value; % 写入文件 audiowrite('speech_reconstructed.wav', sound, fs); ``` 首先读取PCM13折线编码,然后计算最大值和最小值。按照PCM13折线编码的规则将其转换为量化信号,然后将量化信号还原为语音信号。最终得到的语音信号存储在`speech_reconstructed.wav`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值