1.需求
CCS导出的数据分为2个天线,每个天线都有10ms,为有符号的十六进制数据,将其在C语言中转换成十进制,然后在MATLAB中转换成.mat数据。
2.实施
17.7.21更新///
data需要定义为int型,不然运行到最后会报错:
Run-Time Check Failure #2 - Stack around the variable 'data' was corrupted.
因为数据中存在有符号的十六进制,比如FD8C,所以原来的程序有问题。
fscanf(readFilefp, "%x", &data);之后需要判断data是否为负数,若为负数需要进行处理:代码
if (data > 32767)
data -= 65536;
//
(1)将十六进制数据保存为十进制数据,一共2*10=20个文件,循环导出:
#include <stdio.h>
#define mslength 10 //几个ms的数据
#define antenalength 2 //几个天线
int main() {
//int data[614400];
short data;
int symbolNum = 1;
int dataLength = 30720 * 2 * symbolNum; // symbolNumms的数据长度(实部和虚部分开,故一个复数占用两个位置。)
FILE *readFilefp;
FILE *wirteFilefp;
int i;
int antena; //天线1/2
int ms; //1ms-10ms
char readFileName[40];//读取的CCS产生的hex文件
char wirteFileName[40];//将转换成的dec数据写入该文件
for (antena = 1; antena <= antenalength; antena++)
{
for (ms = 1; ms <= mslength; ms++)//分别读写10个文件
{
sprintf(readFileName, "ccs_antena_%d_ifft_%dms.txt", antena, ms);//改变读取文件的名称
readFilefp = fopen(readFileName, "r");//输入的十六进制数据
if (readFilefp == NULL) {
printf("open readFile error.\n");
exit(0);
}
sprintf(wirteFileName, "matlab_antena_%d_ifft_%dms.txt", antena, ms);//改变写入文件的名称
wirteFilefp = fopen(wirteFileName, "w+");//输出的十进制数据
if (wirteFilefp == NULL) {
printf("open wirteFile error.\n");
exit(0);
}
//printf("enter i:\n");
//scanf("%d", &i);
for (i = 0; i < dataLength; i++) {
fscanf(readFilefp, "%x", &data);
printf("%d\t%d\n", i, data);
fprintf(wirteFilefp, "%d ", data);
}
fclose(readFilefp);
fclose(wirteFilefp);
printf("success\n");
}
}
//getchar();
scanf("%d", &i);
return 0;
}
(2)在MATLAB中转换成.mat数据,循环导出:
% 16进制,但是不能有0x
clc,clear
global mslength
mslength = 10;%两个天线10ms数据
% a=textread('data.txt','%s')';%以字符形式打开文件
% alpha=str2dec(a)'; %16进制转化为10进制数,存入alpha矩阵
for ms = 1:1:mslength
readFile1Name = sprintf('matlab_antena_1_ifft_%dms.txt',ms);%改变读取文件的名称
readFile2Name = sprintf('matlab_antena_2_ifft_%dms.txt',ms);%改变读取文件的名称
saveFileName = sprintf('ccs_ifft_%dms.mat',ms);%改变读取文件的名称
data1=importdata(readFile1Name);%天线1数据
data2=importdata(readFile2Name);%天线2数据
dataLength = length(data1);
% data_complex = data(1:2:end) + 1i * data(2:2:end);
data_complex1 = data1(1 : dataLength / 2) + 1i * data1(dataLength/2 + 1 : end);
data_complex2 = data2(1 : dataLength / 2) + 1i * data2(dataLength/2 + 1 : end);
ccs_ifft_ms = [data_complex1.' data_complex2.'];%两个天线数据合在一起
save(saveFileName,'ccs_ifft_ms');
end