Skip to content

Commit 1761d46

Browse files
committed
Fixed bug in implementation.
1 parent 4d49573 commit 1761d46

File tree

1 file changed

+35
-13
lines changed

1 file changed

+35
-13
lines changed

source/WangRathjePeakCalculator.cpp

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,34 +42,54 @@ double WangRathjePeakCalculator::calcDurationRms(
4242
duration, oscFreq, oscDamping, siteTransFunc);
4343

4444
bool validTransFunc = false;
45-
validTransFunc &= siteTransFunc.size() == _freqs.size();
46-
// Make sure there are some values greater than 1
47-
if (validTransFunc) {
45+
// Make sure there are some values greater than 1.1
46+
if (siteTransFunc.size() == _freqs.size()) {
4847
for (std::complex<double> stf : siteTransFunc) {
49-
if (abs(abs(stf) - 1.) > 1E-1) {
48+
if (abs(stf) > 1.1) {
5049
validTransFunc = true;
5150
break;
5251
}
5352
}
5453
}
54+
qDebug() << validTransFunc;
5555

5656
// Modify the duration for the soil response
5757
if (validTransFunc) {
58+
// Compute the expected rock oscillator duration
59+
60+
// Equation 4a
61+
const double fLim = 5.274 * std::pow(duration, -0.640);
62+
double ratio = 1;
63+
// Equation 2
64+
if (0.1 <= oscFreq && oscFreq < fLim) {
65+
// Equation 4b
66+
const double dur0 = 31.858 * std::pow(duration, -0.849);
67+
// Equation 4c
68+
const double durMin = 1.009 * duration / (3.583 + duration);
69+
// Equation 3b
70+
const double b = 1 / (dur0 - durMin);
71+
// Equation 3a
72+
const double a = (1 / (dur0 - 1) - b) * (fLim - 0.1);
73+
// Equation 2
74+
ratio = (dur0 - (oscFreq - 0.1) / (a + b * (oscFreq - 0.1)));
75+
}
76+
77+
const double durOscRock = ratio * duration;
78+
79+
// Compute the expected soil oscillator duration
5880
QList<double> modeFreqs;
5981
QList<double> modeAmps;
6082

61-
QVector<double> absSiteTransFunc;
62-
for (std::complex<double> stf : siteTransFunc) {
63-
absSiteTransFunc << abs(stf);
83+
QVector<double> absSiteTransFunc(siteTransFunc.size());
84+
for (int i = 0; i < absSiteTransFunc.size(); ++i) {
85+
absSiteTransFunc[i] = std::abs(siteTransFunc.at(i));
6486
}
6587

6688
// Compute the location of the peaks in the transfer function
6789
const int offset = 2;
6890
bool valid;
6991
for (int i = offset; i < (_freqs.size() - offset); ++i) {
7092
valid = true;
71-
qDebug() << _freqs.at(i) << absSiteTransFunc.at(i);
72-
7393
for (int j = (i - offset); j <= (i + offset); ++j) {
7494
if (j < i) {
7595
valid &= absSiteTransFunc.at(j) < absSiteTransFunc.at(i);
@@ -90,19 +110,21 @@ double WangRathjePeakCalculator::calcDurationRms(
90110
// Amplitude / frequency ratio of the first mode
91111
double afRatio = modeAmps.at(0) / modeFreqs.at(0);
92112

93-
double a;
113+
double incrMax;
94114
double c;
95115
double m;
96116
double incr = 0;
97117
for (int i = 0; i < modeFreqs.size(); ++i) {
98118
c = _coefs.at(i).a * afRatio + _coefs.at(i).b * std::pow(afRatio, 2);
99119
m = _coefs.at(i).d * afRatio + _coefs.at(i).e * std::pow(afRatio, 2);
100-
a = c * std::exp(-duration / m);
101-
incr += (a * std::exp(-std::pow(std::log(oscFreq / modeFreqs.at(i)), 2) /
120+
incrMax = c * std::exp(-duration / m);
121+
incr += (incrMax * std::exp(-std::pow(std::log(oscFreq / modeFreqs.at(i)), 2) /
102122
(2 * std::pow(_coefs.at(i).sd, 2)))
103123
);
104124
}
105-
durationRms += incr;
125+
const double durOscSoil = durOscRock + incr;
126+
qDebug() << oscFreq << durationRms << durationRms * (durOscSoil/ durOscRock);
127+
durationRms *= (durOscSoil / durOscRock);
106128
}
107129
return durationRms;
108130
}

0 commit comments

Comments
 (0)