#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;
}
C++实现拉曼光谱峰拟合代码
猜你喜欢
转载自blog.csdn.net/qq_31057589/article/details/130269545
今日推荐
周排行