ICIS 학부 연구생/통신시스템 설계
[ 통신시스템설계 심화 ] 2. AES 실습1 txt → binary 변환 후 무선채널 송수신
hanol02
2024. 1. 27. 20:39
2024 ICIS Lab Winter Seminar 정리
실습 1. txt 파일 → Binary 파일
: 매트랩에서 텍스트 파일을 불러와 bit stream으로 바꾸고 무선 채널로 전송한다.
1. readFile() 파일 불러오기
function textString = readFile(filename)
fileID=fopen(filename, 'r'); % 파일 열기
textString=fread(fileID, '*char')'; % 전체 파일 내용을 문자열로 읽기
fclose(fileID); % 파일 닫기
end
plain 텍스트 파일을 불러와 파일을 내용을 출력해본다.
결과 >
2. text2binary() 텍스트 파일 데이터를 이진 데이터로 변환하기 함수
function binaryNumArray=text2binary(textString)
% 문자열의 각 문자를 ASCII 코드 값으로 변환
asciiValues=double(textString);
% ASCII 코드 값을 8bit의 2진수로 변환
binaryStrings=dec2bin(asciiValues, 8);
% 문자 배열을 숫자 배열로 변환
binaryNumArray=binaryStrings-'0';
% 매트랩에서는 문자열에서 문자 '0'을 뺄셈하면 해당 문자의 아스키 코드 값이 반환된다.
% 예를 들어 1011이라는 이진수 문자열에서 문자 0을 빼주면 [1, 0, 1, 1]의 숫자 배열로 변환됨.
% n x m 배열을 1 x m*n 배열로 변환
binaryNumArray=reshape(binaryNumArray', 1, []); % [] 는 매트랩이 열의 개수를 알아서 계산할 것이므로
end
불러온 텍스트 파일을 이진 데이터로 변환하여 출력해본다.
결과 >
3. 변환한 이진 데이터에 FEC 적용 후 QPSK로 송수신하기
% Prepare
SNR=20; SNR_linear=10^(SNR/10);
data_=zeros(1,0); % 최종 복조한 data 저장할 배열
repeat_time=1;
nSymbols=length(original_bit_data); % 전체 '비트' 수
nRows=nSymbols/8; % 전체 '글자' 수
flag=false; % 전체 글자 수가 짝수면 F 홀수면 T
M=4;
% 변조
if M==4
if mod(nSymbols, 2) ~=0 % 글자수가 홀수라면
bit_data=[original_bit_data, 0]; % 비트 배열 맨 뒤에 0 추가
nSymbols=nSymbols+1; % 전체 심볼 수 1 증가
flag=true; % 전체 글자 수는 홀수였다고 flag값 변경
else
bit_data=FEC_enc(original_bit_data, repeat_time);
end
modulated_symbol=QPSK_mapper(bit_data); % QPSK 맵핑
elseif M==16
if mod(nSymbols, 2) ~=0 % 글자수가 홀수라면
bit_data=[original_bit_data, 0]; % 비트 배열 맨 뒤에 0 추가
nSymbols=nSymbols+1; % 전체 심볼 수 1 증가
flag=true; % 전체 글자 수는 홀수였다고 flag값 변경
else
bit_data=FEC_enc(original_bit_data, repeat_time);
end
modulated_symbol=QAM16_mapper(bit_data);
elseif M==2
if mod(nSymbols, 2) ~=0 % 글자수가 홀수라면
bit_data=[original_bit_data, 0]; % 비트 배열 맨 뒤에 0 추가
nSymbols=nSymbols+1; % 전체 심볼 수 1 증가
flag=true; % 전체 글자 수는 홀수였다고 flag값 변경
else
bit_data=FEC_enc(original_bit_data, repeat_time);
end
modulated_symbol=BPSK_mapper(bit_data);
end
%% 송신 시스템 (Transmission System)
% r(n) = h(n)*y(n) + z(n)
transmit_power=SNR_linear;
h=sqrt(1/2)*(randn(1,length(modulated_symbol))+1j*randn(1,length(modulated_symbol))); % 무선채널계수 h(n)
transmission_symbol=sqrt(transmit_power)*modulated_symbol; % y(n) = 루트SNR * 맵핑된 심볼
noise= sqrt(1/2)*(randn(1,length(modulated_symbol)) +1j*randn(1, length(modulated_symbol)) );
% fading channel
transmission_symbol=transmission_symbol.*h; % h(n)*y(n)
r=transmission_symbol+noise; % r(n) = h(n)*y(n) + z(n)
received_symbol=r./h; % Equalizer output
%% 수신 (Receive)
FEC_recovered_bit_data=QPSK_demapper(received_symbol);
recovered_bit_data=FEC_dec(FEC_recovered_bit_data, repeat_time);
if flag
recovered_bit_data(end)=[]; % 전체 글자 수가 홀수였으면 맨 뒤 요소 삭제
nSymbols=nSymbols-1; % 전체 비트 수 변경
end
%% 다시 문자로 바꾸기
% reshape(변경할 배열, 행 크기, 열 크기)
recovered_data=reshape(recovered_bit_data, 8, []);
recovered_data=recovered_data';
decimalValues=bin2dec(num2str(recovered_data));
% ASCII 코드를 문자로 변환
textString=char(decimalValues)';
disp(textString);
★ 정리 ★
결과> 원래 텍스트와 수신한 텍스트 비교
Case 1
SNR = 20 고정하고 FEC 반복 횟수가 1일 때 / 7일때 QPSK/BPSK/16QAM 송수신 결과 비교하기
⒜ FEC 반복 횟수 = 1
⒝ FEC 반복 횟수 = 7
Case 2
FEC 반복 횟수 = 3 고정하고 SNR이 5dB일 때 / 20dB일 때, QPSK/BPSK/16QAM 송수신 결과 비교하기
⒜ SNR = 5dB
⒝ SNR = 20dB
★ ★ 시뮬레이션으로 알 수 있는 점
→ BPSK > QPSK > 16QAM 순으로 오류율이 낮다.
→ SNR이 높을수록 오류율이 낮다.