《C》C语言编程实现任意阶数的“Gold序列”并通过gnuplot绘图——在知道本原多项式的前提下

关于Gold序列的构建方法

在我之前的博客中已详细介绍,请点击 \rightarrow C语言编程实现指定阶“Gold序列”并通过gnuplot绘图

一、C语言编程实现任意阶Gold序列

1. 任意阶Gold序列的程序设计流程图:

在这里插入图片描述

2. 任意阶Gold序列源程序
【Gsquence.c】
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

int main(int argc, char *argv[]) //命令行参数
{	 
	if(argc<2)  //输出提示信息,提示如何使用
    {
		printf("\nProduce data of Gsquence 2018 ygaairspace Copyright(C)");
		printf("\n\nUsage: Gsquence index11 index12 and index21 index22...\n('index11' is index of primitive polynomial(1)\n('index21' is index of primitive polynomial(2)");
		printf("\n\nExample: Gsquence 6 1 0 and 6 5 2 1 0\n");
		return 0;
    }
	int temp1,temp2;
	int mark;
	int count_c1,count_c2;
	int p; //定于p为周期变量
	int max = atoi(argv[1]); //将字符型的“最大指数”转化为整型数
	//定义初始化数组a1,a2
	//定义反馈选择接入数组c1,c2
	int a1[100] = {0};
	int c1[101] = {0}; 
	int a2[100] = {0};
	int c2[100] = {0};
	
	for(int i=1;i<argc;i++)  //根据指数的数值将对应c[i]置1
	{
		if(strcmp(argv[i],"and")==0) //检测到"and"时将此时的i付给mark,并跳出循环,不再接收"and"后的数值
		{
			mark = i+1;
			break;
		}
		count_c1 = atoi(argv[i]); //将字符型的“指数”转化为整型数
		c1[count_c1] = 1;
	}
	
	a1[max-1] = 1;
	a2[max-1] = 1;
	p = pow(2,max)-1; //计算周期
	int m1[p];
	int m2[p];
	/*******************产生第一个m序列******************/
	for(int j1=0;j1<p;j1++)
	{
		m1[j1] = a1[0];
		int count_a1 = max-1;
		temp1 = a1[0];
		for(int k1=1;k1<max;k1++) //异或反馈量
		{
			if(c1[k1] == 1) 
			{
				temp1 = temp1^a1[count_a1];
				count_a1--;
			}
			else
			{
				count_a1--;
			}
		}
		for(int l1=0;l1<(max-1);l1++) //初始值a[]位移
		{
			a1[l1] = a1[l1+1];  
		}
		a1[max-1] = temp1;
	}
	/*******************产生第二个m序列******************/
	for(mark;mark<argc;mark++)  //接收"and"后的数值
	{
		count_c2 = atoi(argv[mark]);
		c2[count_c2] = 1;
	}
	
	for(int j2=0;j2<p;j2++)
	{
		m2[j2] = a2[0];
		int count_a2 = max-1;
		temp2 = a2[0];
		for(int k2=1;k2<max;k2++)
		{
			if(c2[k2] == 1)
			{
				temp2 = temp2^a2[count_a2];
				count_a2--;
			}
			else
			{
				count_a2--;
			}
		}
		for(int l2=0;l2<(max-1);l2++)
		{
			a2[l2] = a2[l2+1];
		}
		a2[max-1] = temp2;
	}

	float period = 0.0;  //时间间隔
	
	for(int n=0;n<p;n++)  
	{	
		for(int q=0;q<101;q++)
		{
			period += 0.01; 
			printf("%f\t%d\n",period,m1[n]^m2[n]); //异或两个m序列的数据就得到Gold序列的数据
		}
	}
}

三、gnuplot绘制图像、验证结果

1. 6阶Gold序列

选择 f ( x ) = x 6 + x 1 + x 0 ( 103 ) f(x)=x^6+x^1+x^0(即八进制数103) f ( x ) = x 6 + x 5 + x 2 + x 1 + x 0 ( 147 ) f(x)=x^6+x^5+x^2+x^1+x^0(即八进制数147) 构成优选对。

  • 绘制序列图:
    在这里插入图片描述
  • 验证序列图:
    matlab生成的6阶Gold序列图:
    在这里插入图片描述
    此程序生成的6阶Gold序列图:
    在这里插入图片描述
    对比两图,图形一致。
2. 7阶Gold序列

选择 f ( x ) = x 7 + x 3 + x 0 ( 103 ) f(x)=x^7+x^3+x^0(即八进制数103) f ( x ) = x 7 + x 5 + x 4 + x 3 + x 2 + x 1 + x 0 ( 147 ) f(x)=x^7+x^5+x^4+x^3+x^2+x^1+x^0(即八进制数147) 构成优选对。

  • 绘制序列图:
    在这里插入图片描述
  • 验证序列图:
    matlab生成的7阶Gold序列图:
    在这里插入图片描述
    此程序生成的6阶Gold序列图:
    在这里插入图片描述
    对比两图,图形一致。

猜你喜欢

转载自blog.csdn.net/yga_airspace/article/details/84351026
今日推荐