-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprint_stateTABLE.c
More file actions
117 lines (98 loc) · 4.03 KB
/
print_stateTABLE.c
File metadata and controls
117 lines (98 loc) · 4.03 KB
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <stdio.h>
// 定义状态表大小:4个状态,每行存 [Next(0), Out(0), Next(1), Out(1)]
int state_table[4][4];
// 为了打印好看,辅助数组:把 0,1,2,3 转换成 "00", "01", "10", "11"
const char *bin_str[] = {"00", "01", "10", "11"};
void statetable()
{
int s0, s1, u;
//int current_state;
int next_state;
int c1, c2;
// 遍历所有可能的当前状态 (00, 01, 10, 11)
for (int s = 0; s < 4; s++)
{
// 提取二进制位: s = (s0, s1) 也就是 高位是s0, 低位是s1
// 按 PDF Page 3 的移位逻辑:
// 假设 state 整数代表 (s0, s1)
s1 = s & 1; // 取最低位
s0 = (s >> 1) & 1; // 取次低位
// 遍历所有可能的输入 (0 或 1)
for (u = 0; u <= 1; u++)
{
// 电路逻辑
c1 = u ^ s0 ^ s1;
c2 = u ^ s1;
// 下一个状态: s0' = u, s1' = s0
// 新的状态整数 = (u << 1) + s0
next_state = (u << 1) + s0;
// 输出符号 (把 c1 c2 拼成一个整数)
int output = (c1 << 1) + c2;
// --- 填表 ---
// 偶数列(0,2)存下一状态,奇数列(1,3)存输出
state_table[s][u * 2] = next_state;
state_table[s][u * 2 + 1] = output;
}
}
}
// === 可视化打印函数 ===
void print_statetable_visualization()
{
printf("\n==============================================================\n");
printf(" Convolutional Code (7, 5) State Table Check \n");
printf("==============================================================\n");
printf("| Current | Input = 0 | Input = 1 |\n");
printf("| State | Next State | Output | Next State | Output |\n");
printf("|-----------|------------|------------|------------|------------|\n");
for (int i = 0; i < 4; i++)
{
// 获取数据
int next_0 = state_table[i][0];
int out_0 = state_table[i][1];
int next_1 = state_table[i][2];
int out_1 = state_table[i][3];
// 打印一行
printf("| %s | %s | %s (= %d) | %s | %s (= %d) |\n",
bin_str[i], // 当前状态
bin_str[next_0], // 输入0去哪
bin_str[out_0], out_0,// 输入0输出啥
bin_str[next_1], // 输入1去哪
bin_str[out_1], out_1 // 输入1输出啥
);
}
printf("==============================================================\n\n");
}
void print_raw_statetable()
{
printf("\n=== Raw Internal Table (Integers) ===\n");
printf("此表显示 state_table[4][4] 中存储的原始十进制整数\n");
printf("--------------------------------------------------\n");
printf(" | 输入 Input = 0 | 输入 Input = 1 |\n");
printf(" |-----------------------|-----------------------|\n");
printf("State | Next State | Output | Next State | Output |\n");
printf(" [i] | Col [0] | Col [1] | Col [2] | Col [3] |\n");
printf("------+------------+----------+------------+----------+\n");
for (int i = 0; i < 4; i++)
{
printf(" %d | %d | %d | %d | %d |\n",
i, // 当前状态 (行号)
state_table[i][0], // 输入0的下一状态
state_table[i][1], // 输入0的输出
state_table[i][2], // 输入1的下一状态
state_table[i][3] // 输入1的输出
);
}
printf("------+------------+----------+------------+----------+\n");
printf("* Next State: 0~3 代表状态 00~11\n");
printf("* Output: 0~3 代表输出符号 00~11 (十进制)\n\n");
}
int main()
{
// 1. 先初始化表
statetable();
// 2. 打印出来看看
print_statetable_visualization();
// 3. 打印原始整数表以供调试
print_raw_statetable();
return 0;
}