From 964074f8a9c8b8473944735ea35ca96ce9c5dcb2 Mon Sep 17 00:00:00 2001 From: zhangsheng Date: Wed, 27 Nov 2024 11:43:39 +0800 Subject: [PATCH] add DN102 sample 25600 --- uart/uart.hpp | 2 +- uart/uart_feature_parse.cpp | 45 +++++++++++++++++++++++++++++---- utility/calculation.cpp | 50 +++++++++++++++++++++++++++++++++++++ utility/calculation.hpp | 2 ++ 4 files changed, 93 insertions(+), 6 deletions(-) diff --git a/uart/uart.hpp b/uart/uart.hpp index 49a0458..cc7780a 100644 --- a/uart/uart.hpp +++ b/uart/uart.hpp @@ -183,7 +183,7 @@ public: void DealWave(); std::vector DealData(int ichannel, float coe, unsigned int sampleRate, int ACCSampleTime, std::string strProduct); float Calcoe(int ran, int iChannel, std::string& product, int range); - void WriteDatFile(int sampleRate, std::string& strMeasurementID, int iChannel, std::vector& vecData); + void WriteDatFile(int sampleRate, std::string& strMeasurementID, int iChannel, std::vector& vecData, std::string strProduct,int ACCSampleTime); float ScaleConvert(int highbit); void DataExtract(RecvData *p, int id, unsigned int &lowbit, float &n); diff --git a/uart/uart_feature_parse.cpp b/uart/uart_feature_parse.cpp index 97dfe67..1182b0a 100644 --- a/uart/uart_feature_parse.cpp +++ b/uart/uart_feature_parse.cpp @@ -24,7 +24,7 @@ std::map g_mapWaveChannel; unsigned char data[96000] = {0x00}; unsigned char outdata[96000] = {0x00}; unsigned char dealdata[96000] = {0x00}; -char mqttData[512000] = {0}; +char mqttData[1024000] = {0}; void Uart::RecordBattery(std::string &strLongAddr, DataRecvStatic &dataStatic, std::string &nowTimetamp) { char insertSql[1024] = {0}; @@ -800,7 +800,7 @@ void Uart::DealWave() { zlog_info(zct, "m_waveCountX = %d,VecWaveData = %d", m_waveCountX, VecWaveDataX.size()); coe = Calcoe(n, WAVE_X, strProduct, range); vecData = DealData(WAVE_X, coe, sampleRate, ACCSampleTime, strProduct); - WriteDatFile(sampleRate, strMeasurementID, WAVE_X, vecData); + WriteDatFile(sampleRate, strMeasurementID, WAVE_X, vecData,strProduct,ACCSampleTime); m_waveCountX = 0; g_VecWaveDataX.clear(); VecWaveDataX.clear(); @@ -809,7 +809,7 @@ void Uart::DealWave() { zlog_info(zct, "m_waveCountY = %d,VecWaveData = %d", m_waveCountY, VecWaveDataY.size()); coe = Calcoe(n, WAVE_Y, strProduct, range); vecData = DealData(WAVE_Y, coe, sampleRate, ACCSampleTime, strProduct); - WriteDatFile(sampleRate, strMeasurementID, WAVE_Y, vecData); + WriteDatFile(sampleRate, strMeasurementID, WAVE_Y, vecData,strProduct,ACCSampleTime); m_waveCountY = 0; g_VecWaveDataY.clear(); VecWaveDataY.clear(); @@ -818,7 +818,7 @@ void Uart::DealWave() { zlog_info(zct, "m_waveCountZ = %d,VecWaveDataZ = %d", m_waveCountZ, VecWaveDataZ.size()); coe = Calcoe(n, WAVE_Z, strProduct, range); vecData = DealData(WAVE_Z, coe, sampleRate, ACCSampleTime, strProduct); - WriteDatFile(sampleRate, strMeasurementID, WAVE_Z, vecData); + WriteDatFile(sampleRate, strMeasurementID, WAVE_Z, vecData,strProduct,ACCSampleTime); m_waveCountZ = 0; g_VecWaveDataZ.clear(); VecWaveDataZ.clear(); @@ -863,7 +863,7 @@ float Uart::Calcoe(int ran, int iChannel, std::string &product, int range) { return coe; } -void Uart::WriteDatFile(int sampleRate, std::string &strMeasurementID, int iChannel, std::vector &vecData) { +void Uart::WriteDatFile(int sampleRate, std::string &strMeasurementID, int iChannel, std::vector &vecData, std::string product,int ACCSampleTime) { if (vecData.size() <= 0) return; std::string strFileName = ""; char localtimestamp[32] = {0}; @@ -921,6 +921,41 @@ void Uart::WriteDatFile(int sampleRate, std::string &strMeasurementID, int iChan } } fclose(fp); + if (product == "02" && sampleRate == 24000 && iChannel == WAVE_Z){ + sampleRate = 25600; + zlog_info(zct, " sampleRate = %d,product = %s ", sampleRate,product.c_str()); + size_t outSize = 25600; + std::vector outputData,outputData2; + if (ACCSampleTime == 1){ + outputData = Calculation::fftInterpolate(vecData, outSize); + }else if(ACCSampleTime == 2){ + std::vector first_wave = std::vector(vecData.begin(), vecData.begin() + vecData.size()/2); + std::vector second_wave = std::vector(vecData.begin() + vecData.size()/2, vecData.end()); + outputData = Calculation::fftInterpolate(first_wave, outSize); + outputData2 = Calculation::fftInterpolate(second_wave, outSize); + for (size_t i = 0; i < outputData2.size(); i++) + { + outputData.push_back(outputData2[i]); + } + } + zlog_info(zct, " outputData_size %d ", outputData.size()); + float mean = Calculation::mean(outputData); + memset(mqttData,0,sizeof(mqttData)); + id = 0; + for (size_t i = 0; i < outputData.size(); i++) { + frTemp = outputData[i] - mean; + memset(buf, 0x00, sizeof(buf)); + sprintf(buf, "%.2f", frTemp); + if(i != outputData.size() -1){ + strncpy(mqttData + id ,buf,strlen(buf)); + id = id + strlen(buf); + strncpy(mqttData + id,",",1); + id = id + 1; + }else{ + strncpy(mqttData + id ,buf,strlen(buf)); + } + } + } zlog_info(zct, "fopen FIle vecData.size : %d end ", vecData.size()); wave_channel.wave_timestamp = nowTimetamp; g_mapWaveChannel[strMeasurementID] = wave_channel; diff --git a/utility/calculation.cpp b/utility/calculation.cpp index 96db701..ce8679d 100644 --- a/utility/calculation.cpp +++ b/utility/calculation.cpp @@ -295,3 +295,53 @@ void Calculation::Integration(std::vector &vecData, std::vector &r _iFFT(realvalue, imagevalue, retData); } +std::vector Calculation::fftInterpolate(const std::vector& input, size_t outputSize) { + size_t inputSize = input.size(); + double in[inputSize]; + for (size_t i = 0; i < inputSize; i++) { + in[i] = input[i]; + } + // 1. FFTW 初始化 + fftw_complex *freqDomain = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * inputSize); + fftw_complex *paddedFreqDomain = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * outputSize); + fftw_plan forwardPlan = fftw_plan_dft_r2c_1d(inputSize, in, freqDomain, FFTW_ESTIMATE); + + // 2. 执行 FFT + fftw_execute(forwardPlan); + + // 3. 频域插值:扩展频谱 + size_t halfSize = inputSize / 2 + 1; // 实数FFT的对称部分 + for (size_t i = 0; i < halfSize; ++i) { + paddedFreqDomain[i][0] = freqDomain[i][0]; // 实部 + paddedFreqDomain[i][1] = freqDomain[i][1]; // 虚部 + } + for (size_t i = halfSize; i < outputSize - halfSize; ++i) { + paddedFreqDomain[i][0] = 0.0; // 实部填零 + paddedFreqDomain[i][1] = 0.0; // 虚部填零 + } + for (size_t i = outputSize - halfSize; i < outputSize; ++i) { + paddedFreqDomain[i][0] = freqDomain[inputSize - (outputSize - i)][0]; + paddedFreqDomain[i][1] = freqDomain[inputSize - (outputSize - i)][1]; + } + + // 4. IFFT 变换回时域 + std::vector output(outputSize); + fftw_plan inversePlan = fftw_plan_dft_c2r_1d(outputSize, paddedFreqDomain, output.data(), FFTW_ESTIMATE); + fftw_execute(inversePlan); + + // 5. 缩放输出结果 + for (double& val : output) { + val /= outputSize; + } + std::vector output2(outputSize); + for (size_t i = 0; i < outputSize; i++) { + output2[i] = output[i]; + } + // 清理 FFTW + fftw_destroy_plan(forwardPlan); + fftw_destroy_plan(inversePlan); + fftw_free(freqDomain); + fftw_free(paddedFreqDomain); + + return output2; +} diff --git a/utility/calculation.hpp b/utility/calculation.hpp index a6a9e17..3edb050 100644 --- a/utility/calculation.hpp +++ b/utility/calculation.hpp @@ -55,6 +55,8 @@ public: static void envSpec(std::vector& vecData, std::vector& vecEnvSpecData, int StartFrequency, int EndFrequency); static void Integration(std::vector& vecData, std::vector& retData, double& resolution); + + static std::vector fftInterpolate(const std::vector& input, size_t outputSize); }; #endif // CALCULATION_HPP_