이전에 아래 포스팅에서 QAM constellation 에 대해 소개를 드렸었고~~

 

http://iamaman.tistory.com/205

 

아래 포스팅에서 16 QAM BER 시뮬레이션에 대해 소개한적이 있는데~

 

http://iamaman.tistory.com/120

 

간만에 64 QAM BER 시뮬레이션에 대해 소개 드리려 합니다.

 

생각도 안하고 있었던 내용인데 홍팡이라는 분이 부탁을 해서 하드를 뒤져 보니 있긴 있더군요.

 

이전에는 그냥 MATLAB Communications System Toolbox 의 이론적 BER 함수들을 사용했었는데 ~

 

오늘은 아래 주소에 있던 이론적 BER(Bit Error Rate) 수식을 사용했습니다.

 

http://www.raymaps.com/index.php/ber-64-qam-awgn/

 

코드는 아래 Zip 파일 다운로드 받아서 BER_simulation_64QAM.m 파일을 돌려 보시기 바랍니다.

 

64qam.zip

 

최신의 MATLAB 을  사용한다면 Randint()함수 관련 경고가 뜰텐데 무시하고 시뮬레이션 하시면 됩니다. 경고가 보기 싫다면 Randi() 함수로 변경해서 사용하면 됩니다.


다음과 같은 Constellation 과 64 QAM BER 결과를 확인 할 수 있습니다. 위 링크에 첨부되어 있는 결과와 마찬가지로 이론적인 성능과 거의 근사치의 시뮬레이션 결과가 나오는 것을 확인 할 수 있습니다.

 

 


아래 포스팅 들에서도 소개했지만, MATLAB 을 사용하면 다양한 random 변수들을 생성할 수 있습니다.  

2011/03/23 - [programming language/MATLAB] - MATLAB random number 생성


2011/03/23 - [programming language/MATLAB] - MATLAB Rayleigh random variable 생성


2011/03/26 - [programming language/MATLAB] - MATLAB Exponential random variable generation


2011/04/06 - [programming language/MATLAB] - MATLAB Bernoulli random variable generation


2011/04/17 - [programming language/MATLAB] - MATLAB binomial r.v. generation


기복적으로 rand, randn, randi, randperm 과 같은 함수들을 제공해 줘서 Uniformly distributed(균일 분포)뿐만 아니라 Normally distributed(정규 분포) 등도 기본적으로 생성 할 수 있습니다.

 

요즘은 C++ 에서도 기본적으로 정규 분포 생성 함수 등을 제공해 주지만 예전에는 정규분포 random variable을 생성하려면 균일 분포를 사용해서 함수로 만들어 사용하곤 했습니다.

  

2012/08/26 - [컴퓨터일반] - C++11 많이 좋아졌네요.


그러다 보니 MATLAB 에서 정규분포를 기본적으로 제공해 주는 건 큰 메리트로 느껴지던 시절이 있었습니다.

 

MATLAB 에서는 Statistics Toolbox 를 사용하면 좀더 다양한 분포들을 아주 쉽게 생성 할 수도 있습니다.

 

그런데 이런 random variable 들도 사실은 그리 random 한 것만은 아닙니다.

 

일단 이해를 위해 MATLAB 을 실행하고 다음과 같이 command window에 작성해 보죠~

 

아래 코드는 간단하게 현재의 시간과 3 × 3균일 분포를 만드는 코드 입니다.

 

>> datestr(now), a=rand(3)

 

결과는 이렇습니다.

 

이제 MATLAB 을 껐다가 다시 실행 시키고 위와 똑 같은 코드를 다시 실행해 보죠~ 아래에 그 결과를 보면 시간은 분명히 달라졌는데 rand() 함수의 결과가 동일하죠?

 

다른 프로그래밍 언어들을 접해 보신 분들은 대부분 아시겠지만, 프로그래밍 언어에서의 random variable 값들은 seed 에 따라 생성 되게 됩니다.

 

MATLAB 에서 random number generation 을 Control 하는 함수로 rng 라는 함수가 있습니다.

 

Command Window 에 rng 라고 타이핑 하면 현재의 seed 상태를 알 수 있습니다. default 세팅은 아래와 같습니다.

 

