通信原理のPCMエンコードと逐次比較エンコーダのC言語実装

逐次比較エンコーダーと各種変換

目次

序文

1.コーディングの基礎知識

2. 逐次比較エンコーダ

3.プログラミングコード

1.Cコード

2. シミュレーション結果

要約する



序文

コーディングとコーディングを学んだ後、コースの先生は、コーディングはコードで実装できる        と言い、実験を使用してそれを実行させたいと言いました. しかし、今年度の学生の実験コースは限られているため、最初からしか手配できません.次のクラスの生徒。最近は国慶節が連休で何もすることがないので、逐次比較エンコーダーをC 言語でプログラミングしたので、C 言語の復習をしなければなりません。私のコーディング能力は限られています. この知識を学んでいるなら, この記事があなたの役に立てば幸いです.


ヒント: 以下はこの記事のテキストです, すべて著者自身のオリジナルです. 記事を書くのは簡単ではありません. 再投稿する際には、この記事へのリンクを添付してください.

1.コーディングの基礎知識

        コーディングは、非一様量子化と一様量子化に分けられます。不均一量子化時の最小量子化間隔Δ=1/2048を一様量子化の量子化間隔とすると、13倍線の1番目のセグメントから8番目のセグメントまで2048個の均等量子化レベルがあり、不均等量子化がある。量子化レベルはわずか 128 です。
        一様量子化では 11 ビット コードをエンコードする必要がありますが、不一様量子化では 7 ビット コードのみをエンコードする必要があります。通常、非一様量子化特性による符号化は非線形符号化と呼ばれ、一様量子化特性による符号化は線形符号化と呼ばれる。
        小信号に対して同じ量子化間隔を確保するという条件の下では、7 ビットの非線形符号化は 11 ビットの線形符号化に相当します。

        開始レベルと量子化間隔は、次の図に示されています。

 7/11 変換は、次の図に示されています。

 7/12 変換を次の図に示します。

2. 逐次比較エンコーダ

        逐次比較方式符号化処理
サンプル値xの極性を決定し、1 をコンパイルします
x | x | の絶対値を取り、セグメント番号コードa 2、a 3、a 4 を 3 回判定します。
セグメント内レベルを計算し、セグメント内コードa 5、a 6、a 7、および a 8 を 4 回コンパイルします。
計算プロセスは、次の図に示されています。

段落コードと段落内コードの関係を次の図に示します。 

3.プログラミングコード

1.Cコード

コードは以下のように表示されます:

