-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprint_stateTABLE_for_Turbo.cpp
More file actions
111 lines (94 loc) · 4.04 KB
/
print_stateTABLE_for_Turbo.cpp
File metadata and controls
111 lines (94 loc) · 4.04 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
#include <stdio.h>
// === 全局定义 ===
// 状态表大小:4个状态 (行),每行存储 [Next(Input=0), Parity(Input=0), Next(Input=1), Parity(Input=1)]
int state_table[4][4];
// 辅助数组:把 0,1,2,3 转换成二进制字符串 "00", "01" 等
const char *bin_str[] = {"00", "01", "10", "11"};
// === 核心逻辑函数 ===
void statetable()
{
int s, u;
// 遍历所有状态 s = 0~3 (00, 01, 10, 11)
for (s = 0; s < 4; s++) {
// 遍历所有输入 u = 0, 1
for (u = 0; u < 2; u++) {
// 1. 解析当前状态位 (s = m1 m0)
int m1 = (s >> 1) & 1;
int m0 = s & 1;
// 2. 反馈多项式逻辑 (Feedback=7 -> 1 + D + D^2)
// a_k 是输入 shift register 的新位 (这也是 Turbo 码中的 d_k)
int a_k = (u + m1 + m0) % 2;
// 3. 前馈多项式逻辑 (Feedforward=5 -> 1 + D^2)
// 输出 parity = a_k (对应1) + m0 (对应D^2)
int parity = (a_k + m0) % 2;
// 4. 计算下一状态 (Next State = a_k m1)
// 寄存器移位:a_k 变成新的高位,原来的 m1 变成低位
int next_s = (a_k << 1) | m1;
// 5. 填表
// 偶数列 [0, 2] 存下一状态
// 奇数列 [1, 3] 存输出校验位 (Parity)
state_table[s][u * 2] = next_s;
state_table[s][u * 2 + 1] = parity;
}
}
}
// === 可视化打印函数 (模仿你的参考风格) ===
void print_statetable_visualization()
{
printf("\n==============================================================\n");
printf(" RSC (1, 5/7) Encoder State Transition Table \n");
printf(" Gen Poly: Feedback=7(111), Feedforward=5(101) \n");
printf("==============================================================\n");
printf("| Current | Input = 0 | Input = 1 |\n");
printf("| State | Next State | Output(v) | Next State | Output(v) |\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 | %d | %s | %d |\n",
bin_str[i], // 当前状态
bin_str[next_0], // 输入0去哪
out_0, // 输入0的校验位
bin_str[next_1], // 输入1去哪
out_1 // 输入1的校验位
);
}
printf("==============================================================\n");
printf("* Output(v) 仅显示校验位 (Parity Bit)。系统位(Systematic) = Input\n\n");
}
// === 打印原始整数表 (用于调试或复制到数组) ===
void print_raw_statetable()
{
printf("\n=== Raw Internal Table (Integers) ===\n");
printf("Format: {Next_0, Out_0, Next_1, Out_1}\n");
printf("--------------------------------------------------\n");
printf(" | Input = 0 | Input = 1 |\n");
printf("State | Next | Output | Next | Output |\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");
}
int main()
{
// 1. 执行计算逻辑
statetable();
// 2. 打印漂亮的可视化表
print_statetable_visualization();
// 3. 打印原始数据表
print_raw_statetable();
return 0;
}