C++实现拉曼光谱峰拟合代码

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

const double pi = 3.14159265358979323846;

vector<double> RamanSpectrum(const vector<double>& waveNumber, const vector<double>& intensity, double baseline) {
    
    
    //对信号减去baseline
    vector<double> intensityBaselineSubtracted(intensity.size());
    for (int i = 0; i < intensity.size(); ++i) {
    
    
        intensityBaselineSubtracted[i] = intensity[i] - baseline;
    }

    //计算一阶导数
    vector<double> intensityFirstDerivative(intensity.size() - 2);
    for (int i = 1; i < intensityBaselineSubtracted.size() - 1; ++i) {
    
    
        intensityFirstDerivative[i - 1] = (intensityBaselineSubtracted[i + 1] - intensityBaselineSubtracted[i - 1]) / (waveNumber[i + 1] - waveNumber[i - 1]);
    }

    //计算二阶导数
    vector<double> intensitySecondDerivative(intensityFirstDerivative.size() - 2);
    for (int i = 1; i < intensityFirstDerivative.size() - 1; ++i) {
    
    
        intensitySecondDerivative[i - 1] = (intensityFirstDerivative[i + 1] - intensityFirstDerivative[i - 1]) / (waveNumber[i + 1] - waveNumber[i - 1]);
    }

    //计算Raman谱
    vector<double> ramanSpectrum(intensitySecondDerivative.size());
    for (int i = 0; i < intensitySecondDerivative.size(); ++i) {
    
    
        ramanSpectrum[i] = intensitySecondDerivative[i] / pow((waveNumber[i + 1] - waveNumber[i]), 4);
    }

    return ramanSpectrum;
}

int main() {
    
    
    //模拟输入数据
    vector<double> waveNumber = {
    
     0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0 };
    vector<double> intensity = {
    
     0, 0.5, 0.7, 1.2, 1.8, 2.5, 3.1, 3.8, 4.2, 4.5, 4.7 };
    double baseline = 0.5;

    //计算Raman谱
    vector<double> ramanSpectrum = RamanSpectrum(waveNumber, intensity, baseline);

    //输出结果
    for (int i = 0; i < ramanSpectrum.size(); ++i) {
    
    
        cout << "Raman peak " << i << " : " << ramanSpectrum[i] << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_31057589/article/details/130269545