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

📄 polynom.cpp

📁 包括RS码的编码,硬(BM)/软(KV)译码,AWGN信道调制解调仿真. 具体采用何种编译码方案和调制解调方式可在Profile.txt文件中指定(内有详细说明). 且扩展性极好,容易向其中加入新的调
💻 CPP
字号:
#include "stdafx.h"
#include "stdlib.h"
#include "Polynom.h"

void InitPolynom(Polynom* p, const GF& gf, int d) {
	p->D=d;
	p->coef=(GFE*)malloc(sizeof(GFE)*(d+1));
	p->gf=gf;
}

//加入参数coef的版本
Polynom NewPolynom(const GF& gf, int d) {
	Polynom p;
	InitPolynom(&p, gf, d);
	return p;
}

void FreePolynom(Polynom* p) {
	free(p->coef);
}

/*以GF中元素为系数的多项式相乘,系数数组中存放的是其m重表示*/

void PolyMPY(Polynom* prodpoly, const Polynom* A, const Polynom* B, GFE* SR) {
    //两因子多项式与乘积多项式的高低项次序相同
    //调用者需确保prodpoly和SR所需空间已正确地分配好
	GFE *a=A->coef;  int k=A->D;
    GFE *b=B->coef;  int r=B->D;
	/*
	GFE *Pow2Vec=A->gf->Pow2Vec;
	int *Vec2Pow=A->gf->Vec2Pow;
	int N=A->gf->N;
	*/
	Using_Pow2Vec_Vec2Pow_NG(A->gf);
    GFE *m=prodpoly->coef;
 
	int i,j;
	for (i=0; i<r; i++) SR[i]=0;
	
	for (i=0; i<k+r+1; i++) {
	    m[i]=0;
	    for (j=r; j>0; j--) m[i]^=GFMPY_V2V(b[j], SR[j-1], NG);
		for (j=r-1; j>0; j--) SR[j]=SR[j-1];
		if (i<k+1) {
		   SR[0]=a[i];
		   m[i]^=GFMPY_V2V(b[0], a[i], NG);
		} else if (i==k+1) SR[0]=0;
	}
    prodpoly->D=k+r;
}

Polynom PolyMPY(const Polynom* A, const Polynom* B, GFE* SR) {
    //调用者需确保SR所需空间已正确地分配好
    Polynom prodpoly=NewPolynom(A->gf, A->D + B->D);
	PolyMPY(&prodpoly, A, B, SR);
    return prodpoly;
}

Polynom PolyMPY(const Polynom* A, const Polynom* B) {
    Polynom prodpoly=NewPolynom(A->gf, A->D + B->D);
    GFE *SR=(GFE*)malloc(sizeof(GFE)*(B->D));
	PolyMPY(&prodpoly, A, B, SR);
	free(SR);
    return prodpoly;
}
/*
int PolyMOD(Polynom* rx, const Polynom* a, const Polynom* b) {
	//调用者需确保rx所需空间已正确地分配好
	Using_Pow2Vec_Vec2Pow_NG(*(a->gf));
	int k=a->D, r=b->D;
	for (int i=0; b->coef[i]==0 && i<r+2; i++);
	int r0=r-i;
	if (r0<0) return -1;//表示除式为零
	else if (r0==0) {rx->D=0; rx->coef[0]=0;}

    //GFE* SR=(GFE*)malloc(sizeof(GFE)*r0);
	GFE* SR=rx->coef;
    GFE q;
    for (i=0; i<r0; i++) SR[i]=a->coef[i];
	for (i=0; i<k-r0+1; i++) {
		q=GFDIV_V2V(SR[0], b->coef[r-r0], NG);
		for (int j=0; j<r0-1; j++) SR[j]=SR[j+1]^GFMPY_V2V(b->coef[r-r0+1+j], q, NG);
		SR[r0-1]=a->coef[r0+i]^GFMPY_V2V(b->coef[r], q, NG);
    }
    rx->D=r0-1;
	return k-r0;//返回商式之次数
}
*/
Polynom PolyDIV(const Polynom* a, const Polynom* b) {
	Using_Pow2Vec_Vec2Pow_NG(a->gf);
	int k=a->D, r=b->D;
	for (int i=0; b->coef[i]==0 && i<r+2; i++);
	int r0=r-i;
	if (r0<0) {
		Polynom p;
		p.D=-1;
		return p;//表示除式为零
	}
	else if (r0==0) {
		Polynom p=NewPolynom(a->gf, a->D);
		for (i=0; i<=a->D; i++) p.coef[i]=a->coef[i];
		return p;
	}

    GFE* SR=(GFE*)malloc(sizeof(GFE)*r0);
    GFE* q=(GFE*)malloc(sizeof(GFE)*(k-r0+1));
    for (i=0; i<r0; i++) SR[i]=a->coef[i];
	for (i=0; i<k-r0+1; i++) {
		q[i]=GFDIV_V2V(SR[0], b->coef[r-r0], NG);
		for (int j=0; j<r0-1; j++) SR[j]=SR[j+1]^GFMPY_V2V(b->coef[r-r0+1+j], q[i], NG);
		SR[r0-1]=a->coef[r0+i]^GFMPY_V2V(b->coef[r], q[i], NG);
    }
	Polynom p;
	p.D=k-r0;
	p.gf=a->gf;
	p.coef=q;
	return p;
}


int PolynomRoots(GFE *roots, const Polynom *f) {
	/*
    GFE *Pow2Vec=f->gf->Pow2Vec;
	int *Vec2Pow=f->gf->Vec2Pow;
	int NG=f->gf->N;
	*/
	Using_Pow2Vec_Vec2Pow_NG(f->gf);
    GFE sum;
	int rootexp, nr;
    nr=0;

	if (f->coef[0]==0) roots[nr++]=0;
	for (int j=0; j<NG; j++) {
		sum=0;
		rootexp=j;
		for (int k=0; k<=f->D; k++) {
            if (f->coef[k]!=0) sum^=Pow2Vec[MODQ(rootexp+Vec2Pow[f->coef[k]] , NG)];
//			_ASSERT(k>=0 && k<=2*t_RS);
			rootexp+=j;
		}
		if (sum==0) {
			roots[nr++]=Pow2Vec[j];
//			_ASSERT(ierr-1<t_RS);
		}
	}
	return nr;
}

⌨️ 快捷键说明

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