逐次比較エンコーダーと各種変換
目次
序文
コーディングとコーディングを学んだ後、コースの先生は、コーディングはコードで実装できる と言い、実験を使用してそれを実行させたいと言いました. しかし、今年度の学生の実験コースは限られているため、最初からしか手配できません.次のクラスの生徒。最近は国慶節が連休で何もすることがないので、逐次比較エンコーダーを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変換を実現する方法を紹介します。