第一次通过iq 数据 txt 描述文本 生成 bin 文件

第一次通过iq 数据 txt 描述文本 生成 bin 文件,第1张

第一次通过iq 数据 txt 描述文本 生成 bin 文件
#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 平台生成

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698379.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存