📄 bianyima.m
字号:
function f=bianmahanshu()%整合后的编码函数
i=-0.1:0.001:0.1;
yuan=sinc(200/pi*i).^2;
fmax=pinpu();
t=-0.1:1/(2*fmax):0.1;
chouyangzhi=chouyang(fmax);
yasuozhi=yasuo(chouyangzhi,fmax);
bianmazhi=lianghua(yasuozhi);
subplot(3,3,1);
plot(i,yuan);
title('原函数图象');
subplot(3,3,2);
stem(t,chouyangzhi);
title('抽样值');
f=bianmazhi;
end
function f=pinpu()%连续函数频谱计算函数,返回最高截止频率fm值
step=0.001;
t=-10:step:10;
A=sinc(200/pi*t).^2;
B=[];
fm=0;
Y=fft(A);%快速傅立叶变换
Y(1)=[];%去掉无效的第一项
N=length(Y);
B=abs(Y(1:1:N/2));%求模值
for i=1:1:N/2%搜索最高截止频率fm所在单元
if B(i)<B(1)*10^(-5)
fm=i;
break;
else continue;
end
end
f=fm/N*(1/step);%得到fm值
freq=1/N*(1/step):1/N*(1/step):1/2*(1/step);%频率横坐标刻度定义
subplot(3,3,3);
plot(freq,B);%作单边频谱
title('原信号单边频谱');
end
function f=chouyang(fm)%fm为原信号最大频率,由频谱函数反馈得到
B=[];
fs=2*fm;%fs为抽样频率
s=1/fs;%s为抽样步长
t=-0.1:s:0.1;
B=sinc(200/pi*t).^2;
f=B;
stem(t,B);%画抽样后信号的点状图
end
function f=yasuo(A,fm)%非均匀压缩
B=[];
t=-0.1:1/(2*fm):0.1;
for i=1:1:length(A)
A(i)=2048*A(i);%放大使得各分段判决值为整数
if abs(A(i))<=32%在绝对值较小两段的变换
B(i)=A(i)*(1/16);
else for j=3:1:8%其余段的变换
if abs(A(i))>=2^(j+2)&abs(A(i))<=2^(j+3)
B(i)=(A(i)-16*2^(j-1))*(1/(16*2^(j-2)))+j;%变换函数
else continue;
end
end
end
B(i)=B(i)/8;%归一化
end
f=B;
subplot(3,3,4)
stem(t,B)
title('压缩器输出信号')
end
function f=lianghua(A)%均匀量化及编码函数
B=[];
C=[];
for i=1:1:length(A)
A(i)=A(i)*128;%放大以便使得判决值为整数
if A(i)>0%极性码编码
B((i-1)*8+1)=1;
else B((i-1)*8+1)=0;
A(i)=abs(A(i))%取绝对值
end
for j=2:1:8%后7位码编码
k=(i-1)*8+j;%编码序列序号
if A(i)>=2^(8-j)%逐级反馈编码
A(i)=A(i)-2^(8-j);
B(k)=1;
else B(k)=0;
end
end
end
f=B;%返回编码结果
end
function f=yimahanshu(bianmazhi)%译码主函数
fm=64;
fs=2*fm;
t=-0.1:1/fs:0.1;
junyunyima=yima(bianmazhi,fm);%调用均匀译码函数
yimazhi=kuozhang(junyunyima,fm);%调用扩张器特性函数
subplot(3,3,6);
stem(t,junyunyima);
title('均匀译码输出信号图象');
subplot(3,3,7);
stem(t,yimazhi);
title('最终A率13折线译码')
f=yimazhi;%返回译码值
end%主程序结束
function f=yima(M,fm)%均匀八位码译码
B=[];
t=-0.1:1/(2*fm):0.1;
for i=1:1:length(M)/8
if M((i-1)*8+1)==1%极性判断
sgn=1;
else sgn=-1;
end
B(i)=0;
for j=2:1:8
B(i)=B(i)+2^(8-j)*M((i-1)*8+j)+0.5;%译码函数
end
B(i)=sgn*B(i)/128;%归一化
end
f=B;
stem(t,B);%译码结果点状图
end
function f=kuozhang(A,fs)%扩张器特性函数
B=[];
fm=0;
t=-0.1:1/(2*fs):0.1;
for i=1:1:length(A)
A(i)=8*A(i);%将输入值放大到0到8之间
B(i)=0;
if abs(A(i))<=2%在第一,二两段的变换
B(i)=A(i)*16;
end
for j=3:1:8%在其余各段的变换
if abs(A(i))>=8
B(i)=2048;
end
if abs(A(i))>(j-1)&abs(A(i))<=j%确定所在段
B(i)=(A(i)-j+1)*2^(j+2)+2^(j+2);%变换函数式
else continue;
end
end
B(i)=B(i)/2048;
end
stem(t,B);
f=B;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -