게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
지금 오유에 통신이나 컴공 전공하시는분 계시나요;; 질문좀;;
게시물ID : humordata_600514짧은주소 복사하기
작성자 : 응아돌이
추천 : 2
조회수 : 1242회
댓글수 : 3개
등록시간 : 2010/05/13 15:09:09
유자게에 어울리지도 굉장히 심하게 어울리는 글이라는것을 알고있지만 
자꾸 안풀리니까 머리가 다 뽑힐것 같아서요;;;

그냥 7bit신호 보내는데 parity bit 하나 추가해서 ber이랑 ser구하는 프로그램이거든요
근데 이게 도대체 풀리지가 않네요...
parity check를 여러번 수행할수록 ber이 더 좋아져야 하는데 이상하게 더 나빠만져요;;
조교님도 딱히 문제점을 잘 모르겠다고 하시던데...그럼 먼가 또 사소한거에서 실수를 했다는것 같은데..
고민만 일주일째라;;


#include <iostream.h>
#include <fstream.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void main()
{
srand((unsigned)time(NULL));  //랜덤함수 사용
const int bit = 70000;  //총 70000개의 비트를 사용한다.
const double pi = 3.141592;
int signal[8];  //입력신호
double data[8];  //신호가 0이면 -1, 아니면 1
double data1[8];  //신호에 파워를 곱한값
double data2[8];  //노이즈를 포함하여 전송 후 신호 결정한 값
double noise;  //노이즈
double x1;  //가우시안 잡음을 만들기 위해서
double x2;
double Tx;  //신호의 파워
double ber[250];  //-5~20까지 0.1단위
double ser[250];
double bnum;  //발생된 비트당 에러 개수
double snum;  //발생된 심볼당 에러 개수
double No;  //잡음의 파워
int parity;
int a;
int n=1;
int b;
int p=0;

for (int i=0;i<250;i++)
{
Tx=pow(10,(-17.9-i*(-2.5)/250))*0.001;  //신호의 파워는 EbNo에 따라 변함
No=pow(10,-17.4)*0.001;  //노이즈 파워는 고정
bnum=0;  //에러 개수 초기화
snum=0;

for (int j=0;j<(bit/7);j++)
{
a=0;
for(int k=1;k<8;k++)
{
signal[k]=rand()%2;  //신호 발생. 0또는 1
a=a+signal[k];
}
if(a%2==0)  //발생된 데이타에서 1의 개수가 짝수가 되도록 parity bit을 조정
parity=0;
else
parity=1;
signal[0]=parity;

for(k=0;k<8;k++)
{
if (signal[k] == 0)  //0이면 -1로
data[k]=-1;
else  //1이면 그대로
data[k]=1;
}

for(k=0;k<8;k++)
{
data1[k] = data[k]*sqrt(Tx);  //데이타에 신호세기를 곱한다.
}

p=0;
do  //AWGN을 거친데이터의 1의 개수가 짝수가 아니면 재전송
{
for(k=0;k<8;k++)
{
x1=(double)rand()/(RAND_MAX+1);  
x2=(double)rand()/(RAND_MAX+1);
noise=cos(2*pi*x2)*sqrt(-2*log(x1));  //가우시안 잡음 발생
noise=noise*sqrt(No);  //잡음에 잡음세기를 곱한다.
data1[k]=data1[k]+noise;  //최종 수신 신호는 데이타+잡음
}
b=0;
for(k=0;k<8;k++)
{
if( data1[k] < 0)  //최종수신신호가 0보다 작으면 0
data2[k]= 0;
else  //크면 1
data2[k]=1;
}
for(k=0;k<8;k++)  //AWGN을 거친데이터의 1의 개수가 짝수인지 아닌지 확인
b=b+(int)data2[k];
if(b%2==0)  //짝수면 while문을 나가고
p=n;
else  //아니면 반복
p++;
} while(p<n);

for(k=1;k<8;k++)
{
if(signal[k] == data2[k])  //보낸 신호와 수신 신호가 같으면 그대로
bnum=bnum;
else  //다르면 에러개수 한개 추가
bnum++;
}
if(bnum>0)  //전송된 7개의 비트중에서 하나라도 에러가 잇으면 심볼에러개수 추가
snum++;
}
ber[i]=bnum/bit;  //비트 에러율 = 발생된 에러수/총비트
ser[i]=snum/(bit/7);  //심볼 에러율 = 발생된 에러수/총심볼
}

ofstream A;  //저장
ofstream B;  
A.open("ber1.txt");
B.open("ser1.txt");
for(i=0;i<250;i++)
{
A<<ber[i]<<endl;
B<<ser[i]<<endl;
}
A.close();
}


살려주세요.....OTL
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호