>> rng

ans =

 

Type: 'twister'

Seed: 0

State: [625x1 uint32]

 

seed 값을 설정할 때 보통 시간에 따라 변화하도록 설정하곤 하는데~ MATLAB 에서는 다음과 같이 설정하면 시간에 따라 seed 값이 변화하도록 할 수 있습니다.

 

rng('shuffle')

 

seed 를 처음 상태로 되 돌리기 위해서는 rng('default') 라고 해 주면 됩니다.

 

그럼 이제 MATLAB 을 껐다가 다시 켜고~ rng('shuffle') 을 한 후에 위에서 사용했던 명령어들을 다시 실행해볼까요?

 

확인을 위해 MATLAB 을 재 시작 시키고 똑같이 발생 시켜 보죠~

 

이젠 rand() 함수의 결과가 바뀌는 것을 확인 할 수 있죠~

 

만약 rng('shuffle') 이라는 코드를 MATLAB 실행 할 때마다 넣어주는 게 불편하다 하시는 분들은 아래 글 참조하셔서 startup 파일에 rng('shuffle') 을 넣어준다면 좀더 편하게 사용할 수 있을 겁니다.


2013/09/30 - [programming language/MATLAB] - MATLAB 시작 폴더 변경 및 startup.m 파일 설정



이번 포스팅에서는 MATLAB 에서 기본으로 제공하는 각종 random number 의 생성 방법에 대해 알아본다.

 

MATLAB 에서도 rand() 함수는 uniform random number 를 발생 시킨다.

 

rand() 함수는 0에서 1 사이 값을 발생 시킨다. 이를 이용하여 다양한 범위의 uniform random number 를 발생 시킬 수 있다.

 

a ~ b 사이의 n행 k열 uniform random number 를 발생시키는 방법은 다음과 같다.

 

Uniform_rand = a + (b-a).*rand(n, k);

 

예를 들어 -10 ~ 5 사이의 4행 5 열 의 uniform random number 를 발생 시키려면 다음과 같이 하면 된다.

 

 

다음으로 정규 분포라 불리는 Gaussian random number 에 대해 알아보자.

 

Gaussian random number 를 발생시키는 함수는 randn() 이다.

 

randn() 함수는 평균이 0 이고 분산이 1 인 Gaussian random number 를 발생 시킨다.

 

평균이 a 이고 분산이 b 인 n행 k 열의 Gaussian random number 를 발생시키는 방법은 다음과 같다.

 

Gaussian_randn=randn(n, k)*sqrt(b)+a;

 

예를 들어 평균이 3 이고 분산이 9인 3행 4열 Gaussian random number 를 발생시켜 보면 다음과 같다.

 

 

다음으로 정수 random number 를 발생시켜주는 randi() 함수에 대해 알아보자.

 

randi(imax, n, m) 이라 정의 하게 되면 1,2,3,…imax 까지의 정수 중 uniform 하게 n 행 m 열 만큼 발생시켜 준다.

 

또는 randi([imin, imax], n, m) 이라 정의 하면 imin, imin+1, imin+2, … imax까지의 정수 중 uniform 하게 n 행 m 열 만큼 발생시켜 준다.

 

예를 들어 randi([-10, 2], 5, 4) 라고 정의 하면 -10,9,8… 2 까지의 정수를 5행 4열로 발생시켜 준다.

 

 

마지막으로 randperm() 함수에 대해 알아보자. randperm(k) 라 하게 되면 1:k 까지의 값들을 random 하게 나열 한다.

 

예를 들어 randperm(5) 하면 다음 그림과 같이 1,2,3,4,5 값을 random 하게 나열하는 식이다.

 

 

