作业帮 > 综合 > 作业

pcm 的matlab实现未编码、编码、译码波形和不同幅度的量化信噪比,我的程序有问题,

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/06/11 05:06:24
pcm 的matlab实现未编码、编码、译码波形和不同幅度的量化信噪比,我的程序有问题,
clear all;
close all;
t=0:0.01:10; %定义时间抽样点
vm1=-70:1:0; %输入的信号幅度的db值
vm=10.^(vm1/20); %输入信号幅度
figure(1);
for k=1:length(vm)
for m=1:2
x=vm*sin(2*pi*t+2*pi*rand(t)); %输入语音信号
v=1;
xx=x/v;
sxx=floor(xx*4096);
y=pcm_encode(sxx); %PCM编码
yy=pcm_decode(y,v); %PCM译码后信号幅值
nq(m)=sum((x-yy)*(x-yy))/length(x);%噪音功率
sq(m)=mean(yy.^2); %信号均值
snr(m)=(sq(m)/nq(m)); %信噪比
drawnow
subplot(211)
plot(t,x);
title('采样序列'); %画出采样序列的图形
subplot(212)
plot(t,yy);
title('解码序列'); %画出PCM解码后的序列图
end
snrq(k)=10*log10(mean(snr)); %量化信噪比
end
figure(2)
plot(vm1,snrq);
axis([-60 0 0 60]); %X轴范围是(-60,0)Y轴范围是(0,60)
grid;
function [out]=pcm_encode(x); %定义A率13折线压缩特性
n=length(x);
for i=1:n
if x(i)>0
out(i,1)=1; %代表正值
else
out(i,1)=0; %代表负值
end
if abs(x(i))>=0&abs(x(i))
我修改了一下,能够运行了,不知道是不是你想要的结果?
clear all;
close all;
t=0:0.01:10; %定义时间抽样点
%vm1=-70:1:0; %输入的信号幅度的db值
vm1=linspace(-70,0,1001);
vm=10.^(vm1/20); %输入信号幅度
figure(1);
for k=1:length(vm)
for m=1:2
%x=vm*sin(2*pi*t+2*pi*rand(t)); %输入语音信号
x=vm.*sin(2*pi*t); %输入语音信号
v=1;
xx=x/v;
sxx=floor(xx*4096);
y=pcm_encode(sxx); %PCM编码
yy=pcm_decode(y,v); %PCM译码后信号幅值

nq(m)=sum((x-yy).*(x-yy))/length(x);%噪音功率
sq(m)=mean(yy.^2); %信号均值
snr(m)=(sq(m)/nq(m)); %信噪比
drawnow
subplot(211)
plot(t,x);
title('采样序列'); %画出采样序列的图形
subplot(212)
plot(t,yy);
title('解码序列'); %画出PCM解码后的序列图
end
snrq(k)=10*log10(mean(snr)); %量化信噪比
end

figure(2)
plot(vm1,snrq);
axis([-60 0 0 60]); %X轴范围是(-60,0)Y轴范围是(0,60)
grid;
function out=pcm_decode(in,v);
n=length(in);
in=reshape(in',8,n/8)'; %将in值变换成8行
slot(1)=0;
slot(2)=16;
slot(3)=32;
slot(4)=64;
slot(5)=128;
slot(6)=256;
slot(7)=512;
slot(8)=1024;
step(1)=1;
step(2)=1;
step(3)=2;
step(4)=4;
step(5)=8;
step(6)=16;
step(7)=32;
step(8)=64;
for i=1:n/8
ss=2*in(i,1)-1;
tmp=in(i,2)*4+in(i,3)*2+in(i,4)+1;
st=slot(tmp);
dt=(in(i,5)*8+in(i,6)*4+in(i,7)*2+in(i,8))*step(tmp)+0.5*step(tmp);
out(i)=ss*(st+dt)/4096*v; %量化输出值
end
function [out]=pcm_encode(x); %定义A率13折线压缩特性
n=length(x);
for i=1:n
if x(i)>0
out(i,1)=1; %代表正值
else
out(i,1)=0; %代表负值
end
if abs(x(i))>=0&&abs(x(i))