Skip to content

Instantly share code, notes, and snippets.

@Adwaith-Rajesh
Created July 24, 2024 17:11
Show Gist options
  • Save Adwaith-Rajesh/fb3830a24aa2eb146805d813976ea243 to your computer and use it in GitHub Desktop.
Save Adwaith-Rajesh/fb3830a24aa2eb146805d813976ea243 to your computer and use it in GitHub Desktop.
Create Haar Wavelet Transformation Matrix in C
#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