randperm(45) 의 값의 임의의 부분 6개를 취하면 간단하게 random한 로또 번호 생성기를 만들 수 있다.

 

 


  1. 글쎄인삼 2013.03.19 23:14

    트럼프카드 셔플 프로그램 짜는 거 때문에 고생하고 있었는데 덕분에 쉽게 해결되었습니다. 감사합니다.

    • 남성 2013.03.20 09:34 신고

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

  2. 민트맛카카오 2016.03.19 21:42

    정수 1~52까지 5x4 random 행렬 만드는 법 있나요?

    • 남성 2016.03.19 21:46 신고

      randi(52,5,4) 라고 하면 됩니다.

    • 2016.03.19 22:05

      비밀댓글입니다

    • 남성 2016.03.19 22:07 신고

      중복없이 하시려면 아래와 같이 하면 됩니다.

      a = randperm(52); b= reshape(a(1:20),5,4)

    • 민트맛카카오 2016.03.19 22:11

      너무 감사합니다. 좋은 주말되세요~

  3. 2016.03.20 23:44

    비밀댓글입니다

    • 남성 2016.03.20 23:47 신고

      위에 질문 하신 분이랑 같이 숙제 하시나 봐요 다음과 같이 하시면 됩니다

      a = randperm(52); b= reshape(a(1:20),5,4)

    • 2016.03.20 23:53

      비밀댓글입니다

    • 남성 2016.03.20 23:58 신고

      키와 값의 형태로 표현하고 싶으면 아래 주소의 글들을 참조하여
      map 형태로 나타내도 될것 같고,

      http://iamaman.tistory.com/749
      http://iamaman.tistory.com/529

      그냥 간단하게 아래와 같이 배열로 나타내도 될것 같네요.

      a=['다이아에이', '스페이드']

      위와 같이 하면 a[1] 은 다이아에이 겠죠.

    • 매트랩초보 2016.03.21 00:05

      늦은 시간에 계속 질문해서 정말 죄송합니다
      a=['다이아에이','스페이드']에서 스페이드는 왜 쓰신거에요??

    • 남성 2016.03.21 00:08 신고

      1~52개 카드를 배열에 넣으려는 의도 아닌가요?

    • 매트랩초보 2016.03.21 00:09

      네 맞아요 아 그럼 그 스페이드는 52를 의미하기위해 넣으신건가요???

    • 남성 2016.03.21 00:11 신고

      그냥 예를 든건데.... ㅎㅎ 아래와 같이 저장해서 52개를 저장하면 된다는거죠.
      a=['다이아에이','다이아2', '다이아3', .... ]

    • 매트랩초보 2016.03.21 00:14

      아 이제야 이해가 갔어요 정말 감사합니다 ㅠㅜㅠㅜㅠㅜ
      진짜 늦은시각에 불쑥질문에 명쾌한 답변 큰 도움이 됐습니다.
      다시한번 정말 감사합니다.

    • 남성 2016.03.21 00:17 신고

      도움 되셨다니 다행이네요 자주 방문해 주세요.

    • 매트랩초보 2016.03.21 00:19

      넵 알겠습니다!!!

  4. 잘봤습니다 2016.04.03 19:36

    글 잘봤습니다. 제가 처음 보는 내용도 있네요.
    질문 하나만 하고싶습니다...
    혹시 randi로 randperm같이 중복안되게 랜덤함수 생성하는 방법이 있나요?

    • 남성 2016.04.04 00:06 신고

      randperm 이 결국에는 카드 섞는거랑 비슷하니까

      randperm 이 있는데 굳이 이렇게 어렵게 할 필요는 없을것 같은데... 다음과 같이 해도 될 것 같긴 하네요.

      a = 1:52;
      b= randi(52,100,2);

      for n=1:100
      if b(n,1) ~= b(n,2)
      temp = a(b(n,1));
      a(b(n,1)) = a(b(n,2));
      a(b(n,2)) = temp;
      end
      end

    • 잘봤습니다 2016.04.04 23:21

      번거롭게해서 죄송하고 감사합니다. 자주들릴게용

    • 남성 2016.04.05 00:12 신고

      네~ 자주 방문해주세요

  5. 2016.04.11 22:44

    혹시 제가 직접 작성한 pdf 함수로 random number를 발생시키려면 어떻게 해야할까요???

    • 남성 2016.04.12 08:55 신고

      위에서 한것과 마찮가지로 CDF 를 구한후에 역함수를 취하고 0~1 사이의 random number 를 생성한후에 역함수에 집어 넣으면 되겠죠.

  6. 메트랩 입문자 2020.03.26 12:44

    혹시 제가 지금 다섯 사람에게 한장씩 총 4장의 카드를 분배하는 시스템을 짜려고 하는데요
    D = ['D_A' , 'D_2' , 'D_3' , 'D_4' , 'D_5' , 'D_6' , 'D_7' , 'D_8' , 'D_9' , 'D_10' , 'D_J' , 'D_Q' , 'D_K' ] ;
    C = ['C_A' , 'C_2' , 'C_3' , 'C_4' , 'C_5' , 'C_6' , 'C_7' , 'C_8' , 'C_9' , 'C_10' , 'C_J' , 'C_Q' , 'C_K' ] ;
    H = ['H_A' , 'H_2' , 'H_3' , 'H_4' , 'H_5' , 'H_6' , 'H_7' , 'H_8' , 'H_9' , 'H_10' , 'H_J' , 'H_Q' , 'H_K' ] ;
    S = ['S_A' , 'S_2' , 'S_3' , 'S_4' , 'S_5' , 'S_6' , 'S_7' , 'S_8' , 'S_9' , 'S_10' , 'S_J' , 'S_Q' , 'S_K' ] ;

    y = [D, C, H, S] ;
    x = randperm(52)
    w = 1 ;
    for i = 1:4
    a(w,:) = y(x(w),:);
    b (w+1,:) = y(x(w+1),:);
    c (w+2,:) = y(x(w+2),:);
    d (w+3,:) = y(x(w+3),:);
    e (w+4,:) = y(x(w+4),:);

    sprintf('Person %d : %s, %s, %s, %s, %s' , i ,a(w,:),b(w+1,:), c(w+2,:), d(w+3,:), e(w+4,:))
    w=w+5;
    end


    라고 코드를 짰는데 위에 D_A이런것들이 각각 D따로 _따로 A따로 인식을 하더라고요... 한개로 인식되게 하려면 어떻게 해야 할까요.. ㅠㅜ

    그리구
    a (w,:) = y(x(w),:);
    b (w+1,:) = y(x(w+1),:);
    c (w+2,:) = y(x(w+2),:);
    d (w+3,:) = y(x(w+3),:);
    e (w+4,:) = y(x(w+4),:);
    이 부분도 코드를 맞게 짰는지 모르겠어요
    정말 죄송하지만 한번만 확인해주실수 있나요..???

    • 남성 2020.03.27 08:40 신고

      네 위와 같이 사용하게 되면 문자의 경우 한글자씩 인식하게 됩니다. 따라서 단어 단위로 저장을 하고 싶으시면 Cell 타입을 사용해야 하고 아래 내용 참조해 보시기 바랍니다.

      https://iamaman.tistory.com/170

  7. 입문자 2020.04.11 02:37

    안녕하세요 블로그로 매트랩 정말 잘 배우고 있습니다:) 혹시 푸아송랜덤변수와 기하랜덤변수를 위와 같이 발생시키는 방법 알 수 있을까요?

    • 남성 2020.04.11 13:06 신고

      포아송 랜덤 변수는 poissrnd 함수를 사용하면되고 기하 랜덤 변수는 geornd 함수를 사용하면됩니다.
      각 메뉴얼의 주소는 아래와 같습니다.

      https://kr.mathworks.com/help/stats/poissrnd.html

      https://kr.mathworks.com/help/stats/geornd.html

      제 블로그의 아래 포스팅엥서 CDF 를 사용하여 포아송 랜덤 변수를 발생시키는 방법에 대해서도 포스팅을 한 적이 있습니다.

      https://iamaman.tistory.com/206

    • 2020.04.12 02:37

      비밀댓글입니다

    • 남성 2020.04.12 18:15 신고

      포스팅 했습니다. ^^

      https://iamaman.tistory.com/3210

