关于毕业设计(3):matlab处理verilog仿真数据

尝试

verilog仿真的数据如下(部分):每个数都是16进制的,一个数24bit代表rgb888.
在这里插入图片描述

用matlab把txt读为矩阵数据:

im_list = importdata('fpga_gen_picture.txt',',',375);

读到的是cell类型的数据,即375个字符串,绝了。尝试了很多种博客的方法都不行,关键还是数组里有字符,字符里还需要分割,那就只能自己写一个脚本了。

另外str2num只能把十进制的字符转为数字,若含十六进制的字符abcdef就不行了!hex2dec可以把字符型的十六进制转化为十进制的数!

给出这一代的代码,这个代码并不能正常使用!(下面有解释这个bug)

im_list = importdata('fpga_gen_picture.txt',',',375);%得到的是h个数组,每个数组内容为一串字符串
% row = strsplit(im_list{300},' ');
% a=row{250}(1:2);
% aa=hex2dec(a);
for i = 1: h
        row = strsplit(im_list{i},' ');%读一行的数据,并分割为w个字符
        for j = 1: w 
                temp1=row{j}(1:2);            
                R(i:j) = hex2dec(temp1);
                  
                temp2=row{j}(3:4);
                G(i:j) = hex2dec(temp2);
                
                temp3=row{j}(5:6);
                B(i:j) = hex2dec(temp3);   
                fprintf('i:%d j: %d . G= %d,temp3:%s \n',i,j,G(i:j),temp3);
        end
end
RGB(:,:,1)=R;
RGB(:,:,2)=G;
RGB(:,:,3)=B;
imshow(RGB,[]);

matlab 的一个bug

继续尝试

算了,我何必要在matlab里转换进制,在verilog仿真的时候输出为十进制不就好了?(最开始24bit直接输出十进制肯定不行,但是现在分开为rgb三个文件,里面每个数据都是8bit时,可以直接输出为十进制!!)

文本数据如下:
在这里插入图片描述

matlab进行数据处理也没有python方便,矫情,还不如verilog对每个位进行处理方便。

matlab代码如下:(有关txt文本数据见上一篇博客)

clear all;
h=375;
w=500;
RGB=uint8(zeros(h, w, 3));
R = uint8(zeros(h, w));
G = uint8(zeros(h, w));
B = uint8(zeros(h, w));
r_cell = importdata('fpga_gen_picture_r.txt',',',h);
g_cell = importdata('fpga_gen_picture_g.txt',',',h);
b_cell = importdata('fpga_gen_picture_b.txt',',',h);

for i =1 :h
    R(i,:)=str2num( r_cell{i});%只能用{}的方式取到字符串,再进行操作
    G(i,:)=str2num( g_cell{i});
    B(i,:)=str2num( b_cell{i});
end

RGB(:,:,1)=R;
RGB(:,:,2)=G;
RGB(:,:,3)=B;
imshow(RGB,[]);

虽然结果不咋地,但好歹还是把整个流程跑通了。下图是matlab显示的图像数据,是verilog在图像处理时出了问题。
在这里插入图片描述

错误小结:
1.在verilog仿真时犯了错。在仿真的时候,满足条件时只写入了回车没有写入数据到txt,导致数据少了375个。哎。
2.imshow显示的图像如果是黑色的,那就是图像数据的问题,不是矩阵合并的问题。

一些尝试过的函数

%R_list = char(zeros(h, w));
for i = 1: h
        row = strsplit(im_list{i},' ');%读一行的数据,并分割为w个字符
        for j = 1: w 
%            R(i:j) = str2double( temp{j}(1:2) );
%            temp2(j) = str2num(temp{j})%把第i行第j列的字符转化为数字,其中不能含abcdef的十六进制数!
             
%				R_list(i:j:1)=row{i}(1:2) ;%1个字符 = 2个字符是不能赋值的
%               R_list(i:j:1)=strcat(row{i}(1),row{i}(2)) ;%1个字符 = 2个字符是不能赋值的
        end
end

str2num

能把字符(除abcdef外)转化为数字/数组,字符比如:

'1' 
'11 12 13'
结果:
1
11 12 13

hex2dec

能把字符(含abcdef)转化为十进制的数字/数组,字符比如:

'ff' 
'ff fe fd'
结果:
255
255 254 253

abs

b=abs('a' );%字符a按ascii转换

结果:
b=97

strsplit

将字符串按’ ,'分割开来:

temp = strsplit(str,',');

查看变量属性

a='ff'
whos a
class(a)

关于cell

cell类型的数据处理。
matlab使用importdata函数从txt得到的是很多个cell数据。

txt文本数据(部分):
在这里插入图片描述

cell(1)得到的还是cell
cell{1}得到的是字符串(即txt的第一行所有的数据)
cell{1}(1:2)得到字符’d6’
cell2mat则将所有的txt数据转为字符矩阵(每8bit一个字符)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值