반응형
이번 포스팅에서는 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
위 그래프를 보면 이론적인 결과와 근사적으로 일치 함을 확인 할 수 있다.
반응형
'programming language > MATLAB' 카테고리의 다른 글
MATLAB diag(), eye(), zeros(), ones() (2) | 2011.03.27 |
---|---|
MATLAB persistent (2) | 2011.03.27 |
MATLAB contour 등고선 그리기 (0) | 2011.03.27 |
MATLAB, Newton method 를 이용하여 해를 구해 보자 (26) | 2011.03.27 |
MATLAB QPSK BER simulation in AWGN channel (32) | 2011.03.27 |
MATLAB break, continue (0) | 2011.03.26 |
MATLAB piecewise 수식 표현 (0) | 2011.03.26 |
MATLAB global keyword (0) | 2011.03.26 |
MATLAB Tex character 수학 기호 넣기 (0) | 2011.03.25 |
이렇게 바꿔보세요.
Symbols=((bits_v(:,1)*(-2)+1) + i*(bits_v(:,2)*(-2)+1))./sqrt(2);
답글
BPSK QPSK 정말 감사하게 잘 실행되었습니다.
다만 QPSK에서는 비트 2개를 하나는 리얼로 하나는 이미지로 생각해서 처리하셨는데 8PSK에서는 비트 3개라 어떻게 해야 할지 모르겠네요 8PSK에서는 어떻게 해야 할까요?
답글
8 psk 에서도 3 비트를 한 점의 symbol 로 mapping 하시면 됩니다.
아래 주소의 그림처럼 말이죠.
http://commons.wikimedia.org/wiki/File:8PSK_Gray_Coded.svg
방문해 주셔서 감사합니다. ^^
감사합니다.
도움 감사합니다 하지만 실행이 되지 않아서 질문드립니다
답변해주시면 정말 감사하겠습니다.
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 생성
어떤 문제인지 알려주시면 정말 감사하겠습니다!
답글
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')
감사합니다! 정상작동됩니다!
네~ 열심히 공부하세욧 !! 방문해 주셔서 감사합니다. ^^
안녕하세요~ 과제 때문에 들렀다가 오류가 떠서 질문드립니다..ㅠ
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로 바꿔서 입력해보아도 같은 오류 메시지가 뜨는데 어떻게 해야 하나요?
답글
Eb_N0_theory=0:0.05:10 ; 부분에 코드상의 문제는 없습니다.
다른 부분에 문제가 있는것 같은데요.
음.. ㅠㅠ 저기 tx_signal 차원이 [N_bits,1]맞죠?? symbol하구 noise 왜 더하는데 둘이 자꾸 차원이 안맞다구 나오는지 ㅠㅠ
답글
네 맞습니다. 그리고 둘다 복소수 입니다.
저는 sigma(n)으로 고쳐서 곱해주니까다시됏어요.. 그리구 demappping이랑 BER계산 어떻게 하신건가요ㅠㅠ??
답글
demapping은 0 보다 작으면 1 그렇지 않으면 0 으로 demapping 한 거구요. 이론적 ber 게산은 berawgn 이라는 통신 툴박스의 함수를 사용했습니다. 위에 보시다 시피 코드는 저게 다에요.
비밀댓글입니다
답글
아래 포스팅에 답변 합니다.
http://iamaman.tistory.com/1251
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 이라는 에러가 나오면서 그림이 안그려지죠? ㅜㅜ 제발 알려주세요 ㅜㅜㅜㅜ
답글
위 코드에서는 25 번째 줄에 오타가 몇개 있더군요. 아래와 같이 하면 정상적으로 동작 합니다.
fprintf('Eb/No=%g BER:%g\n',Eb_No_dB(n), BER_buffer(n))
위 질문에서 bertool 이라고 얘기하시는데... 위 코드를 m 파일로 작성하시고 bertool 에서 monte carlo simulation 하셨다는 건가요?
답글
먼가 잘 못 이해하고 계신거 같은데... 위 코드는 그냥 m 파일로 돌리면 되는건데요? bertool 안 써도 되는겁니다.
25번째줄 말씀하신대로 수정하고 저장한 후에 bertool 켜서 monte carlo simulation 했는데 또 invalid simulation M-file or model 이라는 에러가 뜨네요 ㅜㅜ 대체 왜 이러는지 모르겠습니다 ㅜ 위에 님이 포스팅하신 것처럼 이론적인 QPSK 그래프와 코드 시뮬레이션 한 값과 비교하는 그래프를 봐야하는데 그게 안뜹니다 ㅜㅜ
비밀댓글입니다
bertool을 사용하신다면 변수명 등을 bertool 에 맞게 써 줘야 하는것 같더군요.
안녕하세요 자료를 찾아보다가 오게 되어서 질문드립니다 ㅠ
제가 지금 설계프로젝트를 하고 있는데요 32QAM을 써서 통신시스템 설계를 진행하고 있는데 awgn만 첨가했을 때
bertool이랑은 전혀 다른 결과가 나와서 문의드립니다.
들어가는 비트 Eb - 채널코딩 한 후 Ec - 변조 한 후 Es로 해서
N0=10.^(EcN0dB(snrindex)/10);
gain=sqrt(N0/2);
noise=randn(200,1)*gain
으로 했는데 bertool보다 훨씬 더 좋게 나오네요,,, 이러면 안되는데,,, awgn 채널을 잘못구성한건가요??
답글
채널 코딩도 들어갔으면 파워 계산 과정에서 채널 코드 레이트에 대한 수치가 반영 되어야 합니다. 채널 코딩시 encoder 의 입력 비트에 비해 출력비트가 더 많이 나오므로 출력의 각 비트당 파워는 줄어들게 되겠죠. 이를 정확히 반영하셔야 정확한 시뮬레이션이 될 겁니다. 이를 제대로 반영안했다면 이론 값보다 당연히 좋게 나오겠죠.
질문이 있는데 qpsk 에서 위에 코드에서 Symbols=(bits_v(:,1)*(-2)+1 + i *(bits_v(:,2)*(-2)+1))./sqrt(2); 루트 2 이걸로 나눠주는데 이건 왜 나눠 주는거죠???
답글
위의 포스팅에서 적어 놨지만 신호의 파워, 여기서는 심볼의 파워를 1로 맞춰주는겁니다.
Symbols = ±1/sqrt(2) ± j · 1/sqrt(2) 이므로 절대값이 1 이라는것을 확인 할 수 있습니다. 심볼 파워를 1로 정규화한 상태에서 잡음의 파워 즉 분산을 계산해서 넣어주는 겁니다.
'berawgn'에는 Communications Toolbox이(가) 필요합니다.
라고 나와서 네이버창에도 통신 툴박스 어떻게 사용하는 건지 안나와서요 ㅠㅠ 이거 해야하는 지 알 수 있을 까요 ㅠㅠ
답글
네 Communications Toolbox 를 설치해야 사용 할 수 있는 함수이고 해당 함수가 없다면 이론적인 BER 수식을 사용하여 함수를 만들어야 합니다.
다시 질문 드려서 죄송한데 이론적인 BER수식을 사용해수 함수를 어떻게 만들어야하는지도 알 수 있을까요 ㅠㅠ 정말 초보고 아는 게 없어서 ㅠㅠㅠ 너무 죄송해요
답글
아래 주소 글에 PSK 의 이론적 BER 코드가 나와 있습니다.
https://iamaman.tistory.com/1251
demapped_bits = [real(tx_signal) imag(tx_signal)] < 0;
혹시 이부분에 대한 설명해주실수 있을까요??
답글
0보다 작으면 비트 1 로 맵핑을 하고 그렇지 않으면 비트 0 으로 맵핑하는 과정입니다.
답글