add DN102 sample 25600

This commit is contained in:
zhangsheng 2024-11-27 11:43:39 +08:00
parent c244ec783f
commit 964074f8a9
4 changed files with 93 additions and 6 deletions

View File

@ -183,7 +183,7 @@ public:
void DealWave();
std::vector<float> 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<float>& vecData);
void WriteDatFile(int sampleRate, std::string& strMeasurementID, int iChannel, std::vector<float>& vecData, std::string strProduct,int ACCSampleTime);
float ScaleConvert(int highbit);
void DataExtract(RecvData *p, int id, unsigned int &lowbit, float &n);

View File

@ -24,7 +24,7 @@ std::map<std::string, WaveChannel> 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<float> &vecData) {
void Uart::WriteDatFile(int sampleRate, std::string &strMeasurementID, int iChannel, std::vector<float> &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<float> outputData,outputData2;
if (ACCSampleTime == 1){
outputData = Calculation::fftInterpolate(vecData, outSize);
}else if(ACCSampleTime == 2){
std::vector<float> first_wave = std::vector<float>(vecData.begin(), vecData.begin() + vecData.size()/2);
std::vector<float> second_wave = std::vector<float>(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;

View File

@ -295,3 +295,53 @@ void Calculation::Integration(std::vector<float> &vecData, std::vector<float> &r
_iFFT(realvalue, imagevalue, retData);
}
std::vector<float> Calculation::fftInterpolate(const std::vector<float>& 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<double> 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<float> 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;
}

View File

@ -55,6 +55,8 @@ public:
static void envSpec(std::vector<float>& vecData, std::vector<float>& vecEnvSpecData, int StartFrequency, int EndFrequency);
static void Integration(std::vector<float>& vecData, std::vector<float>& retData, double& resolution);
static std::vector<float> fftInterpolate(const std::vector<float>& input, size_t outputSize);
};
#endif // CALCULATION_HPP_