在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