首页 > 技术文章 > 定点化_mif文件生成

IClearner 2017-08-02 13:07 原文

clc;                                             %全屏清零
clear all;                                        %变量清零
N=2^8;                                             %设置ROM深度(字变量)的变量参数,
s_p=0:255;                                        %正弦波一个周期的采样点数
sin_data=sin(2*pi*s_p/N);                        %离散正弦波数据,这里的N决定了由ROM的深度决定,如果要更多的采样点,需要把N增大
                                                %打印我们的波形
%plot(sin_data,'r*');                            %红色r*打印
%hold on;                                        %保持
%plot(sin_data);                                %打印原来的波形
                                                %定点化
fix_p_sin_data=fix(sin_data*127);                 %调用fix函数,原来幅度是1,扩展到127——(-127)为什么乘127呢?因为每一个采样点
                                                %的位数是8位,而定点化前,正负的点的个数各占一半,也就是7位,2^7-1 = 127%若需要精度更高的定点化数据,那么需要把幅度乘的数加大。
                                                %由于使用的DAC位数只有8位,因此定点化8位就可以了,也就是乘以2^(8-1)-1=127即可
for i=1:N                                        %总共1:2^8,即1:256,共256个点(深度),对每个点进行定点化
    if fix_p_sin_data(i)<0                        %如果得到的值小于零,那么就加上256(定点化位数的幅度)进行取正值
        fix_p_sin_data(i)=N+fix_p_sin_data(i);    %记住这里是负数用加号即可
    else
        fix_p_sin_data(i)=fix_p_sin_data(i);    %若大于0,不需要修正
    end
end
                                                %打印定点化后的波形
%plot(sin_data,'r*');                             %红色r*打印
%hold on;                                        %保持
%plot(127*sin_data);                            %打印原来的波形
fid=fopen('sp_ram_256x8.mif','w+');             %创建并打开名字叫‘p_ram_256x8.mif'的文件,'w+'进行写数据
fprintf(fid,'WIDTH=8;\n');                      %打印(写) WIDTH=8; 然后 /n  换行
fprintf(fid,'DEPTH=256;\n');                    %
fprintf(fid,'ADDRESS_RADIX=UNS;\n');            %
fprintf(fid,'DATA_RADIX=UNS;\n');               %
fprintf(fid,'CONTENT BEGIN \n');                %上面的print都是写.mif文件的固定格式
for i=1:N                                       %这里开始写数据
fprintf(fid,'%d:%d; \n',i-1,fix_p_sin_data(i)); %数据格式是  行:数据
end                                             %行从0~255,数据则从sin的第一个数(没有0个)写到256个数,12行可以看出
fprintf(fid,'END; \n');                         %文件格式'END;'
fclose(fid);                                    %关闭文件

 

推荐阅读