From b51b4b7a5fd276e5782f084b669e561fc6d49287 Mon Sep 17 00:00:00 2001 From: wsqRichard <229242333@qq.com> Date: Fri, 9 May 2025 15:42:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=B8=8A=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD:=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=A7=A3=E6=9E=90=E9=87=87=E6=A0=B7=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E4=B8=80=E6=AC=A1=E6=80=A7=E5=B0=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=91=86=E6=94=BE=E5=A5=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wsqRichard <229242333@qq.com> --- CMakeLists.txt | 6 +- calculatemovingcorrelation.cpp | 506 +++++++++++++++++---------------- calculatemovingcorrelation.h | 94 +++--- droneifiqparse.cpp | 296 +++++++++---------- droneifiqparse.h | 38 ++- log.h | 97 ++++--- main.cpp | 126 ++++---- mainwindow.cpp | 299 +++++++++---------- mainwindow.h | 72 ++--- 9 files changed, 791 insertions(+), 743 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7327bff..0536768 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,8 +3,8 @@ project(MovingCorrelation) cmake_policy(SET CMP0104 NEW) option(USE_CUDA "启用CUDA加速" ON) -option(USE_PRE_COMPUTE_MODE "启用预初始化sequence" ON) -option(USE_OPT_CUDAMEMCPY "启用优化cudaMemcpy" ON) +option(USE_PRE_COMPUTE_MODE "启用预初始化sequence" OFF) +option(USE_OPT_CUDAMEMCPY "启用优化cudaMemcpy" OFF) if(USE_CUDA) add_compile_definitions(USE_CUDA) @@ -77,6 +77,8 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) +# set(CMAKE_CXX_STANDARD 11) + # 包含Qt的头文件 include_directories(${Qt5Widgets_INCLUDE_DIRS}) diff --git a/calculatemovingcorrelation.cpp b/calculatemovingcorrelation.cpp index 3e3194c..8086670 100644 --- a/calculatemovingcorrelation.cpp +++ b/calculatemovingcorrelation.cpp @@ -1,339 +1,345 @@ #include "cuda_correlation.h" #include "calculatemovingcorrelation.h" -#include #include + +#include #include #include + #include "fft.h" #include "log.h" #if USE_CUDA -CalculateMovingCorrelation::CalculateMovingCorrelation() { cudaCorrelation = new CUDACorrelation();} +CalculateMovingCorrelation::CalculateMovingCorrelation() { + cudaCorrelation = new CUDACorrelation(); +} #else CalculateMovingCorrelation::CalculateMovingCorrelation() {} #endif -int CalculateMovingCorrelation::CalMovingCorrlationRoutine(QVector > &DownSamplingIData, QVector > &DownSamplingQData) -{ - // if(m_VecFileNameSequence.empty()) - // { - // qDebug() << "m_VecFileNameSequence is null"; - // return 0; - // } - - const int numChannels = DownSamplingIData.size(); - std::vector>> vecsignal(numChannels); - const int signalLength = DownSamplingIData[0].size(); - qDebug() << __FUNCTION__ << "numChannels:" <> channelData; - channelData.reserve(dataLength); - - for(int i = 0; i < dataLength; ++i) - { - channelData.emplace_back(DownSamplingIData[channel][i], DownSamplingQData[channel][i]); - } - qDebug() << __FUNCTION__ << "channelData.size:" <>> &vecsignal) { + const int numChannels = vecsignal.size(); - qDebug() << __FUNCTION__ << "Signal processing start"; + qDebug() << __FUNCTION__ << "Signal processing start"; #if defined(USE_CUDA) && defined(USE_PRE_COMPUTE_MODE) - // 预先计算所有batch的signals的fft值 - cudaCorrelation->ComputeSignalsFFT(vecsignal); + // 预先计算所有batch的signals的fft值 + cudaCorrelation->ComputeSignalsFFT(vecsignal); #endif - // 处理每个序列 - int result = 0; - int numSequences = m_VecSequence.size(); - qDebug() << __FUNCTION__ << "numSequences:" << numSequences; + // 处理每个序列 + int result = 0; + int numSequences = m_VecSequence.size(); - for(int seqIdx = 0; seqIdx < numSequences; ++seqIdx) - { - qDebug() << __FUNCTION__ << "seqIdx-----------" << seqIdx; + for (int seqIdx = 0; seqIdx < numSequences; ++seqIdx) { + qDebug() << __FUNCTION__ << "seqIdx-----------" << seqIdx; - std::vector>> correlationResults(numChannels); + std::vector>> correlationResults( + numChannels); #if USE_CUDA qDebug() << __FUNCTION__ << "Starting CUDA processing"; - #ifdef USE_PRE_COMPUTE_MODE - qDebug() << __FUNCTION__ << "use init compute fft mode"; - try { - // correlationResults = cudaCorrelation->ProcessBatch(vecsignal, seqIdx); - correlationResults = cudaCorrelation->ComputeConjugateMultiply(seqIdx); - } catch (const std::exception& e) { - qDebug() << "CUDA processing error:" << e.what(); - throw; - } - qDebug() << "CUDA processing completed successfully"; - #else - auto& sequence = m_VecSequence[seqIdx]; - qDebug() << __FUNCTION__ << " sequence length: " << sequence.size(); - try { - correlationResults = cudaCorrelation->ProcessBatch(vecsignal, sequence); - } catch (const std::exception& e) { - qDebug() << "CUDA processing error:" << e.what(); - throw; - } - qDebug() << "CUDA processing completed successfully"; - #endif +#ifdef USE_PRE_COMPUTE_MODE + qDebug() << __FUNCTION__ + << "use pre compute FFT (sequenceFFT, signalsFFT) mode"; + try { + // correlationResults = cudaCorrelation->ProcessBatch(vecsignal, seqIdx); + // 计算共轭乘 + correlationResults = cudaCorrelation->ComputeConjugateMultiply(seqIdx); + } catch (const std::exception &e) { + qDebug() << "CUDA processing error:" << e.what(); + throw; + } + qDebug() << "CUDA processing completed successfully"; +#else + auto &sequence = m_VecSequence[seqIdx]; + qDebug() << __FUNCTION__ << " sequence length: " << sequence.size(); + try { + correlationResults = cudaCorrelation->ProcessBatch(vecsignal, sequence); + } catch (const std::exception &e) { + qDebug() << "CUDA processing error:" << e.what(); + throw; + } + qDebug() << "CUDA processing completed successfully"; +#endif #else #pragma omp parallel for schedule(dynamic) - auto& sequence = m_VecSequence[seqIdx]; - std::cout << "Starting omp processing for sequence"<< std::endl; - for(int channel = 0; channel < numChannels; ++channel) - { - MovingCorrelation(vecsignal[channel], sequence, correlationResults[channel]); - } + auto &sequence = m_VecSequence[seqIdx]; + std::cout << "Starting omp processing for sequence" << std::endl; + for (int channel = 0; channel < numChannels; ++channel) { + MovingCorrelation(vecsignal[channel], sequence, + correlationResults[channel]); + } #endif - if(CalculatePeaks(correlationResults) == 1) - { - result = 1; - // 找到后 直接退出循环 不需要继续循环后边的序列 - break; - } + if (CalculatePeaks(correlationResults) == 1) { + result = 1; + // 找到后 直接退出循环 不需要继续循环后边的序列 + break; } + } - return result; + return result; } -int CalculateMovingCorrelation::CalculatePeaks(std::vector > > &CorrelationResults) -{ - std::vector vecCaculatePeaks; - vecCaculatePeaks.reserve(CorrelationResults.size()); - - for(const auto& CorrelationValue : CorrelationResults) - { - double max_abs = -10000; - int max_index = -1; - double total_abs = 0.0; +int CalculateMovingCorrelation::CalMovingCorrlationRoutine( + QVector> &DownSamplingIData, + QVector> &DownSamplingQData) { + const int numChannels = DownSamplingIData.size(); + std::vector>> vecsignal(numChannels); + + // 填充每个通道的IQ数据 + for (int channel = 0; channel < numChannels; ++channel) { + const int dataLength = DownSamplingIData[channel].size(); + qDebug() << __FUNCTION__ << "dataLength:" << dataLength; + std::vector> channelData; + channelData.reserve(dataLength); + + for (int i = 0; i < dataLength; ++i) { + channelData.emplace_back(DownSamplingIData[channel][i], + DownSamplingQData[channel][i]); + } + qDebug() << __FUNCTION__ << "channelData.size:" << channelData.size(); + vecsignal[channel] = std::move(channelData); + } - const int num_elements = CorrelationValue.size(); + return CalMovingCorrlationRoutine(vecsignal); +} - if(num_elements == 0) - { - return 0; - } +int CalculateMovingCorrelation::CalculatePeaks( + std::vector>> &CorrelationResults) { + std::vector vecCaculatePeaks; + vecCaculatePeaks.reserve(CorrelationResults.size()); - for(int i = 0; i < num_elements; ++i) - { - const double abs_val = std::hypot(CorrelationValue.at(i).real(), CorrelationValue.at(i).imag()); - total_abs += abs_val; + for (const auto &CorrelationValue : CorrelationResults) { + double max_abs = -10000; + int max_index = -1; + double total_abs = 0.0; - if(abs_val > max_abs) { - max_abs = abs_val; - max_index = i; - } - } + const int num_elements = CorrelationValue.size(); - const double avg_abs = total_abs / num_elements; - // vecCaculateRes.push_back((max_abs > (avg_abs * 10)) ? 1 : 0); + if (num_elements == 0) { + return 0; + } - vecCaculatePeaks.push_back((max_abs > (avg_abs * 7)) ? 1 : 0); // 暂时以 峰值大于平均值的 7倍 作为判据 + for (int i = 0; i < num_elements; ++i) { + const double abs_val = std::hypot(CorrelationValue.at(i).real(), + CorrelationValue.at(i).imag()); + total_abs += abs_val; - qDebug() << " MaxValueIndex " << max_index - << " Maxvalue " << max_abs - << " ValueAbsSumAverage " << avg_abs; + if (abs_val > max_abs) { + max_abs = abs_val; + max_index = i; + } } - qDebug() << __FUNCTION__ << "vecCaculatePeaks " << vecCaculatePeaks; + const double avg_abs = total_abs / num_elements; + // vecCaculateRes.push_back((max_abs > (avg_abs * 10)) ? 1 : 0); - return std::any_of(vecCaculatePeaks.begin(), vecCaculatePeaks.end(), - [](int val){ return val == 1; }) ? 1 : 0; -} + vecCaculatePeaks.push_back( + (max_abs > (avg_abs * 7)) ? 1 + : 0); // 暂时以 峰值大于平均值的 7倍 作为判据 + qDebug() << " MaxValueIndex " << max_index << " Maxvalue " << max_abs + << " ValueAbsSumAverage " << avg_abs; + } -void CalculateMovingCorrelation::MovingCorrelation(std::vector > &SingleChannelData, std::vector > &Sequence, - std::vector > &CorrelationResults) -{ - std::vector> SingalfftResult = FFT::fft(SingleChannelData); + qDebug() << __FUNCTION__ << "vecCaculatePeaks " << vecCaculatePeaks; - int fftLength = SingalfftResult.size(); - int sequenceLength = Sequence.size(); + return std::any_of(vecCaculatePeaks.begin(), vecCaculatePeaks.end(), + [](int val) { return val == 1; }) + ? 1 + : 0; +} - // 零填充 sequence - std::vector> paddedSequence(fftLength, std::complex(0, 0)); // 创建一个全是0+0i 的vector 对前sequenceLength赋值 +void CalculateMovingCorrelation::MovingCorrelation( + std::vector> &SingleChannelData, + std::vector> &Sequence, + std::vector> &CorrelationResults) { + std::vector> SingalfftResult = + FFT::fft(SingleChannelData); - int minlen = std::min(sequenceLength, fftLength); + int fftLength = SingalfftResult.size(); + int sequenceLength = Sequence.size(); - for (int i = 0; i < minlen; ++i) - { - paddedSequence[i] = std::complex(Sequence[i].real(), Sequence[i].imag()); - } + // 零填充 sequence + std::vector> paddedSequence( + fftLength, + std::complex( + 0, 0)); // 创建一个全是0+0i 的vector 对前sequenceLength赋值 + + int minlen = std::min(sequenceLength, fftLength); - //计算序列fft - std::vector> SequencefftResult = FFT::fft(paddedSequence); + for (int i = 0; i < minlen; ++i) { + paddedSequence[i] = + std::complex(Sequence[i].real(), Sequence[i].imag()); + } + + // 计算序列fft + std::vector> SequencefftResult = + FFT::fft(paddedSequence); #ifdef _DEBUG_ - std::cout << "signalLength:" << fftLength << std::endl; - std::cout << "sequenceLength:" << sequenceLength << std::endl; - std::cout << "sequenceFFTLength:" << SequencefftResult.size() << std::endl; - std::cout << "sequence fft结果" << std::endl; - for (int i = 0; i < 10; i++) { - std::cout << "fftSequence[" << i << "]: (" << SequencefftResult[i].real() << ", " - << SequencefftResult[i].imag() << "i)" << std::endl; - } - std::cout << "singnal 原始数据" << std::endl; - for (int i = 0; i < 10; i++) { - std::cout << "SingleData[" << i << "]: (" << SingleChannelData[i].real() << ", " - << SingleChannelData[i].imag() << "i)" << std::endl; - } - std::cout << "singnal fft结果" << std::endl; - for (int i = 0; i < 10; i++) { - std::cout << "SingalfftResult[" << i << "]: (" << SingalfftResult[i].real() << ", " - << SingalfftResult[i].imag() << "i)" << std::endl; - } + std::cout << "signalLength:" << fftLength << std::endl; + std::cout << "sequenceLength:" << sequenceLength << std::endl; + std::cout << "sequenceFFTLength:" << SequencefftResult.size() << std::endl; + std::cout << "sequence fft结果" << std::endl; + for (int i = 0; i < 10; i++) { + std::cout << "fftSequence[" << i << "]: (" << SequencefftResult[i].real() + << ", " << SequencefftResult[i].imag() << "i)" << std::endl; + } + std::cout << "singnal 原始数据" << std::endl; + for (int i = 0; i < 10; i++) { + std::cout << "SingleData[" << i << "]: (" << SingleChannelData[i].real() + << ", " << SingleChannelData[i].imag() << "i)" << std::endl; + } + std::cout << "singnal fft结果" << std::endl; + for (int i = 0; i < 10; i++) { + std::cout << "SingalfftResult[" << i << "]: (" << SingalfftResult[i].real() + << ", " << SingalfftResult[i].imag() << "i)" << std::endl; + } #endif - // 计算共轭 - std::vector> conjugateSequence(fftLength); - for (int i = 0; i < fftLength; ++i) - { - conjugateSequence[i] = std::conj(SequencefftResult[i]); - } + // 计算共轭 + std::vector> conjugateSequence(fftLength); + for (int i = 0; i < fftLength; ++i) { + conjugateSequence[i] = std::conj(SequencefftResult[i]); + } - // 点对点相乘 - std::vector> multipliedResult(fftLength); - for (int i = 0; i < fftLength; ++i) - { - multipliedResult[i] = SingalfftResult[i] * conjugateSequence[i]; - } - - std::vector> ifftResult = FFT::ifft(multipliedResult); + // 点对点相乘 + std::vector> multipliedResult(fftLength); + for (int i = 0; i < fftLength; ++i) { + multipliedResult[i] = SingalfftResult[i] * conjugateSequence[i]; + } -#ifdef _DEBUG_ - std::cout << "共轭乘结果" << std::endl; - for (int i = 0; i < 10; i++) { - std::cout << "conjugate-Result[" << i << "]: (" << multipliedResult[i].real() << ", " - << multipliedResult[i].imag() << "i)" << std::endl; - } - // 进行iFFT - std::cout << "ifft结果" << std::endl; - for (int i = 0; i < 10; i++) { - std::cout << "ifftResult[" << i << "]: (" << ifftResult[i].real() << ", " - << ifftResult[i].imag() << "i)" << std::endl; - } + std::vector> ifftResult = FFT::ifft(multipliedResult); - //数据截取 - std::cout << "fftSequence length:" << fftLength << std::endl; - std::cout << "sequenceLength length:" << sequenceLength << std::endl; - std::cout << "(fftLength - sequenceLength):" << (fftLength - sequenceLength) << std::endl; +#ifdef _DEBUG_ + std::cout << "共轭乘结果" << std::endl; + for (int i = 0; i < 10; i++) { + std::cout << "conjugate-Result[" << i << "]: (" + << multipliedResult[i].real() << ", " + << multipliedResult[i].imag() << "i)" << std::endl; + } + // 进行iFFT + std::cout << "ifft结果" << std::endl; + for (int i = 0; i < 10; i++) { + std::cout << "ifftResult[" << i << "]: (" << ifftResult[i].real() << ", " + << ifftResult[i].imag() << "i)" << std::endl; + } + + // 数据截取 + std::cout << "fftSequence length:" << fftLength << std::endl; + std::cout << "sequenceLength length:" << sequenceLength << std::endl; + std::cout << "(fftLength - sequenceLength):" << (fftLength - sequenceLength) + << std::endl; #endif - CorrelationResults.reserve((fftLength - sequenceLength)); - CorrelationResults.assign(ifftResult.begin(), ifftResult.begin() + (fftLength - sequenceLength)); + CorrelationResults.reserve((fftLength - sequenceLength)); + CorrelationResults.assign(ifftResult.begin(), + ifftResult.begin() + (fftLength - sequenceLength)); } void CalculateMovingCorrelation::ComputeAllSequence(int fftLength) { #if defined(USE_CUDA) && defined(USE_PRE_COMPUTE_MODE) - // 预计算sequence:初始化阶段预计算所有Sequence的FFT - qDebug() << "Starting CUDA processing for compute all sequence"; - cudaCorrelation->InitSequence(m_VecSequence, fftLength); + // 预计算sequence:初始化阶段预计算所有Sequence的FFT + qDebug() << "Starting CUDA processing for compute all sequence"; + cudaCorrelation->InitSequence(m_VecSequence, fftLength); #endif } -void CalculateMovingCorrelation::LoadAllSequenceBin(QString basePath) -{ - QString PathName = QCoreApplication::applicationDirPath() + basePath + "Sequence"; - qDebug()<<__FUNCTION__ << "PathName" << PathName; +void CalculateMovingCorrelation::LoadAllSequenceBin(QString basePath) { + QString PathName = + QCoreApplication::applicationDirPath() + basePath + "Sequence"; + qDebug() << __FUNCTION__ << "PathName" << PathName; - QDir dir(PathName); - if(!dir.exists()) - { - return; - } - - dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + QDir dir(PathName); + if (!dir.exists()) { + return; + } - dir.setSorting(QDir::DirsFirst); + dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); - QFileInfoList list = dir.entryInfoList(); + dir.setSorting(QDir::DirsFirst); - if(list.size() == 0) - { - return; - } + QFileInfoList list = dir.entryInfoList(); - m_VecSequence.clear(); + if (list.size() == 0) { + return; + } - int sizeoflist = list.size(); + m_VecSequence.clear(); - for(int i = 0; i < sizeoflist; ++i) - { - QFileInfo fileInfo = list.at(i); - - if(!fileInfo.isDir()) - { - if(fileInfo.suffix() == "bin") - { - ReadSequenceFile(PathName + "/" + fileInfo.fileName()); - } - } - } + int sizeoflist = list.size(); - qDebug() << __FUNCTION__ << "m_VecFileNameSequence.num " << m_VecSequence.size(); + for (int i = 0; i < sizeoflist; ++i) { + QFileInfo fileInfo = list.at(i); - for(int AllSequenceIndex = 0; AllSequenceIndex < m_VecSequence.size(); AllSequenceIndex++) - { - qDebug() << __FUNCTION__ << "m_VecFileNameSequence.Index " <> VecComplex; - VecComplex.clear(); + std::vector> VecComplex; + VecComplex.clear(); - inFile.seekg(0, std::ios::end); - int len = inFile.tellg(); + inFile.seekg(0, std::ios::end); + int len = inFile.tellg(); - inFile.seekg(0, std::ios::beg); + inFile.seekg(0, std::ios::beg); - char *tempdata = new char[len]; - inFile.read(tempdata, len); + char *tempdata = new char[len]; + inFile.read(tempdata, len); - QVector vecSequenceData; - BytesToDoubleInv(tempdata, len, vecSequenceData); + QVector vecSequenceData; + BytesToDoubleInv(tempdata, len, vecSequenceData); - int sizeOfSequenceData = vecSequenceData.size(); + int sizeOfSequenceData = vecSequenceData.size(); - for(int index = 0; index < sizeOfSequenceData; index += 2) - { - std::complex complexRI = {vecSequenceData[index], vecSequenceData[index + 1]}; - VecComplex.push_back(complexRI); - } + for (int index = 0; index < sizeOfSequenceData; index += 2) { + std::complex complexRI = {vecSequenceData[index], + vecSequenceData[index + 1]}; + VecComplex.push_back(complexRI); + } - m_VecSequence.push_back(VecComplex); + m_VecSequence.push_back(VecComplex); } -void CalculateMovingCorrelation::BytesToDoubleInv(char *buf, int ReadFileLength, QVector &VecReturn) -{ - for(int i = 0; i < ReadFileLength;) - { - double real; - double imag; - memcpy(&real, buf + i, sizeof(double)); - memcpy(&imag, buf + i + 8, sizeof(double)); +void CalculateMovingCorrelation::BytesToDoubleInv(char *buf, int ReadFileLength, + QVector &VecReturn) { + for (int i = 0; i < ReadFileLength;) { + double real; + double imag; + memcpy(&real, buf + i, sizeof(double)); + memcpy(&imag, buf + i + 8, sizeof(double)); - VecReturn.push_back(real); - VecReturn.push_back(imag); + VecReturn.push_back(real); + VecReturn.push_back(imag); - i += 16; - } + i += 16; + } } diff --git a/calculatemovingcorrelation.h b/calculatemovingcorrelation.h index 739b938..069bfe1 100644 --- a/calculatemovingcorrelation.h +++ b/calculatemovingcorrelation.h @@ -2,55 +2,61 @@ #define CALCULATEMOVINGCORRELATION_H #include -#include +#include +#include #include -#include +#include #include - -#include -#include +#include class CUDACorrelation; -class CalculateMovingCorrelation -{ -public: - CalculateMovingCorrelation(); - - // 初始时 读取 Sequence文件夹下的所有序列文件 保存到变量中 (仅一次) - void LoadAllSequenceBin(QString basePath); - - // 计算所有序列的fft - void ComputeAllSequence(int fftLength); - - // 计算滑动相关总流程 输入 8路 I数据 和 8路 Q数据 返回 1--找到相关峰 0--未找到相关峰 - int CalMovingCorrlationRoutine(QVector> &DownSamplingIData, QVector> &DownSamplingQData); - - // 序列文件数据 - std::vector>> m_VecSequence; - -private: - - // 滑动相关函数 - // 输入 一路数据的 IQ (组合成 复数) SingleChannelData - // 输入 一个Sequence文件的 原始数据(组合成 复数) Sequence - // 输出 相关数据CorrelationResults (复数) - void MovingCorrelation(std::vector> &SingleChannelData, - std::vector> &Sequence, - std::vector> &CorrelationResults); - - // 计算是否有峰值(满足峰值条件) - // 输入 前一步计算得到的 相关数据CorrelationResults - // 返回值 1--找到相关峰 0--未找到相关峰 - int CalculatePeaks(std::vector>> &CorrelationResults); - - // 读取单个序列文件 - void ReadSequenceFile(QString strFileName); - // 字节转换成double - void BytesToDoubleInv(char *buf, int ReadFileLength, QVector &VecReturn); - +class CalculateMovingCorrelation { + public: + CalculateMovingCorrelation(); + + // 初始时 读取 Sequence文件夹下的所有序列文件 保存到变量中 (仅一次) + void LoadAllSequenceBin(QString basePath); + + // 计算所有序列的fft + void ComputeAllSequence(int fftLength); + + // 计算滑动相关总流程 输入 8路 I数据 和 8路 Q数据 返回 1--找到相关峰 + // 0--未找到相关峰 + int CalMovingCorrlationRoutine(QVector> &DownSamplingIData, + QVector> &DownSamplingQData); + + // 计算滑动相关总流程 输入 8路 I数据 和 8路 Q数据 返回 1--找到相关峰 + // 0--未找到相关峰 + int CalMovingCorrlationRoutine( + const std::vector>> &vecsignal); + + // 序列文件数据 + std::vector>> m_VecSequence; + + private: + // 滑动相关函数 + // 输入 一路数据的 IQ (组合成 复数) SingleChannelData + // 输入 一个Sequence文件的 原始数据(组合成 复数) Sequence + // 输出 相关数据CorrelationResults (复数) + void MovingCorrelation(std::vector> &SingleChannelData, + std::vector> &Sequence, + std::vector> &CorrelationResults); + + // 计算是否有峰值(满足峰值条件) + // 输入 前一步计算得到的 相关数据CorrelationResults + // 返回值 1--找到相关峰 0--未找到相关峰 + int CalculatePeaks( + std::vector>> &CorrelationResults); + + // 读取单个序列文件 + void ReadSequenceFile(QString strFileName); + // 字节转换成double + void BytesToDoubleInv(char *buf, int ReadFileLength, + QVector &VecReturn); + #if USE_CUDA - CUDACorrelation* cudaCorrelation; + CUDACorrelation *cudaCorrelation; #endif }; -#endif // CALCULATEMOVINGCORRELATION_H +#endif // CALCULATEMOVINGCORRELATION_H diff --git a/droneifiqparse.cpp b/droneifiqparse.cpp index fcd3354..9c1b568 100644 --- a/droneifiqparse.cpp +++ b/droneifiqparse.cpp @@ -1,170 +1,178 @@ #include "droneifiqparse.h" + #include -DroneIFIQParse::DroneIFIQParse() -{ +DroneIFIQParse::DroneIFIQParse() {} -} +DroneIFIQParse::~DroneIFIQParse() {} -DroneIFIQParse::~DroneIFIQParse() -{ +unsigned int DroneIFIQParse::GetDataSize(char *buf) { + quint32 a = (quint32)(buf[4 + 3] & 0xFF) << 24; + quint32 b = (quint32)(buf[4 + 2] & 0xFF) << 16; + quint32 c = (quint32)(buf[4 + 1] & 0xFF) << 8; + quint32 d = (quint32)(buf[4] & 0xFF); + return a | b | c | d; } -unsigned int DroneIFIQParse::GetDataSize(char* buf) -{ - quint32 a = (quint32)(buf[4 + 3] & 0xFF) << 24; - quint32 b = (quint32)(buf[4 + 2] & 0xFF) << 16; - quint32 c = (quint32)(buf[4 + 1] & 0xFF) << 8; - quint32 d = (quint32)(buf[4] & 0xFF); - - return a | b | c | d; +unsigned int DroneIFIQParse::GetDataTag(char *buf) { + return BytesToIntInv(buf, 8); } -unsigned int DroneIFIQParse::GetDataTag(char *buf) -{ - return BytesToIntInv(buf, 8); -} +float DroneIFIQParse::GetFrequency(char *buf) { + float freq = 0; + memcpy(&freq, buf + 12, 4); -float DroneIFIQParse::GetFrequency(char *buf) -{ - float freq = 0; - memcpy(&freq, buf + 12, 4); - - return freq; + return freq; } -unsigned int DroneIFIQParse::GetSamplePoint(char *buf) -{ - return BytesToIntInv(buf, 20); +unsigned int DroneIFIQParse::GetSamplePoint(char *buf) { + return BytesToIntInv(buf, 20); } -int DroneIFIQParse::GetChannelNumber(char *buf) -{ - return BytesToIntInv(buf, 24); +int DroneIFIQParse::GetChannelNumber(char *buf) { + return BytesToIntInv(buf, 24); } - -void DroneIFIQParse::Resolve8CHDFIQData(char *buf, unsigned int SampleCount, int ChannelCount, QVector > &WholeIdata, QVector > &WholeQdata) -{ - int startpos = 28; - - QVector vecFrameIdata1; - vecFrameIdata1.reserve(SampleCount); - QVector vecFrameQdata1; - vecFrameQdata1.reserve(SampleCount); - QVector vecFrameIdata2; - vecFrameIdata2.reserve(SampleCount); - QVector vecFrameQdata2; - vecFrameQdata2.reserve(SampleCount); - QVector vecFrameIdata3; - vecFrameIdata3.reserve(SampleCount); - QVector vecFrameQdata3; - vecFrameQdata3.reserve(SampleCount); - QVector vecFrameIdata4; - vecFrameIdata4.reserve(SampleCount); - QVector vecFrameQdata4; - vecFrameQdata4.reserve(SampleCount); - QVector vecFrameIdata5; - vecFrameIdata5.reserve(SampleCount); - QVector vecFrameQdata5; - vecFrameQdata5.reserve(SampleCount); - QVector vecFrameIdata6; - vecFrameIdata6.reserve(SampleCount); - QVector vecFrameQdata6; - vecFrameQdata6.reserve(SampleCount); - QVector vecFrameIdata7; - vecFrameIdata7.reserve(SampleCount); - QVector vecFrameQdata7; - vecFrameQdata7.reserve(SampleCount); - QVector vecFrameIdata8; - vecFrameIdata8.reserve(SampleCount); - QVector vecFrameQdata8; - vecFrameQdata8.reserve(SampleCount); - - int dataindex = 0; - - for (int k = 0; k < SampleCount; ++k) // 理论上 这是 一次 的 所有Idata1 Qdata1 Idata2 Qdata2 - { - vecFrameIdata1.push_back(BytesToShortInv(buf, startpos + 0 + dataindex)); - vecFrameQdata1.push_back(BytesToShortInv(buf, startpos + 2 + dataindex)); - - vecFrameIdata2.push_back(BytesToShortInv(buf, startpos + 4 + dataindex)); - vecFrameQdata2.push_back(BytesToShortInv(buf, startpos + 6 + dataindex)); - - vecFrameIdata3.push_back(BytesToShortInv(buf, startpos + 8 + dataindex)); - vecFrameQdata3.push_back(BytesToShortInv(buf, startpos + 10 + dataindex)); - - vecFrameIdata4.push_back(BytesToShortInv(buf, startpos + 12 + dataindex)); - vecFrameQdata4.push_back(BytesToShortInv(buf, startpos + 14 + dataindex)); - - vecFrameIdata5.push_back(BytesToShortInv(buf, startpos + 16 + dataindex)); - vecFrameQdata5.push_back(BytesToShortInv(buf, startpos + 18 + dataindex)); - - vecFrameIdata6.push_back(BytesToShortInv(buf, startpos + 20 + dataindex)); - vecFrameQdata6.push_back(BytesToShortInv(buf, startpos + 22 + dataindex)); - - vecFrameIdata7.push_back(BytesToShortInv(buf, startpos + 24 + dataindex)); - vecFrameQdata7.push_back(BytesToShortInv(buf, startpos + 26 + dataindex)); - - vecFrameIdata8.push_back(BytesToShortInv(buf, startpos + 28 + dataindex)); - vecFrameQdata8.push_back(BytesToShortInv(buf, startpos + 30 + dataindex)); - - dataindex += 32; +void DroneIFIQParse::ResolveIQData( + char *buf, unsigned int SampleCount, int ChannelCount, + std::vector>> &vecsignal) { + int startpos = 28; + int offset = 4 * ChannelCount; + + for (int c = 0; c < ChannelCount; ++c) { + std::vector> channelData; + channelData.reserve(SampleCount); + for (int k = 0; k < SampleCount; ++k) { + channelData.emplace_back( + BytesToShortInv(buf, startpos + k * offset + c * 4 + 0), + BytesToShortInv(buf, startpos + k * offset + c * 4 + 2)); } + vecsignal[c] = std::move(channelData); + } +} - // 按顺序 将本轮的 FrameIdata1 FrameQdata1 FrameIdata2 FrameQdata2 FrameIdata3 FrameQdata3 FrameIdata4 FrameQdata4 放入到 总 vector - // 一次 各塞入四行数据 - WholeIdata.push_back(vecFrameIdata1); - WholeQdata.push_back(vecFrameQdata1); - WholeIdata.push_back(vecFrameIdata2); - WholeQdata.push_back(vecFrameQdata2); - WholeIdata.push_back(vecFrameIdata3); - WholeQdata.push_back(vecFrameQdata3); - WholeIdata.push_back(vecFrameIdata4); - WholeQdata.push_back(vecFrameQdata4); - WholeIdata.push_back(vecFrameIdata5); - WholeQdata.push_back(vecFrameQdata5); - WholeIdata.push_back(vecFrameIdata6); - WholeQdata.push_back(vecFrameQdata6); - WholeIdata.push_back(vecFrameIdata7); - WholeQdata.push_back(vecFrameQdata7); - WholeIdata.push_back(vecFrameIdata8); - WholeQdata.push_back(vecFrameQdata8); - - vecFrameIdata1.clear(); - vecFrameQdata1.clear(); - vecFrameIdata2.clear(); - vecFrameQdata2.clear(); - vecFrameIdata3.clear(); - vecFrameQdata3.clear(); - vecFrameIdata4.clear(); - vecFrameQdata4.clear(); - - vecFrameIdata5.clear(); - vecFrameQdata5.clear(); - vecFrameIdata6.clear(); - vecFrameQdata6.clear(); - vecFrameIdata7.clear(); - vecFrameQdata7.clear(); - vecFrameIdata8.clear(); - vecFrameQdata8.clear(); +void DroneIFIQParse::Resolve8CHDFIQData(char *buf, unsigned int SampleCount, + int ChannelCount, + QVector> &WholeIdata, + QVector> &WholeQdata) { + int startpos = 28; + + QVector vecFrameIdata1; + vecFrameIdata1.reserve(SampleCount); + QVector vecFrameQdata1; + vecFrameQdata1.reserve(SampleCount); + QVector vecFrameIdata2; + vecFrameIdata2.reserve(SampleCount); + QVector vecFrameQdata2; + vecFrameQdata2.reserve(SampleCount); + QVector vecFrameIdata3; + vecFrameIdata3.reserve(SampleCount); + QVector vecFrameQdata3; + vecFrameQdata3.reserve(SampleCount); + QVector vecFrameIdata4; + vecFrameIdata4.reserve(SampleCount); + QVector vecFrameQdata4; + vecFrameQdata4.reserve(SampleCount); + QVector vecFrameIdata5; + vecFrameIdata5.reserve(SampleCount); + QVector vecFrameQdata5; + vecFrameQdata5.reserve(SampleCount); + QVector vecFrameIdata6; + vecFrameIdata6.reserve(SampleCount); + QVector vecFrameQdata6; + vecFrameQdata6.reserve(SampleCount); + QVector vecFrameIdata7; + vecFrameIdata7.reserve(SampleCount); + QVector vecFrameQdata7; + vecFrameQdata7.reserve(SampleCount); + QVector vecFrameIdata8; + vecFrameIdata8.reserve(SampleCount); + QVector vecFrameQdata8; + vecFrameQdata8.reserve(SampleCount); + + int dataindex = 0; + + for (int k = 0; k < SampleCount; ++k) // 理论上 这是 一次 的 所有Idata1 Qdata1 Idata2 Qdata2 + { + vecFrameIdata1.push_back(BytesToShortInv(buf, startpos + 0 + dataindex)); + vecFrameQdata1.push_back(BytesToShortInv(buf, startpos + 2 + dataindex)); + + vecFrameIdata2.push_back(BytesToShortInv(buf, startpos + 4 + dataindex)); + vecFrameQdata2.push_back(BytesToShortInv(buf, startpos + 6 + dataindex)); + + vecFrameIdata3.push_back(BytesToShortInv(buf, startpos + 8 + dataindex)); + vecFrameQdata3.push_back(BytesToShortInv(buf, startpos + 10 + dataindex)); + + vecFrameIdata4.push_back(BytesToShortInv(buf, startpos + 12 + dataindex)); + vecFrameQdata4.push_back(BytesToShortInv(buf, startpos + 14 + dataindex)); + + vecFrameIdata5.push_back(BytesToShortInv(buf, startpos + 16 + dataindex)); + vecFrameQdata5.push_back(BytesToShortInv(buf, startpos + 18 + dataindex)); + + vecFrameIdata6.push_back(BytesToShortInv(buf, startpos + 20 + dataindex)); + vecFrameQdata6.push_back(BytesToShortInv(buf, startpos + 22 + dataindex)); + + vecFrameIdata7.push_back(BytesToShortInv(buf, startpos + 24 + dataindex)); + vecFrameQdata7.push_back(BytesToShortInv(buf, startpos + 26 + dataindex)); + + vecFrameIdata8.push_back(BytesToShortInv(buf, startpos + 28 + dataindex)); + vecFrameQdata8.push_back(BytesToShortInv(buf, startpos + 30 + dataindex)); + + dataindex += 32; + } + + // 按顺序 将本轮的 FrameIdata1 FrameQdata1 FrameIdata2 FrameQdata2 + // FrameIdata3 FrameQdata3 FrameIdata4 FrameQdata4 放入到 总 vector 一次 + // 各塞入四行数据 + WholeIdata.push_back(vecFrameIdata1); + WholeQdata.push_back(vecFrameQdata1); + WholeIdata.push_back(vecFrameIdata2); + WholeQdata.push_back(vecFrameQdata2); + WholeIdata.push_back(vecFrameIdata3); + WholeQdata.push_back(vecFrameQdata3); + WholeIdata.push_back(vecFrameIdata4); + WholeQdata.push_back(vecFrameQdata4); + WholeIdata.push_back(vecFrameIdata5); + WholeQdata.push_back(vecFrameQdata5); + WholeIdata.push_back(vecFrameIdata6); + WholeQdata.push_back(vecFrameQdata6); + WholeIdata.push_back(vecFrameIdata7); + WholeQdata.push_back(vecFrameQdata7); + WholeIdata.push_back(vecFrameIdata8); + WholeQdata.push_back(vecFrameQdata8); + + vecFrameIdata1.clear(); + vecFrameQdata1.clear(); + vecFrameIdata2.clear(); + vecFrameQdata2.clear(); + vecFrameIdata3.clear(); + vecFrameQdata3.clear(); + vecFrameIdata4.clear(); + vecFrameQdata4.clear(); + + vecFrameIdata5.clear(); + vecFrameQdata5.clear(); + vecFrameIdata6.clear(); + vecFrameQdata6.clear(); + vecFrameIdata7.clear(); + vecFrameQdata7.clear(); + vecFrameIdata8.clear(); + vecFrameQdata8.clear(); } -short DroneIFIQParse::BytesToShortInv(char* buf, int startpos) -{ - short a = (short)(buf[startpos + 1] & 0xff) << 8; - short b = (short)(buf[startpos] & 0xff); +short DroneIFIQParse::BytesToShortInv(char *buf, int startpos) { + short a = (short)(buf[startpos + 1] & 0xff) << 8; + short b = (short)(buf[startpos] & 0xff); - return a | b; + return a | b; } -int DroneIFIQParse::BytesToIntInv(char* buf, int startpos) -{ - int a = (int)(buf[startpos + 3] & 0xff) << 24; - int b = (int)(buf[startpos + 2] & 0xff) << 16; - int c = (int)(buf[startpos + 1] & 0xff) << 8; - int d = (int)(buf[startpos] & 0xff); +int DroneIFIQParse::BytesToIntInv(char *buf, int startpos) { + int a = (int)(buf[startpos + 3] & 0xff) << 24; + int b = (int)(buf[startpos + 2] & 0xff) << 16; + int c = (int)(buf[startpos + 1] & 0xff) << 8; + int d = (int)(buf[startpos] & 0xff); - return a | b | c | d; + return a | b | c | d; } diff --git a/droneifiqparse.h b/droneifiqparse.h index ea83dd6..556cfe5 100644 --- a/droneifiqparse.h +++ b/droneifiqparse.h @@ -2,24 +2,32 @@ #define DRONEIFIQPARSE_H #include +#include +#include -class DroneIFIQParse -{ -public: - DroneIFIQParse(); - ~DroneIFIQParse(); +class DroneIFIQParse { + public: + DroneIFIQParse(); + ~DroneIFIQParse(); - unsigned int GetDataSize(char* buf); - unsigned int GetDataTag(char* buf); - float GetFrequency(char* buf); - unsigned int GetSamplePoint(char* buf); - int GetChannelNumber(char* buf); + unsigned int GetDataSize(char* buf); + unsigned int GetDataTag(char* buf); + float GetFrequency(char* buf); + unsigned int GetSamplePoint(char* buf); + int GetChannelNumber(char* buf); - void Resolve8CHDFIQData(char* buf, unsigned int SampleCount, int ChannelCount, QVector>& WholeIdata, QVector>& WholeQdata); + void ResolveIQData(char* buf, unsigned int SampleCount, int ChannelCount, + std::vector>>& vecsignal); -private: - short BytesToShortInv(char* buf, int startpos); - int BytesToIntInv(char* buf, int startpos); + void Resolve8CHDFIQData(char* buf, unsigned int SampleCount, int ChannelCount, + QVector>& WholeIdata, + QVector>& WholeQdata); + + std::vector>> vecsignal_; + + private: + short BytesToShortInv(char* buf, int startpos); + int BytesToIntInv(char* buf, int startpos); }; -#endif // DRONEIFIQPARSE_H +#endif // DRONEIFIQPARSE_H diff --git a/log.h b/log.h index 2428f9b..5098bba 100644 --- a/log.h +++ b/log.h @@ -4,26 +4,29 @@ #include // 日志级别映射 -#define DEBUG 0 -#define INFO 1 +#define DEBUG 0 +#define INFO 1 #define WARNING 2 -#define ERROR 3 +#define ERROR 3 #ifndef LOG_LEVEL // 允许通过编译器参数覆盖 - #if defined(NDEBUG) - #define LOG_LEVEL ERROR - #else - #define LOG_LEVEL DEBUG - #endif +#if defined(NDEBUG) +#define LOG_LEVEL ERROR +#else +#define LOG_LEVEL DEBUG +#endif #endif //=======1=========== #if defined(_DEBUG) || defined(DEBUG) - #define DEBUG_LOG(fmt, ...) \ - fprintf(stderr, "\033[33m[DEBUG]\033[0m \033[36m%s:%d\033[0m|\033[32m%s()\033[0m - " fmt "\n", \ - __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__) +#define DEBUG_LOG(fmt, ...) \ + fprintf( \ + stderr, \ + "\033[33m[DEBUG]\033[0m \033[36m%s:%d\033[0m|\033[32m%s()\033[0m - " fmt \ + "\n", \ + __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__) #else - #define DEBUG_LOG(fmt, ...) ((void)0) +#define DEBUG_LOG(fmt, ...) ((void)0) #endif //========2========== @@ -49,7 +52,8 @@ // localtime_r(&_now, &_tm); \ // char _ts[32]; \ // strftime(_ts, sizeof(_ts), "%Y-%m-%d %H:%M:%S", &_tm); \ -// fprintf(stderr, "\033[36m[%s]\033[0m \033[33m%s:%d\033[0m|\033[35m%s()\033[0m - " fmt "\n", \ +// fprintf(stderr, "\033[36m[%s]\033[0m +// \033[33m%s:%d\033[0m|\033[35m%s()\033[0m - " fmt "\n", \ // _ts, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \ // } \ // } while(0) @@ -81,16 +85,19 @@ // #define LOG(level, fmt, ...) \ // do { \ // if (level >= LOG_LEVEL) { \ -// const char* _color[] = {"\033[34m", "\033[32m", "\033[33m", "\033[31m"}; \ +// const char* _color[] = {"\033[34m", "\033[32m", "\033[33m", +// "\033[31m"}; \ // std::lock_guard lock(log_mutex); \ // time_t _now = time(nullptr); \ // struct tm _tm; \ // localtime_r(&_now, &_tm); \ // char _ts[32]; \ // strftime(_ts, sizeof(_ts), "%T", &_tm); \ -// fprintf(stderr, "%s[%-7s]\033[0m \033[90m%s %s:%d\033[0m\n -> " fmt "\n\n", \ +// fprintf(stderr, "%s[%-7s]\033[0m \033[90m%s %s:%d\033[0m\n -> " +// fmt "\n\n", \ // _color[level], \ -// (const char*[]){"DEBUG", "INFO", "WARNING", "ERROR"}[level], \ +// (const char*[]){"DEBUG", "INFO", "WARNING", "ERROR"}[level], +// \ // _ts, __FILE__, __LINE__, ##__VA_ARGS__); \ // } \ // } while(0) @@ -98,45 +105,47 @@ //=======4=========== // 日志开关控制(在CMakeLists.txt或编译命令中定义) #ifndef LOG_ENABLE - #ifdef NDEBUG - #define LOG_ENABLE 0 // Release模式默认关闭 - #else - #define LOG_ENABLE 1 // Debug模式默认开启 - #define LOG_USE_COLOR - #endif +#ifdef NDEBUG +#define LOG_ENABLE 0 // Release模式默认关闭 +#else +#define LOG_ENABLE 1 // Debug模式默认开启 +#define LOG_USE_COLOR +#endif #endif // 颜色输出控制(Unix/Linux/macOS有效) #ifdef LOG_USE_COLOR - #define LOG_COLOR_RED "\033[31m" - #define LOG_COLOR_GREEN "\033[32m" - #define LOG_COLOR_RESET "\033[0m" +#define LOG_COLOR_RED "\033[31m" +#define LOG_COLOR_GREEN "\033[32m" +#define LOG_COLOR_RESET "\033[0m" #else - #define LOG_COLOR_RED "" - #define LOG_COLOR_GREEN "" - #define LOG_COLOR_RESET "" +#define LOG_COLOR_RED "" +#define LOG_COLOR_GREEN "" +#define LOG_COLOR_RESET "" #endif // 核心日志宏 #if LOG_ENABLE - #define LOG(fmt, ...) \ - do { \ - time_t _t = time(NULL); \ - struct tm _tm; \ - localtime_r(&_t, &_tm); \ - char _ts[20]; \ - strftime(_ts, sizeof(_ts), "%Y-%m-%d %H:%M:%S", &_tm); \ - fprintf(stderr, LOG_COLOR_GREEN "[%s] " LOG_COLOR_RESET \ - "%s:%d|%s() " LOG_COLOR_RED ">> " LOG_COLOR_RESET fmt "\n", \ - _ts, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \ - } while(0) +#define LOG(fmt, ...) \ + do { \ + time_t _t = time(NULL); \ + struct tm _tm; \ + localtime_r(&_t, &_tm); \ + char _ts[20]; \ + strftime(_ts, sizeof(_ts), "%Y-%m-%d %H:%M:%S", &_tm); \ + fprintf(stderr, \ + LOG_COLOR_GREEN "[%s] " LOG_COLOR_RESET \ + "%s:%d|%s() " LOG_COLOR_RED \ + ">> " LOG_COLOR_RESET fmt "\n", \ + _ts, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \ + } while (0) #else - #define LOG(fmt, ...) ((void)0) +#define LOG(fmt, ...) ((void)0) #endif -#define LOGF(level, fmt, ...) \ - if (LOG_ENABLE && (level) >= LOG_LEVEL) \ - LOG("[%s] " fmt, #level, ##__VA_ARGS__) +#define LOGF(level, fmt, ...) \ + if (LOG_ENABLE && (level) >= LOG_LEVEL) \ + LOG("[%s] " fmt, #level, ##__VA_ARGS__) // template // auto log_arg(T&& arg) { @@ -153,4 +162,4 @@ // LOG("[%s] " fmt, #level, log_arg(__VA_ARGS__)) // } while(0) -#endif // LOGING_H \ No newline at end of file +#endif // LOGING_H \ No newline at end of file diff --git a/main.cpp b/main.cpp index 0982d84..8164a94 100644 --- a/main.cpp +++ b/main.cpp @@ -1,82 +1,84 @@ -#include "mainwindow.h" - -#include - -#include -#include +#include #include - +#include #include -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); +#include "mainwindow.h" + +int main(int argc, char *argv[]) { + QApplication a(argc, argv); #if 1 - // 设置日志文件 - QString logFile = QCoreApplication::applicationDirPath() + + // 设置日志文件 + QString logFile = QCoreApplication::applicationDirPath() + #ifdef USE_CUDA - "/cuda_performance.csv"; + "/cuda_performance.csv"; #else - "/openmp_performance.csv"; + "/openmp_performance.csv"; #endif - - static QFile* outFile = new QFile(logFile); - if(outFile->open(QIODevice::WriteOnly | QIODevice::Append)) { - // 写入CSV表头 - outFile->write("Frame,ProcessingTime(ns),Peaks\n"); - static QString lastPeaks; - static QString currentTime; - static int frameCount = -1; + static QFile *outFile = new QFile(logFile); + if (outFile->open(QIODevice::WriteOnly | QIODevice::Append)) { + // 写入CSV表头 + outFile->write("Frame,ProcessingTime(ns),Peaks\n"); - qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &context, const QString &msg) { - // 先输出到控制台以便调试 - fprintf(stderr, "%s\n", msg.toLocal8Bit().constData()); + static QString lastPeaks; + static QString currentTime; + static int frameCount = -1; - if (msg.contains("m_uiCurrentFrame-------------------------------")) { - frameCount = msg.split("m_uiCurrentFrame-------------------------------").last().trimmed().toInt(); - } else if(msg.contains("vecCaculatePeaks")) { - int start = msg.indexOf("std::vector"); - if(start != -1) { - lastPeaks = msg.mid(start); // 只保留从std::vector开始的部分 - } - // 调试输出 - fprintf(stderr, "Found peaks: %s\n", lastPeaks.toLocal8Bit().constData()); - } - else if(msg.contains("tm(ns)")) { - currentTime = msg.split("tm(ns)").last().trimmed(); + qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &context, + const QString &msg) { + // 先输出到控制台以便调试 + fprintf(stderr, "%s\n", msg.toLocal8Bit().constData()); - // 调试输出 - // fprintf(stderr, "FrameCount: %d, Found time: %s, Last peaks: %s\n", - // frameCount, - // lastPeaks.toLocal8Bit().constData(), - // currentTime.toLocal8Bit().constData(), - // lastPeaks.toLocal8Bit().constData()); + if (msg.contains("m_uiCurrentFrame-------------------------------")) { + frameCount = + msg.split("m_uiCurrentFrame-------------------------------") + .last() + .trimmed() + .toInt(); + } else if (msg.contains("vecCaculatePeaks")) { + int start = msg.indexOf("std::vector"); + if (start != -1) { + lastPeaks = msg.mid(start); // 只保留从std::vector开始的部分 + } + // 调试输出 + fprintf(stderr, "Found peaks: %s\n", + lastPeaks.toLocal8Bit().constData()); + } else if (msg.contains("tm(ns)")) { + currentTime = msg.split("tm(ns)").last().trimmed(); - // 检查peaks中是否有非零值 - if(!lastPeaks.isEmpty() && !lastPeaks.contains("std::vector(0, 0, 0, 0, 0, 0, 0, 0)")) { + // 调试输出 + // fprintf(stderr, "FrameCount: %d, Found time: %s, Last peaks: %s\n", + // frameCount, + // lastPeaks.toLocal8Bit().constData(), + // currentTime.toLocal8Bit().constData(), + // lastPeaks.toLocal8Bit().constData()); - QString output = QString("%1,%2,%3\n") - .arg(frameCount) - .arg(currentTime) - .arg(lastPeaks); + // 检查peaks中是否有非零值 + if (!lastPeaks.isEmpty() && + !lastPeaks.contains("std::vector(0, 0, 0, 0, 0, 0, 0, 0)")) { + QString output = QString("%1,%2,%3\n") + .arg(frameCount) + .arg(currentTime) + .arg(lastPeaks); - // 调试输出 - fprintf(stderr, "Writing to file: %s", output.toLocal8Bit().constData()); + // 调试输出 + fprintf(stderr, "Writing to file: %s", + output.toLocal8Bit().constData()); - outFile->write(output.toUtf8()); - outFile->flush(); // 确保立即写入文件 - } - lastPeaks.clear(); // 重置peaks记录 - } - }); - } + outFile->write(output.toUtf8()); + outFile->flush(); // 确保立即写入文件 + } + lastPeaks.clear(); // 重置peaks记录 + } + }); + } #endif - MainWindow w; + MainWindow w; - w.setMinimumSize(200, 200); + w.setMinimumSize(200, 200); - w.show(); - return a.exec(); + w.show(); + return a.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index ed8eed6..572ecb3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,192 +1,195 @@ #include "mainwindow.h" -#include -#include -#include #include - #include - +#include +#include +#include #include #include "log.h" +using namespace std; -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) -{ - InitControlValues(); - InitUI(); - InitConnect(); +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { + InitControlValues(); + InitUI(); + InitConnect(); } MainWindow::~MainWindow() {} +void MainWindow::InitControlValues() { + m_btnCalculate = new QPushButton(QStringLiteral("加载数据计算"), this); -void MainWindow::InitControlValues() -{ - m_btnCalculate = new QPushButton(QStringLiteral("加载数据计算"), this); - - basePath = "/../data1/"; + basePath = "/../data/"; - // 初始化:读取已知序列 - m_calMC.LoadAllSequenceBin(basePath); + // 初始化:读取已知序列 + m_calMC.LoadAllSequenceBin(basePath); } +void MainWindow::InitUI() { setCentralWidget(m_btnCalculate); } -void MainWindow::InitUI() -{ - setCentralWidget(m_btnCalculate); +void MainWindow::InitConnect() { + connect(m_btnCalculate, SIGNAL(clicked()), this, SLOT(SlotCalculateClick())); } -void MainWindow::InitConnect() -{ - connect(m_btnCalculate, SIGNAL(clicked()), this, SLOT(SlotCalculateClick())); +int MainWindow::CalculateRoutine( + const std::vector>> &vecsignal) { + return m_calMC.CalMovingCorrlationRoutine(vecsignal); } -int MainWindow::CalculateRoutine(QVector > &WholeIdata, QVector > &WholeQdata) -{ - return m_calMC.CalMovingCorrlationRoutine(WholeIdata, WholeQdata); +int MainWindow::CalculateRoutine(QVector> &WholeIdata, + QVector> &WholeQdata) { + return m_calMC.CalMovingCorrlationRoutine(WholeIdata, WholeQdata); } -void MainWindow::SlotCalculateClick() -{ - QString strFileName = "20250213105831_Detect_FreqList5720-5750MHz_Span15.36MHz_Point4096_2025-02-13 10-58-31_0.dat"; - // QString strFileName = "20250416100611_Detect_FreqList2390-2480MHz_Span30.72MHz_Point16384_2025-04-16 10-06-11_0_20.dat"; - // QString strFileName = "20250427145930_Detect_FreqList2390-24805725-5850MHz_Span30.72_Point16384_2025-04-27 14-59-30_0_20.dat"; +void MainWindow::SlotCalculateClick() { + QString strFileName = + "20250213105831_Detect_FreqList5720-5750MHz_Span15.36MHz_Point4096_2025-" + "02-13 10-58-31_0.dat"; + // QString strFileName = + // "20250416100611_Detect_FreqList2390-2480MHz_Span30.72MHz_Point16384_2025-04-16 + // 10-06-11_0_20.dat"; QString strFileName = + // "20250427145930_Detect_FreqList2390-24805725-5850MHz_Span30.72_Point16384_2025-04-27 + // 14-59-30_0_20.dat"; - QString strIQFileName = QCoreApplication::applicationDirPath() + basePath + strFileName; + QString strIQFileName = + QCoreApplication::applicationDirPath() + basePath + strFileName; - if (QFile::exists(strIQFileName) != true) { - qDebug()<<__FUNCTION__<< strIQFileName << " 文件不存在"; - return; - } + if (QFile::exists(strIQFileName) != true) { + std::cerr << strIQFileName.toStdString() << ":文件不存在" << std::endl; + return; + } - qDebug()<<__FUNCTION__<< "strIQFileName" << strIQFileName; + qDebug() << __FUNCTION__ << "strIQFileName" << strIQFileName; + + // 获取数据帧头位置 + GetReplayFileHeadPos(strIQFileName, m_vecReplayHeadposDetect, + m_ReplayfilesizeDetect); - // 获取数据帧头位置 - GetReplayFileHeadPos(strIQFileName, m_vecReplayHeadposDetect, m_ReplayfilesizeDetect); - #if defined(USE_CUDA) && defined(USE_PRE_COMPUTE_MODE) - // 初始化:提前计算完所有Sequence的fft - m_calMC.ComputeAllSequence(SamplePoint); + // 初始化:提前计算完所有Sequence的fft + m_calMC.ComputeAllSequence(SamplePoint); #endif - int m_iframeCnt = m_vecReplayHeadposDetect.size(); - qDebug()<<__FUNCTION__ << "m_iframeCnt" << m_iframeCnt; - - // 打开回放文件 - m_ReplayFile.open(strIQFileName.toStdString(), ios::in|ios::binary); - if(!m_ReplayFile) - { - qDebug() << __FUNCTION__ <<"file open error"; - return; + int m_iframeCnt = m_vecReplayHeadposDetect.size(); + qDebug() << __FUNCTION__ << "m_iframeCnt" << m_iframeCnt; + + // 打开回放文件 + m_ReplayFile.open(strIQFileName.toStdString(), ios::in | ios::binary); + if (!m_ReplayFile) { + qDebug() << __FUNCTION__ << "file open error"; + return; + } + + // 循环读取每一帧数据 4096点 + for (int m_uiCurrentFrame = 0; m_uiCurrentFrame < m_iframeCnt; + ++m_uiCurrentFrame) { + if (m_uiCurrentFrame < m_iframeCnt - 1) { + oneframesize = m_vecReplayHeadposDetect.at(m_uiCurrentFrame + 1) - + m_vecReplayHeadposDetect.at(m_uiCurrentFrame); + } else { + oneframesize = m_ReplayfilesizeDetect - + m_vecReplayHeadposDetect.at(m_uiCurrentFrame); } - // 循环读取每一帧数据 4096点 - for (int m_uiCurrentFrame = 0; m_uiCurrentFrame < m_iframeCnt; ++m_uiCurrentFrame) - { - if (m_uiCurrentFrame < m_iframeCnt - 1) - { - oneframesize = m_vecReplayHeadposDetect.at(m_uiCurrentFrame + 1) - m_vecReplayHeadposDetect.at(m_uiCurrentFrame); - } - else - { - oneframesize = m_ReplayfilesizeDetect - m_vecReplayHeadposDetect.at(m_uiCurrentFrame); - } + qDebug() << __FUNCTION__ + << "m_uiCurrentFrame-------------------------------" + << m_uiCurrentFrame; + qDebug() << __FUNCTION__ << "oneframesize-------------------------------" + << oneframesize; - qDebug()<<__FUNCTION__ << "m_uiCurrentFrame-------------------------------" << m_uiCurrentFrame; - qDebug()<<__FUNCTION__ << "oneframesize-------------------------------" << oneframesize; + m_ReplayFile.seekg(m_vecReplayHeadposDetect.at(m_uiCurrentFrame)); - m_ReplayFile.seekg(m_vecReplayHeadposDetect.at(m_uiCurrentFrame)); + char *tempIQdata = new char[oneframesize]; + m_ReplayFile.read(tempIQdata, oneframesize); - char* tempIQdata = new char[oneframesize]; - m_ReplayFile.read(tempIQdata, oneframesize); + // 将读取的字节流 按数据格式解析成 8路 每一路 4096点的 IQ原始数据 + ReplayIQDataParse(tempIQdata); - // 将读取的字节流 按数据格式解析成 8路 每一路 4096点的 IQ原始数据 - ReplayIQDataParse(tempIQdata); + delete[] tempIQdata; + tempIQdata = nullptr; + } - delete []tempIQdata; - tempIQdata = nullptr; - } - - m_ReplayFile.close(); + m_ReplayFile.close(); } - -void MainWindow::GetReplayFileHeadPos(QString ReplayFilePath, std::vector &headPos, qint64 &Replayfilesize) -{ - std::ifstream replayfileforcalculate; - replayfileforcalculate.open(ReplayFilePath.toStdString(), ios::in |ios::binary); - if(!replayfileforcalculate) - { - qDebug() << __FUNCTION__ <<"file open error"; - return; - } - - QFileInfo file_info(ReplayFilePath); - Replayfilesize = file_info.size(); - - char *buff = new char[Replayfilesize]; - replayfileforcalculate.read(buff , Replayfilesize); - SamplePoint = m_droneIQParse.GetSamplePoint(buff); - qDebug()<<__FUNCTION__<<"SamplePoint" << SamplePoint; - - std::string source(buff, Replayfilesize); - string match(cHeader, 4); - - size_t index = 0; - size_t count = 0; - headPos.clear(); - headPos.reserve(5000); - while ((index = source.find(match, index)) < Replayfilesize) - { - unsigned int DataSize = m_droneIQParse.GetDataSize(buff+index); - headPos.push_back(index); - index += 8; - index += DataSize; - count++; - } - - headPos.resize(count); - qDebug() <<__FUNCTION__ << headPos.size(); - - delete []buff; - buff = nullptr; +void MainWindow::GetReplayFileHeadPos(QString ReplayFilePath, + std::vector &headPos, + qint64 &Replayfilesize) { + std::ifstream replayfileforcalculate; + replayfileforcalculate.open(ReplayFilePath.toStdString(), + ios::in | ios::binary); + if (!replayfileforcalculate) { + qDebug() << __FUNCTION__ << "file open error"; + return; + } + + QFileInfo file_info(ReplayFilePath); + Replayfilesize = file_info.size(); + + char *buff = new char[Replayfilesize]; + replayfileforcalculate.read(buff, Replayfilesize); + SamplePoint = m_droneIQParse.GetSamplePoint(buff); + qDebug() << __FUNCTION__ << "SamplePoint" << SamplePoint; + + std::string source(buff, Replayfilesize); + string match(cHeader, 4); + + size_t index = 0; + size_t count = 0; + headPos.clear(); + headPos.reserve(5000); + while ((index = source.find(match, index)) < Replayfilesize) { + unsigned int DataSize = m_droneIQParse.GetDataSize(buff + index); + headPos.push_back(index); + index += 8; + index += DataSize; + count++; + } + + headPos.resize(count); + qDebug() << __FUNCTION__ << headPos.size(); + + delete[] buff; + buff = nullptr; } -void MainWindow::ReplayIQDataParse(char *buf) -{ - QVector> vecIdata; - QVector> vecQdata; - vecIdata.clear(); - vecQdata.clear(); - - unsigned int SamplePoints = m_droneIQParse.GetSamplePoint(buf); - - if (SamplePoints > 0) - { - int channelnumber = m_droneIQParse.GetChannelNumber(buf); // 8->16 16->32 32->64 - - vecIdata.clear(); - vecQdata.clear(); - - if (channelnumber == 32) - { - vecIdata.reserve(8); - vecQdata.reserve(8); - m_droneIQParse.Resolve8CHDFIQData(buf, SamplePoints, channelnumber, vecIdata, vecQdata); - - // qint64 freq = m_droneIQParse.GetFrequency(buf); - - QElapsedTimer tm; - tm.start(); - - // 每帧 4096点 IQ 输入 计算总流程 获得最终结果 1--找到相关峰 0--未找到相关峰 - int result = CalculateRoutine(vecIdata, vecQdata); - - std::cout<<__FUNCTION__<<" result:" << result << " tm(ns):" << tm.nsecsElapsed() << std::endl; - - } +void MainWindow::ReplayIQDataParse(char *buf) { + unsigned int SamplePoints = m_droneIQParse.GetSamplePoint(buf); + if (SamplePoints > 0) { + int channelnumber = + m_droneIQParse.GetChannelNumber(buf); // 8->16 16->32 32->64 + + if (channelnumber == 32) { + // qint64 freq = m_droneIQParse.GetFrequency(buf); + + // QVector> vecIdata; + // QVector> vecQdata; + // vecIdata.reserve(8); + // vecQdata.reserve(8); + // m_droneIQParse.Resolve8CHDFIQData(buf, SamplePoints, channelnumber, + // vecIdata, vecQdata); + // QElapsedTimer tm; + // tm.start(); + // // 每帧 4096点 IQ 输入 + // // 计算总流程 获得最终结果 1--找到相关峰 0--未找到相关峰 + // int result = CalculateRoutine(vecIdata, vecQdata); + + channelnumber = 8; //原逻辑也是只取了前8个通道 + std::vector>> vecsignal( + channelnumber, std::vector>(SamplePoints)); + m_droneIQParse.ResolveIQData(buf, SamplePoints, channelnumber, vecsignal); + + QElapsedTimer tm; + tm.start(); + // 每帧 SamplePoints 个点 IQ 输入 + // 计算总流程 获得最终结果 1--找到相关峰 0--未找到相关峰 + int result = CalculateRoutine(vecsignal); + + std::cout << __FUNCTION__ << " result:" << result + << " tm(ns):" << tm.nsecsElapsed() << std::endl; } + } } diff --git a/mainwindow.h b/mainwindow.h index 991af06..b0db523 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -1,57 +1,61 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H +#include #include - #include -#include #include +#include +#include +#include #include "calculatemovingcorrelation.h" #include "droneifiqparse.h" - -#include using namespace std; -class MainWindow : public QMainWindow -{ - Q_OBJECT +class MainWindow : public QMainWindow { + Q_OBJECT -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); + public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); - void InitControlValues(); - void InitUI(); - void InitConnect(); + void InitControlValues(); + void InitUI(); + void InitConnect(); -private: - // 计算总流程 - int CalculateRoutine(QVector >& WholeIdata, QVector >& WholeQdata); + // 计算总流程 + int CalculateRoutine(QVector> &WholeIdata, + QVector> &WholeQdata); - // 获取测试数据文件中 每一帧数据的帧头下标 - void GetReplayFileHeadPos(QString ReplayFilePath, std::vector &headPos, qint64 &Replayfilesize); + int CalculateRoutine( + const std::vector>> &vecsignal); - // 解析每一帧数据为 8路的 IQ 原始数据 - void ReplayIQDataParse(char *buf); + private: + // 获取测试数据文件中 每一帧数据的帧头下标 + void GetReplayFileHeadPos(QString ReplayFilePath, + std::vector &headPos, + qint64 &Replayfilesize); -private: - QPushButton* m_btnCalculate; + // 解析每一帧数据为 8路的 IQ 原始数据 + void ReplayIQDataParse(char *buf); - CalculateMovingCorrelation m_calMC; - DroneIFIQParse m_droneIQParse; + private: + QPushButton *m_btnCalculate; - char cHeader[4] = {0x00, (char)0xB2, 0x0E, 0x00}; - std::vector m_vecReplayHeadposDetect; - qint64 m_ReplayfilesizeDetect; + CalculateMovingCorrelation m_calMC; + DroneIFIQParse m_droneIQParse; - QString basePath; - ifstream m_ReplayFile; - int oneframesize; - unsigned int SamplePoint; + char cHeader[4] = {0x00, (char)0xB2, 0x0E, 0x00}; + std::vector m_vecReplayHeadposDetect; + qint64 m_ReplayfilesizeDetect; -public slots: - void SlotCalculateClick(); + QString basePath; + ifstream m_ReplayFile; + int oneframesize; + unsigned int SamplePoint; + public slots: + void SlotCalculateClick(); }; -#endif // MAINWINDOW_H +#endif // MAINWINDOW_H -- Gitee