오늘은 EYE PATTERN 에 대해 알아 보려 합니다. 


학부 때 EYE PATTERN 이란 걸 보고 이게 뭘까 ~ 정말 도무지 감이 안 왔던 기억이 있습니다.


EYE PATTERN 이란 특정 시간 구간 동안 들어오는 신호의 파형을 계속 겹쳐서 나타낸 것뿐입니다.


보통 EYE PATTERN을 그릴 때는 2 심볼 구간 동안 표시를 하곤 하죠.


오늘 EYE PATTERN을 하기 전에 BPSK 에 모르시는 분들은 아래 글을 읽고 오시기 바랍니다.

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

 

그리고 Raised cosine filter 에 대해서는 아래 글을 참조해 주세요.

2011/03/02 - [MATLAB] - [디지털 통신] Raised Cosine Filter

 


그럼 이제 matlab 코딩을 시작 해 보죠. BPSK 신호의 송수신을 예로 들어서 설명해 보겠습니다. 잡음은 고려하지 않겠습니다.


  • 먼저 Square root raised filter 를 만듭니다. 8 oversamplegroup delay 3심볼, roll off 0.2 인 필터를 만들겠습니다.

Sqrt_r_filter= rcosine(1e6, 8e6, 'sqrt', 0.2, 3);



  • 비트를 만듭니다. 여기선 5000 비트를 만들겠습니다.


