matlab8级量化信号,编程题-8级均匀PCM量化器-路过的朋友们,帮忙看下。 – MATLAB中文论坛...

题目是这样的:   1.周期信号x(t)的周期为2且它在区间[0,2]定义如下

要  a)为该信号设计一个8级均匀PCM量化器并绘出该系统的量化输出;

b)绘出该系统的量化误差;

c)通过计算误差信号的概率,确定以dB为单位的该系统的SQNR。

有一程序如下:这是16级的,太复杂了,谁可以修改得简单点,而且是八级的。

%function [sqnr,a_quan,code]=u_pcm(a,n)

%U_PCM 采样样本序列a的均匀PCM编码.

% [SQNR,A_QUAN,CODE]=U_PCM(A,N)

% a=输入序列.

% n=量化级别数 (偶数).

% sqnr=输出的SQNR (以dB为单位).

% a_quan=编码之前的量化输出.

% code=编码后的输出.

t=-10:0.1:10;

a=abs(sawtooth((t+1)*pi,1));

n=16;

amax=max(abs(a));

a_quan=a/amax;

b_quan=a_quan;

d=2/n;

q=d.*[0:n-1];

q=q-((n-1)/2)*d;

for i=1:n

a_quan(find((q(i)-d/2 <= a_quan) & (a_quan <= q(i)+d/2)))=...

q(i).*ones(1,length(find((q(i)-d/2 <= a_quan) & (a_quan <= q(i)+d/2))));

b_quan(find( a_quan==q(i) ))=(i-1).*ones(1,length(find( a_quan==q(i) )));

end

%上一个循环就是说把a_quan向量里的值在q(i)附近的项赋值为q(i),然后把a_quan向量里值为q(i)的项变成i-1赋给b_quan

a_quan=a_quan*amax;

nu=ceil(log2(n));

code=zeros(length(a),nu);

for i=1:length(a)

for j=nu:-1:0

if ( fix(b_quan(i)/(2^j)) == 1)

code(i,(nu-j)) = 1;

b_quan(i) = b_quan(i) - 2^j;

end

end

end

%上一个循环相当于把b_quan里的每项用二进制表示出来,然后构成矩阵code,code就是这样输出的

sqnr=20*log10(norm(a)/norm(a-a_quan));

subplot(3,1,1);

plot(t,a);

subplot(3,1,2);

plot(t,a_quan);

subplot(3,1,3);

stem(t,code);

n=16;

%产生题目要求的函数

endtime = 20;            %结束时间

dt = 0.1;               %抽样间隔

t = 0:dt:endtime;

a=abs(sawtooth((t+1)*pi,1));

for tt=1:1/dt

a(tt+[0:endtime/2-1]*(2/dt))=t(tt);   %t when 0 <= t < 1

end

for tt=1/dt+1:2/dt

a(tt+[0:endtime/2-1]*(2/dt))=2-t(tt);  % -t+2  when 1 <= t < 2

end;

%A率非线性

A = 87.56;

amax=max(abs(a));

c = zeros(size(a));

for i = 1:length(a);

if((a(i)/amax)<=1/A)

c(i) = A*a(i)/(1+log(A));

end

if((a(i)/amax)>1/A)

c(i) = (1+log(A*a(i)))/(1+log(A));

end

end

%均匀量化

c_quan=c;

b_quan=c_quan;

d=1/n;%量化间隔

q=d.*[1:n];

q=q-d/2;%量化电平

for i=1:n

%定位第i个量化间隔码子

c_quan(find((q(i)-d/2<=c_quan) & (c_quan<=q(i)+d/2)))=...

q(i).*ones(1,length(find((q(i)-d/2<=c_quan)&(c_quan<=q(i)+d/2))));

%赋值为相应的量化电平

b_quan(find(c_quan==q(i))) =(i-1) .* ones(1,length(find(c_quan==q(i))));

end

nu=ceil(log2(n));%编码

code=zeros(length(a),nu);

for i=1:length(a)

for j=nu:-1:0

if (fix(b_quan(i)/(2^j))==1)

code(i,(nu-j))=1;

b_quan(i)=b_quan(i)-2^j;

end

end

end

%A率非线性的逆运算

for i = 1:length(c_quan);

if( (c_quan(i)) <= 1/(1+log(A)) )

a_quan(i) = (1+log(A))*c_quan(i)/A;

end

if((c_quan(i))>1/A)

a_quan(i) = exp((1+log(A))*c_quan(i)-1)/A;

end

end

sqnr=20*log10(norm(a)/norm(a-a_quan));%求量化信噪比

disp('量化信噪比')

disp(sqnr)

disp('量化误差')

disp(a - a_quan)

disp('编码结果')

disp(code)

plot(t,a,'r-')

hold on;

plot(t,a_quan,'.b')

%plot(t,a_quan,'b-')

%axis([0 1 0 1])

[本帖最后由 mo9908 于 2010-1-24 17:47 编辑]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值