목차
1. CRC(Cyclic Redundancy Check) Code란?
2.flow chart
3. Source Code
4. Result
2.flow chart
3. Source Code
4. Result
본문내용
배열c에 dividend와 0을 XOR을 취함
{
c[i+j-1]=a[i+j]^0;
printf("%d",c[i+j-1]);
}
printf("\n");
}
for(j=1;j<=m+1;j++)
// 각 과정에서 임시로 선언된 배열c를 dividend로 취함
a[i+j]=c[i+j-1];
}
printf("Quotient : "); // Quotient출력
for(i=0;i
printf("%d",e[i]);
printf("\nReminder : "); // 최종 Reminder(나머지)를 출력
for(i=k;i
printf("%d",a[i]);
printf("\nCodeword : ");// Endcoder에서 생성된 codeword출력
for(i=k;i
b[i]=a[i];
for(i=0;i
{
printf("%d",b[i]);
}
printf("\n\n\n");// CRC Decoder 시작
printf("에러가 발생했는가?(1.Yes/2.No)");
// 에러 발생 유무에 따른 Docoding전개
int error;
scanf("%d",&error);
if(error==1) // 에러가 발생했을 경우
{
printf("몇개의 비트에서 에러가 발생하였는가?");// 발생한 에러 갯수
scanf("%d",&j);
printf("몇번째 비트에서 에러가 발생하였는가?");// 에러가 발생한 위치
for(l=0;l
{ // data가 0일경우 1,1일경우 0으로 바뀜
scanf("%d",&i);
if(b[i-1]==1) // 실제로 i번째 bit에서 에러가 발생하였을경우
b[i-1]=0; // 배열의 주소는 0부터 시작하므로
else // 배열의 주소를 i-1을 취해줌
b[i-1]=1;
}
}
printf("Dividend : ");
for(i=0;i
{
printf("%d",b[i]);
a[i]=b[i];
}
printf("\n");
for(i=0;i
{
printf("station%d : ",i);
if(b[i]==1) // dividend의 i번째 bit가 1일경우
{
e[i]=1; // Quotient의 i번째 bit에 1저장
for(l=1;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=0;j<=m;j++) // 나눈셈 과정에서 divisor값을 보여줌
printf("%d",d[j]);
printf("\n ");
for(l=0;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=1;j<=m+1;j++)
// 임시로 선언된 배열c에 dividend와 divisor을 XOR을 취함
{
c[i+j-1]=b[i+j]^d[j];
printf("%d",c[i+j-1]);
}
printf("\n");
}
else if(b[i]==0) // dividend의 i번째 bit가 0일경우
{
e[i]=0; // Quotient의 i번째 bit에 0저장
for(l=1;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=0;j<=m;j++)
// 나눈셈 과정에서 divisor값을 0으로 취해 보여줌
printf("0");
printf("\n ");
for(l=0;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=1;j<=m+1;j++)
// 임시로 선언된 배열c에 dividend와 0을 XOR을 취함
{
c[i+j-1]=b[i+j]^0;
printf("%d",c[i+j-1]);
}
printf("\n");
}
for(j=1;j<=m+1;j++)
// 각 과정에서 임시로 선언된 배열c를 dividend로 취함
b[i+j]=c[i+j-1];
}
printf("Quotient : "); // Quotient출력
for(i=0;i
printf("%d",e[i]);
printf("\nSyndrome : "); // Syndrome를 출력
for(i=k;i
printf("%d",b[i]);
printf("\n");
for(i=k;i
{
if((b[i]||0)==1)
// 각 Syndrome bit가 0이 아닐경우 임시변수 temp를 1씩 증가
temp++;
}
if(temp==0) // temp=0 즉, Syndrome이 0일경우
{
printf("Dataword : "); // accepte된 dataword 출력
for(i=0;i
printf("%d",a[i]);
printf("\n==> Dataword accepted\n");
}
else // temp != 0 즉, Syndrome이 0이 아닐경우
printf("==> Dataword discarded");// dataword는 버려짐
printf("\n");
return 0;
}
4. Result
(1) data bit의 개수가 4개이고 error가 없을 경우(divisor는 1011사용)
(2) data bit의 개수가 4개이고 error가 1개 생겼을 경우(codeword의 4번째 bit error)
(3) data bit의 개수 4개 error가 2개 생겼을 경우(codeword의 4,6번째 bit error)
(4) data bit의 개수가 5개이고 error가 없을 경우(divisor는 10101사용)
(5) data bit의 개수 5개 error가 2개 생겼을 경우(codeword의 4,7번째 bit error)
(6) data bit의 개수 5개 error가 3개 생겼을 경우(codeword의 1,3,7번째 bit error)
(7) data bit의 개수가 11개이고 error가 없을 경우(divisor는 11001사용)
(8) data bit의 개수가 11개이고 error가 5개 생겼을 경우(divisor는 11001사용)
{
c[i+j-1]=a[i+j]^0;
printf("%d",c[i+j-1]);
}
printf("\n");
}
for(j=1;j<=m+1;j++)
// 각 과정에서 임시로 선언된 배열c를 dividend로 취함
a[i+j]=c[i+j-1];
}
printf("Quotient : "); // Quotient출력
for(i=0;i
printf("\nReminder : "); // 최종 Reminder(나머지)를 출력
for(i=k;i
printf("\nCodeword : ");// Endcoder에서 생성된 codeword출력
for(i=k;i
for(i=0;i
printf("%d",b[i]);
}
printf("\n\n
printf("에러가 발생했는가?(1.Yes/2.No)");
// 에러 발생 유무에 따른 Docoding전개
int error;
scanf("%d",&error);
if(error==1) // 에러가 발생했을 경우
{
printf("몇개의 비트에서 에러가 발생하였는가?");// 발생한 에러 갯수
scanf("%d",&j);
printf("몇번째 비트에서 에러가 발생하였는가?");// 에러가 발생한 위치
for(l=0;l
scanf("%d",&i);
if(b[i-1]==1) // 실제로 i번째 bit에서 에러가 발생하였을경우
b[i-1]=0; // 배열의 주소는 0부터 시작하므로
else // 배열의 주소를 i-1을 취해줌
b[i-1]=1;
}
}
printf("Dividend : ");
for(i=0;i
printf("%d",b[i]);
a[i]=b[i];
}
printf("\n");
for(i=0;i
printf("station%d : ",i);
if(b[i]==1) // dividend의 i번째 bit가 1일경우
{
e[i]=1; // Quotient의 i번째 bit에 1저장
for(l=1;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=0;j<=m;j++) // 나눈셈 과정에서 divisor값을 보여줌
printf("%d",d[j]);
printf("\n ");
for(l=0;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=1;j<=m+1;j++)
// 임시로 선언된 배열c에 dividend와 divisor을 XOR을 취함
{
c[i+j-1]=b[i+j]^d[j];
printf("%d",c[i+j-1]);
}
printf("\n");
}
else if(b[i]==0) // dividend의 i번째 bit가 0일경우
{
e[i]=0; // Quotient의 i번째 bit에 0저장
for(l=1;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=0;j<=m;j++)
// 나눈셈 과정에서 divisor값을 0으로 취해 보여줌
printf("0");
printf("\n ");
for(l=0;l<=i;l++)
// 나눗셈 계산시 열을 맞춰주기 위해 공백 추가
printf(" ");
for(j=1;j<=m+1;j++)
// 임시로 선언된 배열c에 dividend와 0을 XOR을 취함
{
c[i+j-1]=b[i+j]^0;
printf("%d",c[i+j-1]);
}
printf("\n");
}
for(j=1;j<=m+1;j++)
// 각 과정에서 임시로 선언된 배열c를 dividend로 취함
b[i+j]=c[i+j-1];
}
printf("Quotient : "); // Quotient출력
for(i=0;i
printf("\nSyndrome : "); // Syndrome를 출력
for(i=k;i
printf("\n");
for(i=k;i
if((b[i]||0)==1)
// 각 Syndrome bit가 0이 아닐경우 임시변수 temp를 1씩 증가
temp++;
}
if(temp==0) // temp=0 즉, Syndrome이 0일경우
{
printf("Dataword : "); // accepte된 dataword 출력
for(i=0;i
printf("\n==> Dataword accepted\n");
}
else // temp != 0 즉, Syndrome이 0이 아닐경우
printf("==> Dataword discarded");// dataword는 버려짐
printf("\n");
return 0;
}
4. Result
(1) data bit의 개수가 4개이고 error가 없을 경우(divisor는 1011사용)
(2) data bit의 개수가 4개이고 error가 1개 생겼을 경우(codeword의 4번째 bit error)
(3) data bit의 개수 4개 error가 2개 생겼을 경우(codeword의 4,6번째 bit error)
(4) data bit의 개수가 5개이고 error가 없을 경우(divisor는 10101사용)
(5) data bit의 개수 5개 error가 2개 생겼을 경우(codeword의 4,7번째 bit error)
(6) data bit의 개수 5개 error가 3개 생겼을 경우(codeword의 1,3,7번째 bit error)
(7) data bit의 개수가 11개이고 error가 없을 경우(divisor는 11001사용)
(8) data bit의 개수가 11개이고 error가 5개 생겼을 경우(divisor는 11001사용)