bits=randi([0 1], 5000, 1);



  • 비트 0은 -1로 비트 1은 1로 Mapping 해줍니다.


Mapped_signal=bits*2-1;



  • 8 oversample 이므로 8배upsample 을 합니다. upsample 이란 중간에 0을 채워 넣는 겁니다.

Upsampled_signal=upsample(Mapped_signal, 8);


  • Tx filtering 을 수행합니다.

Tx_signal=filter(Sqrt_r_filter,1, Upsampled_signal);



  • 수신 단에서는 Rx filtering 을 수행합니다.


Rx_signal=filter(Sqrt_r_filter,1, Tx_signal);

  

이제 신호의 송수신은 다 됐습니다.

근데 위에서도 말했듯이 EYE PATTERN 을 보기 위해서는 특정 구간으로 겹쳐서 그려야 합니다.

따라서 위의 수신 신호 Rx_signal 을 적절히 구성만 해주면 됩니다.


2 심볼 구간 동안의 EYE PATTERN을 보기 위한 2 심볼은 8*2 = 16 샘플 입니다.

그리고 Rx_signal 의 1부터 48번째까지의 값은 delay 값 일명 쓰레기 값입니다. 이는 필터의 delay 가 3 심볼이니깐 8*3에다 Tx , Rx 필터 통과니깐 또 *2 를 해서 48 이라는 숫자가 나오는 겁니다.


이제 다음과 같이 매트릭스를 구성합니다.

 

Rx_signal1=Rx_signal(49);

Rx_signal_cutted=Rx_signal(50:end);

N_column=floor(length(Rx_signal_cutted)/16);

Rx_signalmatrix=reshape(Rx_signal_cutted(1:16*N_column),16,N_column);

 


아래 코드의 빨간색 부분은 이전 신호의 온 타임 지점을 반복시켜 주기 위한 것입니다.


Rx_signalmatrix_all=[[Rx_signal1 Rx_signalmatrix(end,1:end-1)] ;Rx_signalmatrix];

 

이제 그림을 그려줍니다.


figure, plot(Rx_signalmatrix_all,'b'), grid on

 

결과는 다음과 같습니다.

 

그럼 ~ 맨~ 처음 만들었던 필터에서 roll off 를 바꿔가며 위에서 진행한 실험을 똑같이 해 봅니다.


roll off 가 0.5 일 때

 

roll off 가 0.7 일 때

 

roll off 가 1 일 때

 

쭉~ 보니깐 roll off 가 올라갈수록 그림이 깔끔해 지죠? roll off 가 올라갈수록 EYE 는 점점 더 열리게 되 므로 신호 품질은 더 좋아지는 겁니다.


하지만 공학이란 게 어디까지나 트레이드 오프가 있는 거니깐~ roll off가 높아진다고 무조건 좋은 건 아닙니다. roll off 가 높아질수록 BW(대역폭) 을 더 이용하게 되는 겁니다.

   

