유자게에 어울리지도 굉장히 심하게 어울리는 글이라는것을 알고있지만
자꾸 안풀리니까 머리가 다 뽑힐것 같아서요;;;
그냥 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
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.