//school:  cq university
//student: clg
//create time:2022/10/03
#include<stdio.h>
#include<math.h>
int main()
{
    printf("请输入信号抽样值(-2048——+2048之间的整数):");
    int a,b;
    int encoder[8]={0};           //待输出8位编码结果并初始化为0
    int code[11]={0};             //7/11变换
    int coder[12]={0};            //7/12变换
    int start_level[8]={0,16,32,64,128,256,512,1024};      //8段起始量化电平
    int quantization_space[8]={1,1,2,4,8,16,32,64};  //8个量化间距
    scanf("%d",&a);
    if (a<0)
        encoder[0]=0;
    if (a>0)
        encoder[0]=1;
    a=abs(a);
    if (a>=start_level[4])
    {   
        encoder[1]=1;
        if (a>=start_level[6])
        {
            encoder[2]=1;
            if (a>=start_level[7])
            {
                encoder[3]=1;
            }
            else
                encoder[3]=0;
        }
        else
        {
            encoder[2]=0;
            if(a>=start_level[5])
                {
                    encoder[3]=1;
                }
            else
                {
                    encoder[3]=0;
                }
        }
    }    
    else
    {
        encoder[1]=0;
        if (a>=start_level[2])
        {
            encoder[2]=1;
            if (a>=start_level[3])
            {
                encoder[3]=1;
            }
            else
                encoder[3]=0;
        }
        else
        {
            encoder[2]=0;
            if(a>=start_level[1])
                {
                    encoder[3]=1;
                }
            else
                {
                    encoder[3]=0;
                }
        }
    }
    b=encoder[1]*4+encoder[2]*2+encoder[3]*1;
    if( a>=(start_level[b]+quantization_space[b]*8) )
        encoder[4]=1;
    else
        encoder[4]=0;
    if( a>=(start_level[b]+encoder[4]*quantization_space[b]*8+quantization_space[b]*4) )
        encoder[5]=1;
    else
        encoder[5]=0;
    if( a>=(start_level[b]+encoder[4]*quantization_space[b]*8+encoder[5]*quantization_space[b]*4+quantization_space[b]*2) )
        encoder[6]=1;
    else
        encoder[6]=0;
    if( a>=(start_level[b]+encoder[4]*quantization_space[b]*8+encoder[5]*quantization_space[b]*4+encoder[6]*quantization_space[b]*2+quantization_space[b]) )
        encoder[7]=1;
    else
        encoder[7]=0;
    if( (encoder[1]*4+encoder[2]*2+encoder[3]*1)==0 )        //7/11变换
        {
            code[7]=encoder[4];
            code[8]=encoder[5];
            code[9]=encoder[6];
            code[10]=encoder[7];
        }
    else
        {
            code[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)]=1;
            code[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+1]=encoder[4];
            code[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+2]=encoder[5];
            code[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+3]=encoder[6];
            code[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+4]=encoder[7];
        }
    if( (encoder[1]*4+encoder[2]*2+encoder[3]*1)==0 )     //7/12变换
        {
            coder[7]=encoder[4];
            coder[8]=encoder[5];
            coder[9]=encoder[6];
            coder[10]=encoder[7];
            coder[11]=1;
        }
    else
        {
            coder[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)]=1;
            coder[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+1]=encoder[4];
            coder[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+2]=encoder[5];
            coder[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+3]=encoder[6];
            coder[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+4]=encoder[7];
            coder[7-(encoder[1]*4+encoder[2]*2+encoder[3]*1)+5]=1;
        }
    printf("该量化电平位于第%d段\n",encoder[1]*4+encoder[2]*2+encoder[3]*1+1);
    printf("第%d段的量化间距为:%d\n",encoder[1]*4+encoder[2]*2+encoder[3]*1+1,quantization_space[b]);
    printf("第%d段的起始电平为:%d\n",encoder[1]*4+encoder[2]*2+encoder[3]*1+1,start_level[encoder[1]*4+encoder[2]*2+encoder[3]*1]);
    printf("量化误差为:%d\n",a-(start_level[b]+encoder[4]*quantization_space[b]*8+encoder[5]*quantization_space[b]*4+encoder[6]*quantization_space[b]*2+encoder[7]*quantization_space[b]));
    printf("8位编码结果:%d%d%d%d%d%d%d%d\n",encoder[0],encoder[1],encoder[2],encoder[3],encoder[4],encoder[5],encoder[6],encoder[7]);
    printf("7位编码结果(不加极性位):%d%d%d%d%d%d%d\n",encoder[1],encoder[2],encoder[3],encoder[4],encoder[5],encoder[6],encoder[7]);
    printf("7/11转换结果:%d%d%d%d%d%d%d%d%d%d%d\n",code[0],code[1],code[2],code[3],code[4],code[5],code[6],code[7],code[8],code[9],code[10]);
    printf("7/12转换结果(非线性码转线性码):%d%d%d%d%d%d%d%d%d%d%d%d\n",coder[0],coder[1],coder[2],coder[3],coder[4],coder[5],coder[6],coder[7],coder[8],coder[9],coder[10],coder[11]);
    return 0;
    
}

2. シミュレーション結果

コードを実行した結果を次の図に示します。


要約する

        以上が本日のお話になりますが、この記事ではコーディングの基礎知識とC言語プログラミングを使って逐次比較エンコーダーと7/11、7/12変換を実現する方法を紹介します。

おすすめ

転載: blog.csdn.net/m0_66360845/article/details/127150753