#include <stdio.h>
#include <stdlib.h>
// 定义卷积码的参数
#define NUM_STATES 4
#define NUM_INPUT_BITS 2
#define NUM_OUTPUT_BITS 2
// 状态转移图和输出函数
int next_state[NUM_STATES][NUM_INPUT_BITS] = {
{0, 2}, // State 00
{1, 3}, // State 01
{0, 2}, // State 10
{1, 3} // State 11
};
int output[NUM_STATES][NUM_INPUT_BITS][NUM_OUTPUT_BITS] = {
{{0, 0}, {3, 3}}, // State 00, Input 0/1
{{3, 3}, {0, 0}}, // State 01, Input 0/1
{{3, 3}, {0, 0}}, // State 10, Input 0/1
{{0, 0}, {3, 3}} // State 11, Input 0/1
};
// 计算汉明距离
int hamming_distance(int x, int y) {
int dist = 0;
while (x || y) {
dist += (x & 1) ^ (y & 1);
x >>= 1;
y >>= 1;
}
return dist;
}
// Viterbi解码函数
void viterbi_decode(int *received_bits, int num_bits) {
int i, j, k;
int metric[NUM_STATES];
int traceback[num_bits][NUM_STATES];
// 初始化路径指标
for (i = 0; i < NUM_STATES; i++) {
metric[i] = 0; // 初始状态路径指标设为0
}
// 逐比特解码
for (i = 0; i < num_bits; i++) {
int input_bit = received_bits[i];
// 更新每个状态的路径指标
for (j = 0; j < NUM_STATES; j++) {
int min_metric = INT_MAX;
int prev_state = -1;
// 计算从前一个状态到当前状态的路径指标
for (k = 0; k < NUM_INPUT_BITS; k++) {
int prev = next_state[j][k];
int out0 = output[prev][0][k];
int out1 = output[prev][1][k];
int dist0 = hamming_distance(out0, input_bit);
int dist1 = hamming_distance(out1, input_bit);
int prev_metric = metric[prev] + (k == 0 ? dist0 : dist1);
// 更新最小路径指标和回溯信息
if (prev_metric < min_metric) {
min_metric = prev_metric;
prev_state = prev;
}
}
// 更新当前状态的路径指标和回溯信息
metric[j] = min_metric;
traceback[i][j] = prev_state;
}
}
// 回溯找到最可能的路径
int best_state = 0;
for (i = 1; i < NUM_STATES; i++) {
if (metric[i] < metric[best_state]) {
best_state = i;
}
}
// 输出解码结果
printf("Decoded output bits:\n");
for (i = num_bits - 1; i >= 0; i--) {
printf("%d ", output[best_state][received_bits[i]][0]);
best_state = traceback[i][best_state];
}
printf("\n");
}
int main() {
int received_bits[] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1}; // 接收到的比特流
int num_bits = sizeof(received_bits) / sizeof(received_bits[0]);
// 使用Viterbi算法进行解码
viterbi_decode(received_bits, num_bits);
return 0;
}