⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 final.c

📁 Generate random bits, convert to bipolar, corrupt the message by passing through noise and decode us
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define  MU 0.0
#define SIZE 1000
#define R 0.475383841  //average code rate(R = k/n)

int calHam(int checkArray[],int staticArray[], int sizebit);//FUnction to calculate Hamming Distance
int gen_AWGN (float arr[],int max);
float corrupted_bits[25000];
int transmitted_bits[25000];//store transmitted bits
float bipolar_bits[25000];//store bipolar bits
int received_bits[25000];//store received bits
int ebNo;
int main()
{
    int decVal[] = {63488,30876,47182,14546,55531,22647,39077,6201,59571,26671,43261,10337,51288,18628,34838,2186,61645,28753,45187,12319,53286,20666,36968,4340,57470,24802,41008,8364,49301,16393,32987,71,64866,32254,48428,15792,56713,23829,40391,7515,60881,27981,44447,11523,52538,19878,36212,3560,62895,30003,46561,13693,54596,21976,38154
                   ,5526,58652,25984,42322,9678,50679,17771,34233,1317,128097,62809,95485,30149,112055,46223,79147,13331,120071,54335,87451,21667,103633,38377,70733,5493,124411,58563,91495,25695,107565,42261,74929,9609,115869,50597,82945,17721,99659,33907,67031,1263,130725,65437,97849,32513,114547,48715,81903,16087,122819,57083,89951,24167
                   ,106005,40749,73353,8113,126783,60935,94115,28315,110313,45009,77429,12109,118361,53089,85701,20477,102287,36535,69395,3627,255077,124437,189789,59181,223177,91577
                   ,157425,25729,239273,107737,173969,42465,206085,75637,140349,9805,247633,116001,181865,50201,214269,83597,148933,18357,230813,100333,165029,34517,198193,66625,132873,1401,258541,127901,192725,62117,225857,94257,160633,28937,242465
                   };
    int arrEbNo[] = {-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int ebno_index;
    int decVal_index,decimal,bitsize;
    int i;
    int f=0,k,j,n;
    double sum=0;
    //int transmitted_bits[25000];//store transmitted bits
    //float bipolar_bits[25000];//store bipolar bits
    //int received_bits[25000];//store received bits
    //float corrupted_bits[25000];
    float r1,r2,sample,sig,s;//box muller variable
    float BER;//Bit Error Rate
    float countE;
    
    srand(time(NULL)); //initialize random algorithm
    //choose any EbNo
    ebno_index = rand()% 19;
    ebNo = arrEbNo[ebno_index];
    
    for (i=0;i<1200;i++)
    {
        decVal_index = rand() % 168;
        if (decVal_index <= 63)
        {
           bitsize = 16;             
        }
        else if ((decVal_index >63) && (decVal_index <= 127))
        {
           bitsize = 17;
        }
        else
        {
           bitsize = 18;
        }
        sum+=bitsize;
        decimal = decVal[decVal_index];
        
        //convert to binary format
        for (j = bitsize - 1;j>= 0;j--)
        {
            n = (decimal>>j) &0x1;
            transmitted_bits [f] = n;
            if (n == 1)
            {
                bipolar_bits[f] = 1;
            }
            else if (n == 0)
            {
                bipolar_bits[f] = -1;
            }           
            f=f+1;
        }
    }
    //printf("Number of Bits transmitted: %.f\n",sum);
    for (i=0;i<sum;i++)
    {
        printf("%d",transmitted_bits[i]);        
    }
    /*for (i=0;i<sum;i++)
    {
        printf("%.1f ",bipolar_bits[i]);
    }*/
    printf("\n");
    //Noise Channel
    for (i=0;i<sum;++i)
    {
        r1 = rand()/32767.0;
        r2 = rand()/32767.0;
        if (r1 ==0)
           r1 = 0.000000000000000000000000000000001;
       //Box Muller Transformation
       sample = (sqrt(-2*log(r1)))*(cos(2*3.142*r2));
       sig = sqrt(1.0)/sqrt(2.0*(pow(10.0,((double)ebNo/10.0)))*R);
       s = sample * sig + MU;
       corrupted_bits[i] = bipolar_bits[i] + s;
       printf("%.1f ",corrupted_bits[i]);
    }
    printf("\n");
    //hard decision decoding
    for (i=0;i<sum;i++)
    {
        if (corrupted_bits[i] < 0)
        {
            received_bits[i] = 0;
        }
        else if (corrupted_bits[i] > 0)
        {
            received_bits[i] = 1;
        } 
        printf("%d",received_bits[i]);
    }
    printf("\n");
    //counting errors
    printf("EbNo: %d\n", ebNo);
    printf("Number of Bits transmitted: %.f\n",sum);
    printf("Number of Errors: %d\n",calHam(received_bits,transmitted_bits,sum));
    printf("Bit Error rate: %.6f\n",calHam(received_bits,transmitted_bits,sum)/sum);
    system("pause");
}
int calHam (int checkArray[],int staticArray[], int sizebit)
{
    int x;
    int counterror = 0;
    for (x=0;x<sizebit;x++)
    {
        if (checkArray[x] != staticArray[x])
        {
            counterror++;
        }
    }
    return counterror;
}

         
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -