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이 높을수록 오류율이 낮다.