%仿真运算中的字长效应
clc;
clear all;
close all;
x=[7/8 zeros(1,15)];%一维数组,第一个值为7/8,剩下15个为0;
y=zeros(1,length(x));%zeros:产生一个1行,length(x)列的0矩阵;
Qy=zeros(1,length(x));%存放未量化运算结果
Qy2=zeros(1,length(x));%存放2bit量化运算结果
Qy4=zeros(1,length(x));%存放4bit量化运算结果
Qy6=zeros(1,length(x));%存放6bit量化运算结果
%系统系数
A=0.5;
b=[1];
a=[1,A];
%未经过量化处理的运算
for i=1:length(x);
if i==1
y(i)=x(i);
else
y(i)=-A*y(i-1)+x(i);
end
end
%经过2bit量化处理的运算
B=2;
for i=1:length(x);
if i==1
Qy(i)=x(i);
Qy(i)=round(Qy(i)*(2^(B-1)))/2^(B-1);
%round:四舍五入取整函数;
else
Qy(i)=-A*Qy(i-1)+x(i);
Qy(i)=round(Qy(i)*(2^(B-1)))/2^(B-1);
end
end
Qy2=Qy;
%经过4bit量化处理的运算
B=4;
for i=1:length(x);
if i==1
Qy(i)=x(i);
Qy(i)=round(Qy(i)*(2^(B-1)))/2^(B-1);
%round:四舍五入取整函数;
else
Qy(i)=-A*Qy(i-1)+x(i);
Qy(i)=round(Qy(i)*(2^(B-1)))/2^(B-1);
end
end
Qy4=Qy;
%经过6bit量化处理的运算
B=6;
for i=1:length(x);
if i==1
Qy(i)=x(i);
Qy(i)=round(Qy(i)*(2^(B-1)))/2^(B-1);
%round:四舍五入取整函数;
else
Qy(i)=-A*Qy(i-1)+x(i);
Qy(i)=round(Qy(i)*(2^(B-1)))/2^(B-1);
end
end
Qy6=Qy;
xa=0:1:length(x)-1;
plot(xa,y,'-',xa,Qy2,'--',xa,Qy4,'o',xa,Qy6,'+');
legend('原系统运算结果','2bit量化运算结果','4bit量化运算结果','6bit量化运算结果');
%legend:按顺序在坐标区上添加图例;
xlabel('运算次数');
ylabel('滤波结果');
结果:
很明显,位数越高,振荡值越小。