QVector<double> processWavelet(const QVector<double>& data, int numLevels) { // Forward discrete wavelet transformation int originalSize = data.size(); QVector<QVector<double>> details; QVector<double> ecgData = data; for(int level = 0; level < numLevels; ++level) { WaveletTransformationResult result = dwt1(ecgData, Family_Db4); details.append(result.details); ecgData = result.approx; } Q_ASSERT(details.size() == numLevels); // Under ecgData lies last approximation, filter them out for(int i = 0; i < ecgData.size(); ++i) ecgData[i] = 0.0; // Inverse discrete wavelet transformation QVector<double> recomp = ecgData; for(int i = 0; i < details.size(); ++i) { int index = details.size() - 1 - i; int recompSize = index - 1 >= 0 ? details[index - 1].size() : originalSize; recomp = idwt1(recomp, details[index], Family_Db4, recompSize); } return recomp; }
void MainWindow::on_pushButton_3_clicked() { if (vec.size() == 0) return; wt.clear(); int N = vec.size(); double omega = ui->lineEdit->text().toDouble(); double omega1 = omega - omega/N; long double a1 = 1; long double a2 = 20; long double b1 = 1; long double b2 = 20; std::vector<long double> a; std::vector<long double> b; for (int i = 0; i < N; i++) { double x; if (omega != 0) x = i*omega1/N; else x = double(i); wt.push_back(x); } vec1.clear(); /*a1 = wt[1] - wt[0]; a2 = (N - 1)*(wt[1] - wt[0])/2; b1 = wt[2] - wt[1]; b2 = (wt[2] - wt[1])*(N - 1); */ if (omega == 0) omega = 1; a1 = fabs(log(2/omega)); a2 = fabs(log((N - 1)/(2*omega))); b1 = 1/omega; b2 = (N - 1)/omega; int N1 = ui->lineEdit_6->text().toInt(); int N2 = ui->lineEdit_7->text().toInt(); long double h1 = 0.0; long double h2 = 0.0; h1 = (a2 - a1)/(N1 - 1); h2 = (b2 - b1)/(N2 - 1); double x = 0.0; x = a1; a.push_back(x); for (int i = 1; i < N1; i++){ x += h1; a.push_back(x); } x = b1; b.push_back(x); for (int i = 1; i < N2; i++){ x += h2; b.push_back(x); } //if (omega == 0) omega = 1; if (ui->comboBox->currentIndex() == 0){ dwt1(vec, vec1,a,b,(N - 1)/omega);} if (ui->comboBox->currentIndex() == 1){ dwt2(vec, vec1,a,b,(N - 1)/omega);} long double xx = max(vec1); int N3 = vec1.size(); for (int i = 0; i < N3; i++) { for (int j = 0; j < vec1[i].size(); j++){ vec1[i][j] /= xx; vec1[i][j] /= 100; } } if (gr3 != NULL) delete gr3; gr3 = new GraphP(this); gr3->setAxis("time","period"); gr3->setVecX(b); gr3->setVecY(a); gr3->setVecZ(vec1); gr3->setData(); //gr1->setData(); gr3->show(); }