figure(2)
set(2,'Position',[600,100,500,400]) %设定窗口位置及大小
figure(1) hold on
for jj=1:Na*l:N-Na*l %画cos的眼图 plot(ttt,cos_fai(jj:jj+Na*l)); end
figure(2) hold on
for jj=1:Na*l:N-Na*l %画sin的眼图 plot(ttt,sin_fai(jj:jj+Na*l)); end
眼图的绘制比较简单,本程序中加入了预编码,为了计算象限数L,又准备了与输入代码对应双极性码。形成地址就从ROM表中读出值并显示在屏幕上,重复显示多次,就形成了眼图。
图二为余弦仿真眼图:
图表 2 余弦仿真眼图
图三为正弦仿真眼图:
图表 3 正弦仿真眼图
1.4 ROM表的量化和BIN文件生成 lianghua.m文件的源代码:
global dt t f N fb close all
cos_bin=zeros(10,1024); sin_bin=zeros(10,1024);
for ii4=1:1024
cos_1=cos_rom(ii4); %cos量化开始 cos_2=(1+cos_1)*511.5; %量化的0-1023 mmm=cos_2;
nnn1=fix(mmm/512); %将这个数10bit量化 if nnn1,mmm=mmm-512;end; cos_bin(1,ii4)=nnn1;
nnn2=fix(mmm/256); if nnn2,mmm=mmm-256;end; cos_bin(2,ii4)=nnn2;
nnn3=fix(mmm/128); if nnn3,mmm=mmm-128;end; cos_bin(3,ii4)=nnn3;
nnn4=fix(mmm/64); if nnn4,mmm=mmm-64;end; cos_bin(4,ii4)=nnn4;
nnn5=fix(mmm/32); if nnn5,mmm=mmm-32;end; cos_bin(5,ii4)=nnn5;
nnn6=fix(mmm/16); if nnn6,mmm=mmm-16;end; cos_bin(6,ii4)=nnn6;
nnn7=fix(mmm/8); if nnn7,mmm=mmm-8;end; cos_bin(7,ii4)=nnn7;
nnn8=fix(mmm/4); if nnn8,mmm=mmm-4;end; cos_bin(8,ii4)=nnn8;
nnn9=fix(mmm/2); if nnn9,mmm=mmm-2;end; cos_bin(9,ii4)=nnn9;
nnn10=fix(mmm); cos_bin(10,ii4)=nnn10; end
for ii5=1:1024
sin_1=sin_rom(ii5); %sin sin_2=(1+sin_1)*511.5; % mmm=sin_2;
nnn1=fix(mmm/512); % if nnn1,mmm=mmm-512;end; sin_bin(1,ii5)=nnn1;
nnn2=fix(mmm/256); if nnn2,mmm=mmm-256;end; sin_bin(2,ii5)=nnn2;
量化开始 量化的0-1023 将这个数10bit量化 nnn3=fix(mmm/128); if nnn3,mmm=mmm-128;end; sin_bin(3,ii5)=nnn3;
nnn4=fix(mmm/64); if nnn4,mmm=mmm-64;end; sin_bin(4,ii5)=nnn4;
nnn5=fix(mmm/32); if nnn5,mmm=mmm-32;end; sin_bin(5,ii5)=nnn5;
nnn6=fix(mmm/16); if nnn6,mmm=mmm-16;end; sin_bin(6,ii5)=nnn6;
nnn7=fix(mmm/8); if nnn7,mmm=mmm-8;end; sin_bin(7,ii5)=nnn7;
nnn8=fix(mmm/4); if nnn8,mmm=mmm-4;end; sin_bin(8,ii5)=nnn8;
nnn9=fix(mmm/2); if nnn9,mmm=mmm-2;end; sin_bin(9,ii5)=nnn9;
nnn10=fix(mmm); sin_bin(10,ii5)=nnn10; end
cos_low=zeros(1,1024);
for ii6=1:1024 %cos低8位
cos_low(ii6)=cos_bin(3,ii6)*128+cos_bin(4,ii6)*64+cos_bin(5,ii6)*32+cos_bin(6,ii6)*16+cos_bin(7,ii6)*8+cos_bin(8,ii6)*4+cos_bin(9,ii6)*2+cos_bin(10,ii6); end
sin_low=zeros(1,1024);
for ii7=1:1024 %sin低8位
sin_low(ii7)=sin_bin(3,ii7)*128+sin_bin(4,ii7)*64+sin_bin(5,ii7)*32+sin_bin(6,ii7)*16+sin_bin(7,ii7)*8+sin_bin(8,ii7)*4+sin_bin(9,ii7)*2+sin_bin(10,ii7);
end
cos_sin=zeros(1,1024);
for ii8=1:1024 %cos和sin的高2位
cos_sin(ii8)=sin_bin(1,ii8)*128+sin_bin(2,ii8)*64+cos_bin(1,ii8)*2+cos_bin(2,ii8); end
cos_low_bin=zeros(1,8192); sin_low_bin=zeros(1,8192); cos_sin_bin=zeros(1,8192); for ii9=1:1024
cos_low_bin(8*ii9-7)=cos_low(ii9); %每个数据间插入7个0 sin_low_bin(8*ii9-7)=sin_low(ii9); cos_sin_bin(8*ii9-7)=cos_sin(ii9); end
fid_cos=fopen('cos.bin','w'); %生成bin文件 fwrite(fid_cos,cos_low_bin); %数据写入bin文件 fclose(fid_cos);
fid_sin=fopen('sin.bin','w'); fwrite(fid_sin,sin_low_bin); fclose(fid_sin);
fid_cs=fopen('cs.bin','w'); fwrite(fid_cs,cos_sin_bin); fclose(fid_cs);
程序中采用了单极性量化,即首先将余弦表中的数都加一使其变成0—2之间的数,然后将位于0—2之间的数乘以511.5均匀量化成0—1023中的某个数,再转化为10比特二进制数就完成量化,然后把两组低八位与高两位分别存于三片ROM中,再生成bin文件用于实际硬件的下载。
虽然第一次验收失败了,但我很快发现了错误之处,是因为每个数据间插入7个0的循环语句有了一个出了很低级的错误,修改正确后的再次验收,顺利通过。