Example #1
0
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;
}
Example #2
0
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();

}