快速哈达玛变换

快速哈达玛变换

在生成哈达玛矩阵的文章中我已经提到了沃尔什函数,其实也就是快速哈达玛变换,他是针对与压缩感知中压缩过程中对哈达玛矩阵的行进行一个变换,这么做可以更好的压缩图像,并更好的进行解压。

快速哈达玛矩阵的代码实现

简单的实现就是写成二进制表示没然后保存反向格雷码就是新矩阵所对应的行号。

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
#include <stdio.h>
#include <math.h>
#define M 128

int num = 1; //需要转换的数
int number = 0;
int Gray_number(int num_h)
{

int binary[30];//保存反向二进制的值
int Gray[30];//保存反向格雷码

////////////////////
int M_m = M - 1;
int M_num = 0;
while (1)
{
M_m = M_m / 2;
M_num++;
printf("M_num=%d", M_num);
if (M_m == 0)
{
break;
}
}
////////////////////
printf("num_h=%d", num_h);
printf("\n");
int i = 0;
while (1)
{
binary[i] = num_h % 2;
printf("\ni=%d binary[i]=%d\n", i, binary[i]);
num_h = num_h / 2;
i++;
if (num_h == 0)
{
break;
}
}
///////////////
printf("\ni=%d\n", i);
for (i = i; i<M_num; i++)
{
binary[i] = 0;
printf("\ni=%d binary[i]=%d\n", i, binary[i]);
}
////////////
int j = 0;
for (j = 0; j<i; j++)
{
printf("binary[j]=%d %d\n", binary[j], j);
}
printf("\n%d", i);
//得到反向的格雷码
int k = 0, Gray_num = 0;
for (k = 0; k<i - 1; k++)
{
if ((binary[k] - binary[k + 1]) == 0)
{
Gray_num = 0;
}
else
{
Gray_num = 1;
}
Gray[k] = Gray_num;
}
Gray[i - 1] = binary[i - 1];
printf("\nGray\n", i);
for (j = 0; j<i; j++)
{
printf("%d", Gray[j]);
}
printf("\nlast number\n", i);
for (j = 0; j<i; j++)
{
number += Gray[j] * pow((double)2, (int)(i - j - 1));
}
printf("number=%d", number);
printf("\n");
return number;
}

int main()
{
Gray_number(num);
printf("\n");
printf("\n");
printf("\n");
printf("number=%d", number);
}