#include#include #include #include #include #include #include #include #include #include #include using namespace std; #define _UINT16_MAX (pow(2,15) - 1) enum { FIRST_I_DATA_INDEX = 0, SECOND_Q_DATA_INDEX = 1 }; bool IsFileExistent(const boost::filesystem::path& path) { boost::system::error_code error; auto file_status = boost::filesystem::status(path, error); if (error) { return false; } if (!boost::filesystem::exists(file_status)) { return false; } if (boost::filesystem::is_directory(file_status)) { return false; } return true; } bool check_files_status(vector path) { int i; for (i = 0; i < path.size(); i++) { if (IsFileExistent(path[0])) break; } return (i != path.size()) ? false : true; } //处理数据合成iq数组数据,获取元数据并对原有的数据进行修改,无符号的整型数据 void write2bin(string path,pair < vector < uint16_t >, vector < uint16_t >> iq_data) {//采用追加的方式写入二进制的bin 文件中,采用先i后q的方式,这个只是写入的问题 cout << endl << "Writ to " << path << "... ..." << endl; FILE* fp = fopen(path.c_str(),"wb"); size_t _size = iq_data.first.size() + iq_data.second.size(); size_t i_data_size = iq_data.first.size(); size_t q_data_size = iq_data.second.size(); cout << "i_data_size: " << i_data_size << endl; cout << "q_data_size: " << q_data_size << endl; vector iq_dst_data; if (i_data_size == q_data_size) { cout << "iq data is ok to uint32_t n"; for (int i = 0; i < i_data_size; i++) { // printf("msb i %#x Lsb q %#x n",iq_data.first[i],iq_data.second[i]); //DEBUG >> 查看数据的高低位的组合 iq_dst_data.push_back(((iq_data.first[i] << 8) << 8) | iq_data.second[i]); // printf("iq data %#x n",iq_dst_data[i]); //DEBUG >> 查看数据的高低位的组合 } } uint32_t *dst_iq_data = (uint32_t*)calloc(sizeof(uint32_t),iq_dst_data.size()); if (dst_iq_data == nullptr) { cout << "get dst iq data mem errorn"; exit(1); } memcpy(dst_iq_data,&iq_dst_data[0],sizeof(uint32_t)*iq_dst_data.size()); //一个iq 数据 一个 iq 的数据去写 fwrite(dst_iq_data,iq_dst_data.size(), 4, fp); fclose(fp); free(dst_iq_data); dst_iq_data = nullptr; } void fbs_array(vector array,vector & new_array) { //生成新的new_array进行使用 for (int i = 0; i < array.size(); i++) { new_array.push_back(fabs(array[i])); } } float find_max(pair ,vector > data) { //求两组数列中的最大值 vector fbs_array_i_data; fbs_array(data.first,fbs_array_i_data); vector fbs_array_q_data; fbs_array(data.second, fbs_array_q_data); float max_number_i = 0.0; float max_number_q = 0.0; for (int i = 0; i < data.first.size(); i++) { if (data.first[i] > max_number_i) { max_number_i = data.first[i]; } } for (int i = 0; i < data.second.size(); i++) { if (data.second[i] > max_number_q) { max_number_q = data.second[i]; } } return max_number_q > max_number_i ? max_number_q : max_number_i; //找到两个数组中的最大值 } // iq float data src data using void calculate_iq_data(pair ,vector >iq_src_data,pair &,vector &>& iq_dst_data) { //处理一组数据到 有float 到 uint16_t,两个数据同时处理,只会先处理一组iq数据,并且进行组合 vector ::iterator it; float max_iq_data = find_max(iq_src_data); cout << "Max iq data is " << max_iq_data; //检验找到的最大的iq数据 for (it = iq_src_data.first.begin(); it != iq_src_data.first.end(); it++) { // 第一次遍历i 数据 第二次 遍历q 数据 iq_dst_data.first.push_back((uint16_t)(((*it) / max_iq_data) * _UINT16_MAX)); // 先第一遍 处理 i 数据进行 返回 } for (it = iq_src_data.second.begin(); it != iq_src_data.second.end(); it++) { iq_dst_data.second.push_back((uint16_t)(((*it) / max_iq_data)* _UINT16_MAX)); // 第二次 处理 q 的数据 进行处理, 对两次处理的数据进行修改 } } void text2read(string path, vector & data) { ifstream rpath; rpath.open(path, ios::in); string line; while (getline(rpath, line)) { data.push_back(stof(line)); //将iq 数据先转换为 float 数据 } rpath.close(); cout << "Read from " << path << " cnt: " << data.size() << endl; //统计总共读取了多少行的数据 } //启动两个进程同时去读文件进行,加快处理速度,vector 2 个 vector 2 个 4个数组同时做,windows 的线程栈空间好奇怪 void create2thread2read(vector path, pair < vector &, vector &>& data ) { text2read(path[FIRST_I_DATA_INDEX], data.first); text2read(path[SECOND_Q_DATA_INDEX], data.second); } //返回处理好的整型数据进行使用,查看数据是否处理完成 bool deal2iq_data(vector path,string output) { // first 为 i data ; seconde 为 q data try { if (check_files_status(path) && path.size() != 2) { throw "file not exits or file inputs count is not 2, please check n"; } vector _i_data, _q_data; pair &, vector &> iq_data(_i_data,_q_data); vector i_data, q_data; pair &, vector &> iq(i_data,q_data); create2thread2read(path,iq); cout << "iq fisrt size: " << i_data.size() << endl; cout << "iq second size: " << q_data.size() << endl; calculate_iq_data(iq,iq_data); write2bin(output,iq_data); } catch (string error) { cout << error; return false; } return true; } int main(int argc,char* argv[]) { string Useage = std::string(argv[0]) + " [ -f ] [ src i_data_filename ] [src q_data_filenam ] [dst filename]n"; try { if (argc != 5) throw Useage; if (std::string("-f") != std::string(argv[1]) || argv[2] == nullptr || argv[3] == nullptr || argv[4] == nullptr) throw Useage; vector filepath = { argv[2],argv[3] }; // 检查iq 数据文件 if (!deal2iq_data(filepath, string(argv[4]))) throw std::string("deal to iq data errorn"); } catch (std::string error) { cout << error << endl; } cout << endl; system("Pause"); //是否退出windows 的命令行 }
我这边初步测试是可以使用的,是在windows 平台生成
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)