이번 포스팅에서는 AWGN (Additive white gaussian noise) 채널 환경에서의 QPSK Bits Error Rate(BER)에 성능 검증 simulation 에 대해 설명한다.

 

QPSK 및 잡음의 분산(σ2) 과 No(noise power spectral density) 의 관계에 대한 내용은 다음 포스팅을 참조 하기 바란다.




2011/03/19 - [MATLAB] - MATLAB BPSK BER simulation in AWGN channel


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

 

QPSK 에서는 아래 식의 M =4 이다.

 

 

따라서 다음 식과 같이 정리 된다.

 

 

QPSK 시뮬레이션 시의 주의할 점신호의 파워를 1 로 정규화 해 줘야 하며 잡음 역시 real , imaginary 에 대해 각각 독립적이어야 한다.

 

이제 QPSK 시뮬레이션을 해 보자.

 

  

Command 창의 결과는 다음과 같다.

Eb/No= 0 BER: 0.078801

Eb/No= 2 BER: 0.0374294

Eb/No= 4 BER: 0.0124703

Eb/No= 6 BER: 0.00238721

Eb/No= 8 BER: 0.0001905

Eb/No= 10 BER: 3.07143e-006

 

 

위 그래프를 보면 이론적인 결과와 근사적으로 일치 함을 확인 할 수 있다.


  1. 남성 2012.11.25 18:47 신고

    이렇게 바꿔보세요.

    Symbols=((bits_v(:,1)*(-2)+1) + i*(bits_v(:,2)*(-2)+1))./sqrt(2);

  2. 과객 2013.06.18 23:52

    BPSK QPSK 정말 감사하게 잘 실행되었습니다.
    다만 QPSK에서는 비트 2개를 하나는 리얼로 하나는 이미지로 생각해서 처리하셨는데 8PSK에서는 비트 3개라 어떻게 해야 할지 모르겠네요 8PSK에서는 어떻게 해야 할까요?

    • 남성 2013.06.19 06:45 신고

      8 psk 에서도 3 비트를 한 점의 symbol 로 mapping 하시면 됩니다.

      아래 주소의 그림처럼 말이죠.

      http://commons.wikimedia.org/wiki/File:8PSK_Gray_Coded.svg


      방문해 주셔서 감사합니다. ^^

    • 과객 2013.06.20 20:11

      감사합니다.

  3. 답변부탁드릴게요 2013.11.17 23:06

    도움 감사합니다 하지만 실행이 되지 않아서 질문드립니다
    답변해주시면 정말 감사하겠습니다.

    clc
    clear
    close all

    N_bits=70000000; %생성할 비트 수 / 2
    Eb_No_dB=0:2:10; %Eb_No 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/No real scale 값 반환
    sigma_v=sqrt(1./(4*Eb_No_ral_scale)); %잡음의 표준 편차 값 계산

    bits_v=randi([0 1],N_bits,2); %비트 생성

    Symbols=(bits_v(:,1)*(-2)+1 + i *(bits_v(:,2)*(-2)+1))./sqrt(2); %symbol mapping & normalizat

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

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

    demapped_bits=[real(tx_signal) imag(tx_signal)] < 0; %수신단 demapping

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

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

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

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

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


    제시해주신 코드와 똑같이 작성하려고 노력하였습니다,
    하지만 아래와 같은 오류가 나와서 질문드립니다.

    ??? Error using ==> randn
    Out of memory. Type HELP MEMORY for your options.

    Error in ==> QPSK_BER at 18
    noise_v=(randn(N_bits,1)*sigma_v)+ i * (randn(N_bits,1)*sigma_v); % complex
    AWGN 생성

    어떤 문제인지 알려주시면 정말 감사하겠습니다!

    • 남성 2013.11.17 23:59 신고

      randn() 에서 메모리 에러 나는것은 N_bits 를 너무 크게 줘서 그렇습니다.

      아래 세 부분이 문제더군요.

      다음과 같이 바꾸세요.

      N_bits=7000000; %생성할 비트 수 / 2, 너무 크게 주면 컴퓨터뻗어요.

      tx_signal = Symbols + noise_v; % 신호 + 잡음, 곱하기가 아닙니다.


      % 아래 부분에서는 단순 오타가 좀 있더군요.
      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')

    • 답변부탁드릴게요 2013.11.18 01:06

      감사합니다! 정상작동됩니다!

    • 남성 2013.11.18 01:39 신고

      네~ 열심히 공부하세욧 !! 방문해 주셔서 감사합니다. ^^

  4. 답변좀 부탁드려요 2013.11.20 17:06

    안녕하세요~ 과제 때문에 들렀다가 오류가 떠서 질문드립니다..ㅠ
    Eb_N0_theory=0:0.05:10 ; 이 부분에서요
    다음과 같은 오류가 뜹니다..
    The expression to the left of the equals sign is not a valid target for an assignment.
    Eb_N0 대신 혹시나 해서 Eb_No로 바꿔서 입력해보아도 같은 오류 메시지가 뜨는데 어떻게 해야 하나요?

    • 남성 2013.11.20 18:30 신고

      Eb_N0_theory=0:0.05:10 ; 부분에 코드상의 문제는 없습니다.
      다른 부분에 문제가 있는것 같은데요.

  5. 119 2014.04.01 17:59

    음.. ㅠㅠ 저기 tx_signal 차원이 [N_bits,1]맞죠?? symbol하구 noise 왜 더하는데 둘이 자꾸 차원이 안맞다구 나오는지 ㅠㅠ

  6. 119 2014.04.01 19:58

    저는 sigma(n)으로 고쳐서 곱해주니까다시됏어요.. 그리구 demappping이랑 BER계산 어떻게 하신건가요ㅠㅠ??

    • 남성 2014.04.01 21:23 신고

      demapping은 0 보다 작으면 1 그렇지 않으면 0 으로 demapping 한 거구요. 이론적 ber 게산은 berawgn 이라는 통신 툴박스의 함수를 사용했습니다. 위에 보시다 시피 코드는 저게 다에요.

  7. 2014.04.16 23:14

    비밀댓글입니다

    • 남성 2014.04.17 01:06 신고

      아래 포스팅에 답변 합니다.

      http://iamaman.tistory.com/1251

  8. 공돌공돌 2014.06.06 22:06

    clc
    clear all
    close all

    N_bits=7000000; %생성할 비트 수/2
    Eb_No_dB=0:2:10; %Eb/No 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/No real scale 값 변환
    sigma_v=sqrt(1./(4*Eb_No_ral_scale)); %잡음의 표준 편차 값 계산

    bits_v=randi([0 1],N_bits,2); %비트 생성

    Symbols=(bits_v(:,1)*(-2)+1 +i*(bits_v(:,2)*(-2)+1))./sqrt(2); %symbol mapping & normalization

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

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

    demapped_bits=[real(tx_signal) imag(tx_signal)]<0; %수신단 demapping

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

    fprint('Eb/No=%g BER:%g\n',Eb_No-dB(n), BER_buffer(n))
    end

    % 이론적인 QPSK BER 계산
    Eb_No_theory=0:0.05:10;
    Ber_value_theory=berawgn(Eb_No_theory,'psk',4,'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','Theoritical QPSK result')

    이렇게 했는데 왜 BERTool에서 run 누르면 invalid simulation M-file or model 이라는 에러가 나오면서 그림이 안그려지죠? ㅜㅜ 제발 알려주세요 ㅜㅜㅜㅜ

  9. 남성 2014.06.07 06:07 신고

    위 코드에서는 25 번째 줄에 오타가 몇개 있더군요. 아래와 같이 하면 정상적으로 동작 합니다.

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

    위 질문에서 bertool 이라고 얘기하시는데... 위 코드를 m 파일로 작성하시고 bertool 에서 monte carlo simulation 하셨다는 건가요?

    • 남성 2014.06.07 10:34 신고

      먼가 잘 못 이해하고 계신거 같은데... 위 코드는 그냥 m 파일로 돌리면 되는건데요? bertool 안 써도 되는겁니다.

    • 공돌공돌 2014.06.07 10:35

      25번째줄 말씀하신대로 수정하고 저장한 후에 bertool 켜서 monte carlo simulation 했는데 또 invalid simulation M-file or model 이라는 에러가 뜨네요 ㅜㅜ 대체 왜 이러는지 모르겠습니다 ㅜ 위에 님이 포스팅하신 것처럼 이론적인 QPSK 그래프와 코드 시뮬레이션 한 값과 비교하는 그래프를 봐야하는데 그게 안뜹니다 ㅜㅜ

    • 2014.06.07 10:38

      비밀댓글입니다

    • 남성 2014.06.07 11:51 신고

      bertool을 사용하신다면 변수명 등을 bertool 에 맞게 써 줘야 하는것 같더군요.

  10. 공돌이 2014.06.08 15:36

    안녕하세요 자료를 찾아보다가 오게 되어서 질문드립니다 ㅠ

    제가 지금 설계프로젝트를 하고 있는데요 32QAM을 써서 통신시스템 설계를 진행하고 있는데 awgn만 첨가했을 때

    bertool이랑은 전혀 다른 결과가 나와서 문의드립니다.

    들어가는 비트 Eb - 채널코딩 한 후 Ec - 변조 한 후 Es로 해서

    N0=10.^(EcN0dB(snrindex)/10);
    gain=sqrt(N0/2);
    noise=randn(200,1)*gain

    으로 했는데 bertool보다 훨씬 더 좋게 나오네요,,, 이러면 안되는데,,, awgn 채널을 잘못구성한건가요??

    • 남성 2014.06.08 17:08 신고

      채널 코딩도 들어갔으면 파워 계산 과정에서 채널 코드 레이트에 대한 수치가 반영 되어야 합니다. 채널 코딩시 encoder 의 입력 비트에 비해 출력비트가 더 많이 나오므로 출력의 각 비트당 파워는 줄어들게 되겠죠. 이를 정확히 반영하셔야 정확한 시뮬레이션이 될 겁니다. 이를 제대로 반영안했다면 이론 값보다 당연히 좋게 나오겠죠.

  11. 멍청이 2015.07.22 20:32

    질문이 있는데 qpsk 에서 위에 코드에서 Symbols=(bits_v(:,1)*(-2)+1 + i *(bits_v(:,2)*(-2)+1))./sqrt(2); 루트 2 이걸로 나눠주는데 이건 왜 나눠 주는거죠???

    • 남성 2015.07.23 04:18 신고

      위의 포스팅에서 적어 놨지만 신호의 파워, 여기서는 심볼의 파워를 1로 맞춰주는겁니다.
      Symbols = ±1/sqrt(2) ± j · 1/sqrt(2) 이므로 절대값이 1 이라는것을 확인 할 수 있습니다. 심볼 파워를 1로 정규화한 상태에서 잡음의 파워 즉 분산을 계산해서 넣어주는 겁니다.

+ Recent posts