DAN lab./3학기 - 이동통신

[BPSK, C언어 코드] 신호 송/수신 Simulation

김야키 2021. 9. 7. 15:54

코드 작동 순서

  • 기본적으로 신호는 전송할 때 modulation을 수행
  • Modulation을 수행된 각 bit는 -1 또는 1로 매핑 시켜서 symbol로 전송
  • 수신측에서는 평균이 0이고 표준편차가 1인 노이즈가 더해진 symbol을 수신
  • 수신된 symbol을 dicision을 수행해서 기존의 bit로 변환
  • 수신된 bit와 기존 bit를 계산하는 BER(Bit Error Rate)와 SER(Symbol Error Rate)를 계산
  • 1000000개의 bit를 송/수신 및 BER과 SER을 계산

 

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define PI 3.141592
 
// 복소 평면상의 좌표 (Symbol)
typedef struct {
    // BPSK는 축이 하나만 존재하는 좌표
    double R; // Real
}Signal;
 
// 전송받은 Symbol을 bit로 변환
void Decision_bit(Signal *signal, int* decision_bit);
// Symbol을 전송받은 것으로 간주하여 noise가 추가 됨
void Receive_signal(Signal *signal);
// 평균이 0, 분산이 1인 가우시안 노이즈 생성
double AWGN_generator();
// 가우시안 노이즈에 dB에 따라 변하는 noise power를 곱해서 반환
double noise_gen();
// BPSK Modulation
void BPSK(Signal *signal, int bits);
// 0 또는 1의 bit를 생성
int bit_generator();
 
double db = 0.;
double noise_pow = 0.;
 
int main(int argc, char* args, char** argv) {
 
    // 전송하는 모든 Symbol의 수
    double Total_symbol = 1e+06;
    
    // 전송하는 bit
    int bit = 0;
    // 전송받아 판별된 bit
    int decision_bit = 0;
 
    // 전송되는 Symbol
    Signal signal;
 
    double Bit_Error_Counter;
 
    // dB 스케일된 Eb/N0를 증가시키는 반복문
    for (db; db < 20; db++) {
 
        // 시뮬레이션 dB로 만들도록 EbN0에서 noise power를 조절
        noise_pow = pow(10.0-((double)db / 10.0));
 
        Bit_Error_Counter = 0.;
 
        // 모든 Symbol수 만큼 반복
        for (int j = 0; j < Total_symbol; j++) {
 
            // BPSK: 1bit
            bit = bit_generator();
            BPSK(&signal, bit);  // Modulation
            Receive_signal(&signal);    // Symbol 받음
            Decision_bit(&signal, &decision_bit);    // Symbol을 bit로 변환
 
            // bit가 다르면 Bit_Error_Counter를 1씩 증가
            if (decision_bit != bit) {
                Bit_Error_Counter++;
            }
        }
 
        // Bit Error Rate를 계산
        double BER = Bit_Error_Counter / (double)Total_symbol;
        // 출력
        printf("%f\n", BER);
 
        // BER이 0이면 종료 (굳이 끝까지 반복할 필요는 없음)
        if (BER == 0.0) {
            return 0;
        }
    }
    return 0;
}
 
void Decision_bit(Signal *signal, int* decision_bit) {
    if (signal->>= 0) // 전송받은 Symbol이 0보다 큰 경우
        *decision_bit = 1; // 판별된 bit는 1
    else // 전송받은 Symbol이 0보다 작은 경우
        *decision_bit = 0; // 판별된 bit는 0
}
 
void Receive_signal(Signal *signal) {
    // 전송 받은 Symbol에는 Noise가 추가 됨
    signal->= signal->+ noise_gen();
}
 
double AWGN_generator()
{
    double temp1;
    double temp2;
    double result;
    int p = 1;
 
    while (p > 0)
    {
        // RAND_MAX = 32757
        temp2 = (rand() / ((double)RAND_MAX));
 
        if (temp2 == 0)
        {// temp2 is >= (RAND_MAX / 2)
            p = 1;
        }// end if
        else
        {// temp2 is < (RAND_MAX / 2)
            p = -1;
        }// end else
 
         //temp2
 
    }// end while()
    temp1 = cos((2.0 * (double)PI) * rand() / ((double)RAND_MAX));
    result = sqrt(-2.0 * log(temp2)) * temp1;
 
    return result;
 
}// end AWGN_generator()
 
double noise_gen()
{
    double awgn_sig = 0.;
    awgn_sig = noise_pow * AWGN_generator();
 
    return awgn_sig;
}
 
void BPSK(Signal *signal, int bits) {
    if (bits == 1) // Bit: 1 -> Symbol: +1
        signal->= 1.0;
    else // Bit: 0 -> Symbol: -1
        signal->= -1.0;
}
 
int bit_generator() {
    return rand() % 2;
}
cs

 

Simulation 결과

BPSK in AWGN

 

Eb/N0 (dB) BPSK
0 0.158716
1 0.104072
2 0.056457
3 0.023073
4 0.005964
5 0.000779
6 0.000033