二进制.dat文件如何经C++并在matlab中处理

在GNURadio中使用file sink 保存的数据(全部是.dat文件),要想通过matlab来处理,中间必须经过相应的预处理,否则无法直接应用。应为matlab读取的时候是以字节为最小单位读取的char类型,而实际存储的float或者complex,float占据了四字节,complex<float>占据了16字节,两个float,实部在前,虚部在后。这样的话直接利用matlab读取.mat数据无法得到想要的。

我的做法是:

将保存的.dat文件利用C++读取,并将数据保存到.txt文件中,然后在matlab下利用file->Import data读取,此时保存早matlab工作空间的数据还是cell类型,是字符串,然后经过 str2num(char(cell))进行类型转换得到数据,此时就可以在matlab下面进相关处理。


1,C++读取.dat文件

比如我保存的文件add_cp_out.dat,保存到add_cp_out.txt中。

中心代码如下:

	fstream file("add_cp_out.dat",ios_base::in|ios_base::out|ios_base::app|ios::binary);
	ofstream examplefileC ("add_cp_out.txt");
	file.seekg(0,ios_base::beg);
	int i=0;
	for(;(!file.eof())&(i<19200);i++)
	{
		complex<float> temp;
		file.read((char *)(&temp),sizeof(temp));
		examplefileC<<real(temp)<<"+"<<imag(temp)<<"i"<<endl;
	}
	examplefileC.close();
	file.close();

利用i只是为了控制读取我所需要的数据量。

2,matlab导入txt文件

file->Import Data选项,,在对话框中选中想要导入的文件add_cp_out.txt,界面如下图:

然后next->finish即可;在matlab命令窗口输入whos将会得到:

>> whos
  Name                Size              Bytes  Class    Attributes

  add_cp_out      19200x1             2806126  cell        


可以看出类型是cell,是无法直接处理的,接下来只要运行:

>> str2num(char(add_cp_out));


就可以得到你需要的数据;

这样的方法可以处理任何地方得到的二进制.dat文件。

说明:

转载请说明出处;

以上仅仅是个人的做法,可能很麻烦,如果有朋友有更好的方法,请彼此交流。


修正:

         感谢网友   90天改一次 提醒,OCTAVE有与GNURadio的接口函数,可以直接读取file_sink模块保存的二进制数据,函数分别有

  • read_complex_binary(): gr.sizeof_gr_complex
  • read_float_binary(): gr.sizeof_float
  • read_int_binary(): gr.sizeof_int
  • read_short_binary(): gr.sizeof_short
  • read_char_binary(): gr.sizeof_char
参考: http://gnuradio.org/redmine/projects/gnuradio/wiki/Octave


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值