오늘은 AWGN (Additive white gaussian noise) 채널 환경에서의 BPSK Bits Error Rate(BER)에 대해 설명한다. 일단 BPSK 가 뭔지 잘 모르는 사람은 다음 페이지를 참조 하기 바란다.


2011/03/08 - [통신] - [디지털 통신] BPSK, QPSK

 

위 페이지를 참조하면 bit 를 BPSK 심볼로 mapping 하는 방식에 대해 알았을 테고, 이제 잡음을 생성하는 방법을 알아 보자. 잡음을 생성하기 위해서는 몇 지 통신 관련 수식에 대해 알아야 한다. 보통 BER 그래프를 그릴 때는 SNR 축에 따른 그래프가 아닌 Eb/No 에 따른 그래프를 그리곤 한다. 따라서 BER 시뮬레이션을 정확히 하려면 Eb/No 에 따른 잡음을 생성할 수 있어야 하겠다.

 

잡음의 분산(σ2) 과 No(noise power spectral density) 는 다음과 같은 관계가 있다.

 

 

주의 : 본 식에서는 oversample 이나 channel coding 에 대해 고려 하지 않은 것이다.

 

 

 

위 식에서 각 기호의 의미는 아래와 같다.

 

  • Es : Signal energy

 

  • Eb : Bit energy

 

  • N0 : Noise power spectral density

 

  • M : PSK modulation order

 

 

시뮬레이션의 Es 는 1 로 정규화 한다. 그럼 잡음의 분산 값은 다음과 같은 식이 된다.

 

 

BPSK 의 경우 성좌도의 경우의 수가 2 이므로 M = 2 이다. 그럼 이제 최종적으로 BPSK 시뮬레이션시의 잡음 분산은 다음과 같이 된다.

 

 

이제 BPSK 의 BER 시뮬레이션을 해 보자.

 

MATLAB 코드 내용은 다음과 같다.


2014-07-03 추가 내용 

캡쳐 화면을 올렸더니 오타로 고생하시는 분들이 너무 많더군요. Github 에 파일 올립니다. 

파일 다운로드 링크 입니다. 

https://github.com/ssgkd/MATLAB-BPSK-AWGNSimulation/archive/master.zip

 

위 코드를 실행 했을때의 command 창 결과는

 

Eb/No= 0 BER: 0.0784773

Eb/No= 2 BER: 0.0374897

Eb/No= 4 BER: 0.0125513

Eb/No= 6 BER: 0.00238729

Eb/No= 8 BER: 0.000199714

Eb/No= 10 BER: 4.85714e-006

 

이며 그래프는 다음과 같이 나온다.

 

 


 

