Bonjour,

Je viens de commencer à implémenter la transformée de Haar d'après les formules expliquées sur http://cgg.mff.cuni.cz/~pepca/lectur...6-wavelets.pdf et ça semble marcher ... du moins tant que j'utilise un signal composé d'un nombre en puissance de 2 ...

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <stdlib.h>
 
int Haar(int *, int , int *, int *);
int UnHaar(int *, int , int *, int *);
void HaarStep(int *, int, int *, int *);
void UnHaarStep(int *, int , int *, int *);
 
 
void HaarStep(int *X, int n2, int *s, int *d)
{
	int k;
 
	for( k = 0 ; k < n2 ; k++, X +=2)
	{
		d[k] = X[1] - X[0];
		s[k] = X[0] + d[k] / 2; 
	}
} 
 
int Haar(int *X, int n, int *s, int *d)
{
	int steps;
 
	for( steps = 0 ; n > 1 ; steps++)
	{
		n /= 2;
		HaarStep(X, n, s, d);
	}
 
	return steps;  
}
 
void UnHaarStep(int *X, int n2, int *s, int *d)
{
	int k;
 
	for( k = 0 ; k < n2 ; k++, X +=2)
	{
		X[0] = s[k] - d[k] / 2;
		X[1] = X[0] + d[k];
	}
} 
 
 
int UnHaar(int *X, int n, int *s, int *d)
{
	int steps, n2 = 1;
 
	for( steps = 0 ; n2 < n ; steps++)
	{
		UnHaarStep(X, n2, s, d);
		n2 *= 2;
	}  
 
	return steps;
}
 
 
int signal[80];
int detail[80];
int smooth[80]; 	
 
int main(int argc, char **argv )
{
	int i, n;
 
	for( i = 1, n = 0 ; i < argc ; i++, n++)
	{
		signal[n] = atoi( argv[i] );
	}
 
 
	printf("Initial signal : \n\n");
	for( i= 0; i < n ; i++)
	{
		printf("\tsignal[%d] = %d \n", i, signal[i] );
	}
 
	printf("\n\nHaar Transform : %d steps \n\n", Haar(signal, n, smooth, detail) );
	for( i= 0; i < n/2 ; i++)
	{
		printf("\tsmooth[%d] = %d  detail[%d] = %d \n", i, smooth[i], i, detail[i] );
	}
 
 
	printf("\n\nReconstructed signal : %d steps \n\n", UnHaar(signal, n, smooth, detail) );
	for( i= 0; i < n ; i++)
	{
		printf("\tsignal[%d] = %d \n", i, signal[i] );
	}
 
 
 
	return 0;
}

Ca se compile très simplement sous Linux et ça donne ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
 
gcc wavelet.c -o wavelet
 
yannoo@Aerocool ~/Dev/Wavelet $ ./wavelet 0 4 2 6 7 8 9 16
Initial signal : 
 
	signal[0] = 0 
	signal[1] = 4 
	signal[2] = 2 
	signal[3] = 6 
	signal[4] = 7 
	signal[5] = 8 
	signal[6] = 9 
	signal[7] = 16 
 
 
Haar Transform : 3 steps 
 
	smooth[0] = 2  detail[0] = 4 
	smooth[1] = 4  detail[1] = 4 
	smooth[2] = 7  detail[2] = 1 
	smooth[3] = 12  detail[3] = 7 
 
 
Reconstructed signal : 3 steps 
 
	signal[0] = 0 
	signal[1] = 4 
	signal[2] = 2 
	signal[3] = 6 
	signal[4] = 7 
	signal[5] = 8 
	signal[6] = 9 
	signal[7] = 16
Les fonctions HaarStep() et UnHaarStep() correspondent-elles bien à ce que l'on appelle le lifting ?

Et comment pourrais-je modifier celà afin de pouvoir gérer un signal contenant un nombre d'échantillons différent d'une puissance de deux ?

Because j'aimerais bien avoir qqchose de fonctionnel avant de commencer à essayer de faire la même chose avec des ondelettes plus complexes du style Legal 5/3 ou Debauchies 9/7 par exemples