EYE PATTERN 이란 게 직접 시뮬레이션 해 보면 별거 아닌데 처음에 보면 이해가 어렵습니다. 이 글을 보시는 분들도 위 코드대로 직접 시뮬레이션 한번 해 보시기 바랍니다.


  1. 김도윤 2012.05.02 12:38

    여쭤볼게 있는데요.
    Upsample을 하면 bit간 간격이 넓어지니까 filter도 그에 따라서 time domain에서 늘려줘야 하지 않나요?
    그리고 마지막에 신호의 온타임 지점을 반복한다는 것이 무슨 말인지 잘 이해 못하겠네요.
    혹시 댓글 보시면 답변해주시면 감사하겠습니다.

    • 남성 2012.05.03 00:03 신고

      upsample 이란게 0 을 끼워 넣어주는것이므로 샘플 간의 간격은 좁아지는 겁니다. 즉 sample rate가 그만큼 증가하는 것이죠.

      위 포스팅에서 아래 코드는 필터 계수를 설계하기 위한 것인데~~

      Sqrt_r_filter= rcosine(1e6, 8e6, 'sqrt', 0.2, 3);

      1e6, 8e6 이므로 8배 upsample 에 대해 filter 계수를 생성하는 겁니다.

      예를 들어 4배 upsample 에 대해 filter 계수를 생성하고 싶다면

      rcosine(1, 4, 'sqrt', 0.2, 3); 하시면 됩니다.


      위 포스팅에서 아이패턴은 2심볼 구간 동안그린건데 17 샘플 마다 그려 주게 됩니다.

      즉 온타임 지점은 8 샘플 마다 오니까 예를 들자면

      1 9 17 를 그린 다음에

      17 25 33 를 그리고

      33 41 49 를 그리고

      49 57 65 를 그립니다.

      위 숫자들을 보면 17 33 49 번째 샘플을 한번씩 더 그린거죠. 그렇게 안 그리면 아이패턴을 그릴때마타 한 샘플씩 어긋나게 그리게 되겠죠.



  2. scac 2012.09.20 17:39

    roll-off가 올라가서 eye pattern이 열리는게 아니라, square root raised cosine의 양 옆 진동하는 부분을 너무 짧게 잡아서 저렇게 눈이 닫히는거 아닌가요? 콘볼루션 연산 하는데 저렇게 짧으면 값이 제대로 안나올텐데요;
    포스팅에는 3개 밖에 없는데 이것을 300개로 늘리고 roll-off는 낮은 값으로 해보십시오.

    • 남성 2012.09.20 17:59 신고

      방문해 주셔서 감사합니다.
      위 포스팅의 경우 raised cosine filter 의 group delay 3 을 줬고 oversample rate 가 8 이므로 8*3*2+1 = 49 tap raised cosine filter 를 사용하게 되거든요. 300 이라는 건 group delay 를 말하는 건가요? 보통 group delay 를 그렇게 크게 주진 않는데 어떤걸 300 을 말씀하시는 건지요? group delay 300 이 되면 filter tap 이 4801 tap 이 되는데... raised cosine filter 로 이렇게 긴 필터를 사용하진 않죠.

  3. scac 2012.09.20 18:11

    비트수가 5000개인데 square root raised cosine 의 양 옆 진동하는 부분(그룹 딜레이라고 하는가요?)이 만약 3이면 그 진동하는 부분이 좀 떨어져 있는 다른 비트에 닿지 않습니다. (간섭이 안 일어난다 하더라도 닿게는 해야한다고 생각하는데;)
    그리고 제가 말한 300이라는 숫자는 그냥 막연히 적은 숫자이구요. 저는 rcosfir를 사용해서 좀 헷갈리네요;;

    교과서의 eye pattern은 roll-off를 낮춘다고 해서 간섭이 일어나지 않고 한 점에서 만나거든요.

    • 남성 2012.09.20 21:42 신고

      group delay 3 이란 이전 3 심볼 구간 동안에 영향을 미친다는 겁니다. 따라서 보통 첫번째 온타임 지점은 3 심볼 만큼의 딜레이 후에 잡게 되죠. 각 심볼의 sidelobe 부분이 이전 3개와 심볼과 나중 3개 심볼에 영향을 주는거죠.

      보통 raised cosine filter 는 송수신단 square root raised cosine 로 나누어져서 matched filter 의 형태로 사용되죠.
      말씀하신 rcosfir() 함수는 raised cosine filter 입니다.
      위에 제가 설명한 것은 square root raised cosine 필터이고 raised cosine filter 의 경우에는 roll off 에 상관 없이 점으로 나오는게 맞습니다.
      위에 함수중 rcosine() 함수의 'sqrt' 부분을 'normal' 로 바꾸면 raised cosine filter 가 됩니다.

  4. scac 2012.09.20 21:57

    본문 포스팅에 roll-off 인자가 0.2인데 수신신호 샘플링 타임 지점이 너무 두껍게 나와서 말씀드린 것입니다. 제가 알기로는 roll-off 인자가 0~1에서 어떤 값을 가지든 수신필터, 송신필터가 각각 square root raised cosine일 경우 한 점에서 만나는 것으로 알고 있어서요. 본문 포스팅 이미지는 너무 두껍지 않나 해서..
    그리고 rcosfir도 'sqrt'를 넣어서 사용하는걸 말씀 안드렸네요.. :)


    이해를 돕기 위해 본문 포스팅에 있는 매트랩에서 숫자만 수정해 보았습니다. 말씀하신 그룹딜레이 3을 100으로 늘렸습니다. 본문포스팅 roll-off 가 0.2인 결과물보다 훨씬 나아보입니다.

    Sqrt_r_filter=rcosine(1e6, 8e6, 'sqrt', 0.2, 100);

    bits=randi([0 1], 5000, 1);

    Mapped_signal=bits*2-1;

    Upsampled_signal=upsample(Mapped_signal,8);

    Tx_signal=filter(Sqrt_r_filter,1,Upsampled_signal);
    Rx_signal=filter(Sqrt_r_filter,1,Tx_signal);



    Rx_signal1=Rx_signal((2*8*100)+1);
    Rx_signal_cutted=Rx_signal((2*8*100)+1+1:end);
    N_column=floor(length(Rx_signal_cutted)/16);
    Rx_signalmatrix=reshape(Rx_signal_cutted(1:16*N_column),16,N_column);


    Rx_signalmatrix_all=[[Rx_signal1 Rx_signalmatrix(end,1:end-1)] ; Rx_signalmatrix];

    figure, plot(Rx_signalmatrix_all,'b'), grid on

    • 남성 2012.09.21 09:42 신고

      네 scac 님이 하신 말씀이 맞습니다.
      교과서에서 말하는 raised cosine filter 는 이론적으로 무한대의 탭을 가지는 필터이므로 당연히 딱 점이 되서 나옵니다.

      제가 얘기하는것은 Sqrt_r_filter=rcosine(1e6, 8e6, 'sqrt', 0.2, 100);
      를 하면 Sqrt_r_filter 의 경우 1601 탭이 나오는데. 이것도 물론 이상적인 것은 아니지만, 구현 불가능 할 정도로 긴 필터 탭이라서 실제로 써 먹기는 어렵다는 거구요.

      즉 위에 말씀 하신 필터 같은 경우엔 이론적으로는 가능한데 실제로 써먹기는 거의 불가능 할 정도로 너무 길다는 겁니다.

      실제로 FPGA 등에서 멀티플라이어 수는 제한이 있으니까요.

      따라서 1601 탭 같이 긴 필터 탭으로 만들면.. 실제로 구현이 안되는, 알고리즘을 위한 알고리즘을 하는 꼴이 되는거죠.

  5. 뽀로리 2013.09.15 13:58

    지금 디지털통신공학및설계 수업때문에 15개의 그래프를 위해서 시뮬레이션 돌리기를 시도중입니다.
    처음 만저보는 프로그램이기도 하면서 통신도 잘 몰라 매트랩 하는데 어려움이 많은데요.
    혹시 4진 eye pattern은 어떻게 만들 수 있을까요?
    책은 Introduction to Analog & digital communications 2nd Simon Haykin/Michale Moher 입니다.
    메일 kkb8594@gmail.com입니다.
    제발 조금 도와주십시오. 부탁드립니다.

    • 남성 2013.09.15 17:29 신고

      4진 아이패턴 이라는게 16 QAM 에대한 아이패턴을 말씀하시는건가요?
      위 포스팅은 BPSK 에 대한 예인데.. 16 QAM 이라면 http://iamaman.tistory.com/205 글 보고 mapping 만 바뀌면 됩니다. 일단 변조 방식에 대한 이해가 필요 하실듯 하네요

+ Recent posts