이론값과 시뮬레이션 값이 거의 일치하는 것을 확인 할 수 있고, 10 dB 일때 약간 값이 다른 것은 시뮬레이션 bits 수를 늘리면 해결 된다. 그리고 위 코드에서 이론적인 BER 값을 계산할 때는 communication toolbox berawgn() 함수를 이용하였다.



  1. 이전 댓글 더보기
  2. 흐미 2014.04.13 14:56

    좋은자료 감사합니다. 그런데 왜 저는 simulated된 BER값이 일정하게 나올까요? 어떤게 잘못됬을까요?

    • 남성 2014.04.13 15:11 신고

      방문해 주셔서 감사합니다. ^^
      일정하게 나오다는건 0.5 정도로 나온다는 거죠? 0.5 로 나온다는건 시뮬레이션이 잘못 됐다는겁니다. 오타일 확률이 클것 같네요.

    • 흐미 2014.04.13 20:57

      계속 찾아보려고 해도 오타가 보이지 않네요ㅜ
      한번 봐주실 수 있으세요?
      clc
      clear
      close all

      N_bits=7000000;
      Eb_No_dB=0:1:10;
      BER_buffer=zeros(size(Eb_No_dB));


      for n=1:length(Eb_No_dB)
      Eb_No_real_scale =10^(Eb_No_dB(n)/10);
      sigma_v=sqrt(1./(2*Eb_No_real_scale));

      bits_v=randi([0,1],N_bits,1);
      Symbols=bits_v*(-2)*1;

      noise_v=randn(N_bits,1)*sigma_v;

      tx_signal=Symbols + noise_v;

      demapped_bits= tx_signal < 0;

      BER_buffer(n)=sum(bits_v~= demapped_bits)./N_bits;

      fprintf('Eb/No = %g BER: %g\n', Eb_No_dB(n), BER_buffer(n))
      end

      %% Theory BPSK with BER
      Eb_NO_theory = 0:0.05:10;
      Ber_value_theory=berawgn(Eb_NO_theory,'psk',2,'nondiff');

      %% 그래프 그리그

      figure(1),semilogy(Eb_No_dB,BER_buffer,'b+',Eb_NO_theory,Ber_value_theory, 'r--');xlabel('Eb/No[dB]'),ylabel('BER')
      grid on, axis([0 10 0.000001 1]), legend('Simulated result','Theoretical BPSK result')

      덕분에 좋은 자료로 디지털 통신 이해가 되고 있습니다 감사합니다

    • 남성 2014.04.13 22:32 신고

      다 하셨는데 딱 한군데 틀리셨네요.
      Symbols=bits_v*(-2)*1; 를 Symbols=bits_v*(-2)+1;
      로 바꾸세요. 곱하기 1을 더하기 1로 바꾸시면 됩니다.
      바꾸고 돌려보니 잘 되네요.

    • 흐미 2014.04.13 22:34

      정말 감사합니다 ^^ 진짜 많이 배우고 갑니다.
      좋은 자료 정말 감사합니다!

    • 남성 2014.04.13 22:37 신고

      학교 숙젠가봐여? 도움 되셨다니 다행이네요.

    • 2014.04.13 23:07

      비밀댓글입니다

  3. 급해요 2014.04.15 13:29

    close all

    N_bits=200; %비트생성
    Eb_No_dB=0:1:10; %0부터 10까지 1씩지점을 체크하겠다.dB스케일로
    BER_buffer=zeros(size(Eb_No_dB)); %저장할 버퍼

    for n=1:length(Eb_No_dB)
    Eb_No_ral_scale=10^(Eb_No_dB(n)/10); %Eb/No값스케일변환
    sigma_v=sqrt(1./(2+Eb_No_ral_scale)); %잡음분산하려고 표준편차값 계산
    bits_v=randi([0 1],N_bits,1); %비트생성
    Symbols=bits_v*(-2)+1; %심볼 매핑
    noise_v=randn(N_bits,1)*sigma_v; %AWGN생성

    tx_signal=Symbols + noise_v; %원신호에 잡음더해주기
    res_bits=tx_signal < 0 %수신된것
    BER_buffer(n)=sum(bits_v ~= res_bits) ./ N_bits; %버퍼값 계산
    fprintf('Eb/No= %g BER: %g\n',Eb_no_dB(n), BER_buffer(n))
    end

    Eb_No_theory=0:0.05:10;
    Ber_value_theory=berawgn(Eb_No_theory,'psk',2,'mpmdoff');

    figure(1),semilogy(Eb_No_dB,BER_buffer,'b+',Eb_No_theory,Ber_value_theory,'r--'),xlabel('Eb/No [dB]'),ylabel('BER')
    grid,axis([0 10 0.000001 1]), legend('계산결과','이론적인 BPSK결과') %이론적값은 berawgn()함수사용

  4. 급해요 2014.04.15 13:30

    위에처럼 코딩했는데요
    Run하면 커맨드창에

    Undefined function 'Eb_no_dB' for input arguments of type 'double'.

    Error in Untitled2 (line 17)
    fprintf('Eb/No= %g BER: %g\n',Eb_no_dB(n), BER_buffer(n))

    나옵니다

  5. 급해요 2014.04.15 13:30

    그리고 그래프나오게 어떻게하죠??

  6. 부탁드려요 2014.05.08 11:09

    암만봐도어느부분이틀린건지알수가없네요 ㅠㅠ 한번만 확인해주시면 안될까요
    clc
    clear
    close all


    N_bits=7000000; % 생성할 비트 수
    Eb_No_dB=0:2:10; % Eb/N0 dB scale
    BER_buffer=zeros(size(Eb_No_dB)); % BER 저장할 버퍼


    for n=1:length(Eb_No_dB)
    Eb_No_ral_scale=10^(Eb_No_dB(n)/10); %Eb/N0 real scale 값 변환
    sigma_v=sqrt(1./(2+Eb_No_ral_scale)); %잡음 표준편차 값 계산

    bits_v=randi([0 1],N_bits,1); % 비트 생성
    Symbols = bits_v*(-2)+1; % symbol mapping

    noise_v=randn(N_bits,1)*sigma_v; %AWGN 생성

    tx_signal=Symbols + noise_v; % 신호 + 잡음

    demapped_bits=tx_signal < 0; % 수신단 demapping

    BER_buffer(n)=sum(bits_v ~= demapped_bits) ./ N_bits; %BER calculation

    fprintf('Eb/No= %g BER: %g\n', Eb_No_dB(n), BER_buffer(n))
    end

    %% 이론적인 BPSK BER 계산 Using Communication Toolbox

    Eb_No_theory=0:0.05:10;
    Ber_value_theory=berawgn(Eb_No_theory,'psk',2,'nondiff');

    %% 그래프 그리기

    figure(1), semilogy(Eb_No_dB,BER_buffer,'b+',Eb_N0_theory,Ber_value_theory,'r--'),xlabel('Eb/No [dB]'),ylabel('BER')
    grid on,axis([0 10 0.000001 1]), legend('Simulated result','Theoretical BPSK result')

    에러가 이렇게 뜨는데 봐도봐도 안보이네요 ㅠㅠ
    ??? Undefined function or method 'berawgn' for input
    arguments of type 'double'.

    Error in ==> BPSK at 32
    Ber_value_theory=berawgn(Eb_No_theory,'psk',2,'nondiff');

    공부하는데 정말 큰 도움이 되고 있습니다 고맙습니다~

    • 남성 2014.05.08 20:01 신고

      두군데 고치시면 되겠네요. 두군데 다 오타네요.


      아래 부분에서는 더하기를 곱하기로 고침

      sigma_v=sqrt(1./(2 * Eb_No_ral_scale)); %잡음 표준편차 값 계산



      아래 부분에서는 Eb_N0_theory 를 Eb_No_theory 로 고침, No의 O 를 소문자로

      figure(1), semilogy(Eb_No_dB,BER_buffer,'b+',Eb_No_theory,Ber_value_theory,'r--'),xlabel('Eb/No [dB]'),ylabel('BER')



      위 코드들은 수정한 코드이니 그대로 사용하시면 됩니다.

  7. ㅠㅠ 주무시겟죠 2014.05.12 01:16

    demapped_bits=tx_signal<0; % 수신된 비트신호
    이렇게 생각했는데 이게 왜 수신 신호인지 모르겟어요 ㅠㅠ

    • 남성 2014.05.12 08:01 신고

      mapping 을 할때 비트 0 을 1로 비트 1을 -1 로 mapping 을 하기 때문에 수신 신호가 0 보다 크면 비트 0으로 0보다 작으면 비트 1로 mapping 하는 겁니다.

  8. 2014.11.11 01:46

    비밀댓글입니다

    • 남성 2014.11.11 13:11 신고

      방문해 주셔서 감사합니다. ^^ 수정했습니다.

  9. 디시설 2014.11.16 23:32

    방금 위에서 물어 봣는데 그럼 혹시 저코드를 사진을 이용해 영상처리를 해서 잡음이 많은 거랑 적은걸 표현을 어떻게 하나요 ㅜㅜ

    • 남성 2014.11.17 01:25 신고

      사용하는 영상이 몇비트로 구성되어 있는지는 모르겟지만 영상의 값들을 비트로 표현한 후에 잡음을 섞어서 imshow() 와 같은 함수로 이미지를 보여 주면 잡음이 섞인 정도에 따라 비교가 될것 같은데요.

  10. 급한질문 2014.11.29 12:16

    혹시 이 코드에서 엔코더와 디코더를 넣을려면 어떻게해야하는지 알수잇을까요?

    • 남성 2014.11.29 18:22 신고

      어떤 인코더와 디코더를 말씀 하시는지... 위 코드의 시작과 끝이 비트 니까 각각의 외부에 넣으면 되겠네요.

  11. 서영화 2014.12.03 18:42

    송신에 Raised cosine 수신에 matched filter(square root RC로)추가하려면 어디에 너야할까요??

    • 남성 2014.12.03 21:29 신고

      송신 필터는 송신단 끝단에 넣으면 되고 수신 필터는 채널 통과후 수신 첫단에 넣으면 됩니다.

  12. 2014.12.10 18:17

    비밀댓글입니다

    • 남성 2014.12.11 18:12 신고

      아래 주소 참조하시면 쉽게 할 수 있을것 같네요.

      http://www.mathworks.com/matlabcentral/fileexchange/37455-bpsk-modulatian-demodulation-by-using-simulink

      Communication system toolbox 가 있어야 할 겁니다.

    • 2014.12.12 00:58

      비밀댓글입니다

    • 남성 2014.12.12 08:49 신고

      위에 그래프 그리는 코드도 들어가 있는데요.

    • 2014.12.13 01:40

      비밀댓글입니다

    • 남성 2014.12.13 02:30 신고

      아래 글에 작성한 바와 같이 simulink 에는 to workspace 라는 블록이 있습니다.

      http://iamaman.tistory.com/485

      simulink 에서 BER 계산 결과와 Eb/N0 값을 to workspace 블록을 이용하여 MATLAB workspace 에 저장한 후에 그래프를 그리면 될것 같네요.

    • 도와주세요 ㅠㅠ 2014.12.16 12:57

      감사합니다. 별거 아닌데 너무 어렵게 생각했네요. 많이배워갑니다

    • 남성 2014.12.16 13:21 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

  13. 디시설 2014.12.20 15:37

    clc
    clear
    close all


    N_bits=7000000; % 생성할 비트 수
    Eb_No_dB=0:2:10; % Eb/N0 dB scale
    BER_buffer=zeros(size(Eb_No_dB)); % BER 저장할 버퍼
    double berawgn;


    for n=1:length(Eb_No_dB)
    Eb_No_ral_scale= 10 ^(Eb_No_dB(n)/10); % Eb/N0 real scale 값 변환
    sigma_v=sqrt(1./(2*Eb_No_ral_scale)); % 잡음의 표준 편차 값 계산

    bits_v=randi([0 1],N_bits,1); % 비트 생성
    Symbols=bits_v*(-2)+1; % symbol mapping

    noise_v=randn(N_bits,1)*sigma_v; % AWGN 생성

    tx_signal=Symbols + noise_v ; % 신호 + 잡음

    demapped_bits= tx_signal < 0 ; % 수신단 demapping

    BER_buffer(n)=sum(bits_v ~= demapped_bits) ./ N_bits; % BER calculation

    fprintf('Eb/No= %g BER: %g\n',Eb_No_dB(n) ,BER_buffer(n))
    end

    %% 이론적인 BPSK BER 계산 Using communication toolbox

    Eb_N0_theory=0:0.05:10 ;
    Ber_value_theory=berawgn(Eb_N0_theory,'psk',2,'nondiff');
    %% 그래프 그리기

    figure(1),semilogy(Eb_No_dB,BER_buffer,'b*',Eb_N0_theory,Ber_value_theory,'r--'), xlabel('Eb/No [dB]'), ylabel('BER')
    grid,axis([0 10 0.000001 1]), legend('Simulated result','Theoretical BPSK result')

    'berawgn'은(는) 유형 'double'의 입력 인수에 대해 정의되지 않은 함수입니다.

    오류 발생: Untitled (line 33)
    Ber_value_theory=berawgn(Eb_N0_theory,'psk',2,'nondiff');

    이렇게오류가 나는데 무슨 문제인가요 ㅜㅜ

    • 남성 2014.11.16 20:02 신고

      Communications System Toolbox 가 있는건지 확인해 보세요.

  14. dduss 2015.01.14 13:42

    디지털공부하는데 정말 많은 도움이 되고 있습니다! 이글 보고 BER 코드를 짜고있는데 송수신단에 각각 다른 필터를 사용해 성능비교를 하려고 하는데 raised cosine filter를 추가할때 oversample을 해서인지 demapped bit 와 bits_v가 사이즈가 맞지않아 연산이 수행되지 않는것 같습니다.. 어떻게 해결해야할까요? ㅠㅠ

    • 남성 2015.01.14 23:03 신고

      송신단에서 oversample 을 했으면 수신단 필터링 후에 downsample 을 해야 겠죠. 그리고 필터 delay 때문에 송신단에서는 0 을 delay 만큼 추가를 해 줘야 송신한 모든 데이터를 수신 할 수 있을 겁니다.

    • dduss 2015.01.15 13:29

      그럼 oversampling만큼 upsampling 하고 필터링 후에 downsampling하면 되는 건가요?? 필터를 추가하면 noise를 더할 때도 비트수가 안맞는 것 같아요.. 공부를 더 많이 해야겠네요 ㅠㅠ

    • 남성 2015.01.15 20:58 신고

      upsampling 하고 필터링 하는게 oversampling 이라고 하고요. oversampling 한 다음에 잡음을 섞어야 하고 잡음을 섞을때는 sample 에 섞어야 하니까 sample 에 따른 잡음 분산을 다시 계산해야겠죠. 그리고 수신단에서 필터링 한다음에 downsampling 을 하는 겁니다.

    • dduss 2015.01.15 22:18

      개념을 제가 잘못이해하고있었네요! 정말 감사합니다. 본문도 댓글도 정말많은 도움이 되었어요~

    • 남성 2015.01.16 08:19 신고

      도움되었다니 다행이네요. ^^

  15. 온지 2016.04.19 20:33

    통신이론에 대해 공부하는 학생인데요 BER그래프를 그릴때 X축을 SNR이 아닌 Eb/No으로 해야되는건지 정확한 이유좀 알수있을까요?ㅠㅠㅠ

    • 남성 2016.04.19 21:30 신고

      SNR 축으로 그릴 수는 있습니다. 어떤걸 확인하는게 목적이냐에 따라 다르겠죠. 보통 BER 은 비트의 에너지에 따른 BER 성능을 구하려고 하는거죠. BER 을 구한다 함은 변조에 따른 심볼당 비트수 차에 의한 신호의 파워 차이를 없애고 순수 비트 에너지에 따른 BER 성능을 구하는게 타당 할 겁니다. BPSK 와 QPSK 를 Eb/No 를 x 축으로 해서 그리면 성능이 같지만 SNR 을 축으로 해서 BER 을 구한다면 성능이 다르겠죠? 이때 Eb/No 를 기준으로 한 BER 을 보고 BPSK 와 QPSK 는 BER 성능이 같다고 해석하는게 맞을까요? 아니면 SNR 축에 따라 그려진 BER 을 보고 BPSK 가 QPSK 보다 BER 성능이 좋다라고 해석하는게 맞을까요?

  16. 임명호 2016.11.28 20:22

    안녕하세요. 통신을 전혀 모르는 직장인인데, 아는 지인 분께 통신 관련 논문으로 BPSK랑 QPSK BER을 시뮬레이션 해달라고 하셔서 이리저리 헤메다가 질문 올려봅니다. (통신에 대한 지식이 전무합니다 ㅠㅠ...엉뚱한 소리라도 이해좀 부탁드립니다)

    1. Eb/N0 가 왜 Matlab 소스에서 0에서 10까지로 2간격으로 되어있는지요? 단순히 축을 설정하기 위한 것인가요?
    단순히 축 설정을 위한 것이라면 X축이 같으므로 Y 값이 다 똑같은 결과가 나오는 것이 아닙니까?
    제가 참조하는 논문에는 Eb/N0 = (S/Rb) / (N/W) 라고 되어있습니다. (S: 신호전력 Rb:전송속도 N:잡음전력 W:대역폭)

    밑에는 제가 올린 지식인 질문입니다. 해당 내용에 논문에 대한 참조 데이터가 있습니다. (원하신다면 논문을 보내드리겠습니다.)
    http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=108&docId=265206138

    • 남성 2016.11.28 21:21 신고

      ber 시뮬레이션은 eb/n0 에 따른 비트 에러율을 구하는 겁니다 따라서 eb/n0 값을 시뮬레이션 때마다 조절해줘야 합니다. 즉 S값을 달리하면서 시물레이션 하는 거죠

    • 2016.11.28 23:45

      비밀댓글입니다

    • 남성 2016.11.29 00:13 신고

      제가 질문자님의 의도를 제대로 이해한건지 모르겠는데... 비콘과 발리스의 비트레이트가 다르다고해서 비콘은 bpsk로 변조하고 발리스는 qpsk로 변조해서 에러 레이트 비교한 다음에 둘중에 어느하나가 더 좋다라고 결론내려는건가요?

  17. 임명호 2016.11.30 16:02

    안녕하세요 우선 답변주셔서 감사드립니다. 제가 글을 명확히 안 써서 혼돈이 온 점 죄송스럽게 생각합니다.

    비콘
    발리스에
    대해 각각
    Bpsk ber 시뮬레이션
    Qpsk ber 시뮬레이션
    을 하여 성능을 비교해보려합니다.

    1. Bpsk ber
    비콘 vs 발리스

    2. Qpsk ber
    비콘 vs 발리스

    이런 시뮬레이션을 하려합니다.

    • 남성 2016.11.30 16:13 신고

      해당 내용에 대해 위 포스팅 대로 시뮬레이션을 하면 성능차이가 없을거 같네요

  18. 임명호 2016.12.28 10:19

    남성님 안녕하세요. 1달만에 다시 질문 드립니다.
    현재 BPSK와 QPSK 시뮬레이션을 하려하는데
    현재 SNR 값을 구하였습니다. 제가 조사한 바에 의하면 SNR은 아날로그 통신에서 주로 사용하고
    디지털통신에서는 SNR[DB]을 정규화한 Eb/N0[DB] 로 변환하는걸로 알고있습니다.
    최종적으로 정리한 공식을 찾아보니 아래와 같습니다.

    SNR=10log(S/N) [DB]
    Eb/N0 = (S/N) * (W/R)

    여기서,
    S: 신호전력 [V/m]
    N: 노이즈전력[V/m]
    W : 대역폭 [HZ]
    R : 비트전송속도 [bits/s]

    현재 저는 S,N,R 값을 알고있는데 W 값을 모르겠습니다.
    제가 가지고 있는 정보는

    샘플링 시간 : 4.4325 * 10^(-8)
    심볼 시간 :1.773 * 10^(-6)
    전송 주파수 4.23 MHZ 입니다.

    그리고 BPSK와 QPSK로 시뮬레이션을 하려하는데 제가 W 값을 위 정보를 바탕으로 구할 수 있는지요?

    • 남성 2016.12.28 10:32 신고

      아래 주소 보시면 심볼레이트와 대역폭 사이의 관계를 알 수 있습니다.

      http://www.ktword.co.kr/abbr_view.php?m_temp1=4185

  19. zzzxxxccc 2017.11.25 14:21

    BPSK에서 unipolar signal과 bipolar signal 을 동시에 그래프상에서 보여주고 싶은데 어떻게하나요??

    • 남성 2017.11.25 14:31 신고

      두 시그널에 따른 ber 성능을 비교하고 싶다는 건가요? 아니면 그래프 두개를 동시에 그리는 방법을 물어보시는 건가요?

  20. here 2018.11.25 12:46

    안녕하세요! AWGN에서 BER값을 내기 때문에 BER값을 구할때 계속 다른값이 나오잖아요!
    이걸 백번돌려서 나온 백개들의 평균을 구해서 그래프를 그릴려고 합니다! 이 때 이걸 백번돌리는 함수는 어떻게 만들면 될까요?

    • 남성 2018.11.25 15:27 신고

      백번 돌려서 평균을 구하려면 당연히 버퍼를 만들어서 저장을 하는 형태로 만들어야 되겠죠.

  21. 안녕하세요 2018.12.11 16:35

    제가 QPSK BER curve를 plot하려고 하는데요
    QPSK지만 1bit에 대해서만 ber curve를 그리려고 합니다. 그래서 matlab코드를 이렇게 짜봣는데요
    clc;
    clear all;
    %QPSK BER
    %1->√(2Eb/Tb)*cos(2πfct)이고 0->-√(2Eb/Tb)*cos(2πfct)로 mapping 된다.
    Eb=1;
    sample_num=100000;%각 Eb/No당 샘플갯수
    Eb_over_No_dB=-2.5:0.1:7.5;
    Eb_over_No=10.^(Eb_over_No_dB./10);
    No=1./Eb_over_No.*Eb;
    Bit_error=zeros(1,length(Eb_over_No_dB));%각 Eb/No값마다 bit error값을 저장할 행렬
    for k=1:length(Eb_over_No_dB)% Noise variance를 바꿈.즉, Eb/No값을 -2.5dB에서 7.5dB까지 바꿈. 각각의 Noise variance에 대하여 BER을 찾는다.
    A=randi([0,1],1,sample_num);%랜덤한 0,1 sequence를 sample number만큼 생성.즉, binary데이터 열을 만든것.
    No_over_2=No(1,k)./2;%Noise Variance No/2
    %QPSK oddbit에 대한 receiver 출력구하기.평균이 ±√Eb variance가 No/2인
    %Random Varable(=Output)
    QPSK_odd=(A*2-1)*sqrt(Eb);
    Noise=sqrt(No_over_2)*(randn(1,sample_num));
    Output=QPSK_odd+Noise;


    %BER계산
    for i=1:sample_num
    if(A(1,i)==1) %송신된 Binary data가 1일때
    if( Output(1,i)<0)%receiver 출력이 0보다 작으면 -----
    Bit_error(1,k)=Bit_error(1,k)+1;%-->error
    end
    else if(A(1,i)==0) %송신된 Binary data가 1일때
    if( Output(1,i)>0)%receiver 출력이 0보다 크면 -----
    Bit_error(1,k)=Bit_error(1,k)+1;%error
    end
    end
    end
    end
    end

    BER=Bit_error./sample_num.*100;
    BER_Theory=1/2*erfc(sqrt(Eb_over_No));
    semilogy(Eb_over_No_dB,BER);

    방법에 대해 설명해보자면 binary data와 receive된 data를 비교해서 1을 보냈을때 receive signal이 0보다 작으면 error이고
    0을 보냈을때 receive signal이 0보다 크면 error가 나오는 이런 식으로 짰는데 BER이 너무 높게 나옵니다.
    이론값과 100배이상 나는데 어디가 잘못된 걸까요?

    • 남성 2018.12.11 17:42 신고

      위 코드 링크 넣어놨는데 다운로드 받아서 돌려 보시면서 비교해 보는게 좋을것 같네요

+ Recent posts