#include <stdio.h> #include <stdlib.h> #include <math.h>

#define N 64 // 信号长度 #define LEVELS 5 // 小波变换的层数

// 分解系数 double h0 = (1 + sqrt(3)) / (4 * sqrt(2)); double h1 = (3 + sqrt(3)) / (4 * sqrt(2)); double h2 = (3 - sqrt(3)) / (4 * sqrt(2)); double h3 = (1 - sqrt(3)) / (4 * sqrt(2));

// 重构系数 double g0 = h3; double g1 = -h2; double g2 = h1; double g3 = -h0;

// 小波变换函数 void wavelet(double *x, int n) { int i, j, k; double y = (double)malloc(n * sizeof(double));

for (i = 0; i < n; i++) {
    y[i] = 0;
    for (j = 0; j < 4; j++) {
        k = (i + j) % n;
        y[i] += h0 * x[k];
        y[i] += h1 * x[(k + n/4) % n];
        y[i] += h2 * x[(k + n/2) % n];
        y[i] += h3 * x[(k + 3*n/4) % n];
    }
}

for (i = 0; i < n; i++) {
    x[i] = y[i];
}

free(y);

}

// 小波反变换函数 void iwavelet(double *x, int n) { int i, j, k; double y = (double)malloc(n * sizeof(double));

for (i = 0; i < n; i++) {
    y[i] = 0;
    for (j = 0; j < 4; j++) {
        k = (i + j) % n;
        y[i] += g0 * x[k];
        y[i] += g1 * x[(k + n/4) % n];
        y[i] += g2 * x[(k + n/2) % n];
        y[i] += g3 * x[(k + 3*n/4) % n];
    }
}

for (i = 0; i < n; i++) {
    x[i] = y[i];
}

free(y);

}

// 打印函数 void print(double *x, int n) { int i; for (i = 0; i < n; i++) { printf("%f ", x[i]); } printf("\n"); }

int main() { int i, j; double x[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64};

printf("Original Signal:\n");
print(x, N);

for (i = 0; i < LEVELS; i++) {
    wavelet(x, N / pow(2, i));
}

printf("Wavelet Transform:\n");
print(x, N);

for (i = LEVELS-1; i >= 0; i--) {
    iwavelet(x, N / pow(2, i));
}

printf("Reconstructed Signal:\n");
print(x, N);

return 0;

}

C 代码实现小波 6-5 层算法

原文地址: https://www.cveoy.top/t/topic/oLNQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录