Created
July 24, 2024 17:11
-
-
Save Adwaith-Rajesh/fb3830a24aa2eb146805d813976ea243 to your computer and use it in GitHub Desktop.
Create Haar Wavelet Transformation Matrix in C
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <math.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#define AT(mat, i, j) mat[((i) * N) + (j)] | |
struct kpq { | |
float k; | |
float p; | |
float q; | |
}; | |
int main(void) { | |
int N; | |
printf("Enter the size of the haar matrix: "); | |
scanf("%d", &N); | |
// n | |
int n = (int)log2(N); | |
// z values | |
float z[N]; | |
for (int i = 0; i < N; i++) { | |
z[i] = (float)i / N; | |
} | |
float haar_mat[N * N]; | |
struct kpq kpq_values[N]; | |
// p and q | |
int kpq_idx = 0; | |
for (int p = 0; p <= n - 1; p++) { | |
if (p == 0) { | |
kpq_values[kpq_idx].p = 0; | |
kpq_values[kpq_idx].q = 0; | |
kpq_values[kpq_idx++].k = 0; | |
kpq_values[kpq_idx].p = 0; | |
kpq_values[kpq_idx].q = 1; | |
kpq_values[kpq_idx++].k = 1; | |
continue; | |
} | |
for (int q = 1; q <= (int)pow(2, p); q++) { | |
kpq_values[kpq_idx].p = p; | |
kpq_values[kpq_idx].q = q; | |
kpq_values[kpq_idx++].k = powf(2, p) + (float)q - 1; | |
} | |
} | |
// make the haar matrix | |
for (int i = 0; i < N; i++) { | |
if (kpq_values[i].k == 0) { | |
// set the entire row to 1 / sqrt(N) | |
for (int j = 0; j < N; j++) { | |
AT(haar_mat, i, j) = ((float)1 / sqrt(N)); | |
} | |
continue; | |
// break; | |
} | |
struct kpq pair = kpq_values[i]; | |
for (int j = 0; j < N; j++) { | |
if (((pair.q - 1) / pow(2, pair.p)) <= z[j] && z[j] < ((pair.q - 0.5) / powf(2, pair.p))) { | |
AT(haar_mat, i, j) = (1.0f / sqrtf(N)) * powf(2, pair.p / 2); | |
} else if (((pair.q - 0.5) / powf(2, pair.p)) <= z[j] && z[j] < (pair.q / powf(2, pair.p))) { | |
AT(haar_mat, i, j) = (1.0f / sqrtf(N)) * -powf(2, pair.p / 2); | |
} else { | |
AT(haar_mat, i, j) = 0; | |
} | |
} | |
} | |
// print the mat | |
for (int i = 0; i < N; i++) { | |
for (int j = 0; j < N; j++) { | |
printf(" %f ", AT(haar_mat, i, j)); | |
} | |
printf("\n"); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment