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

关于m序列的构建方法

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

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

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

在这里插入图片描述

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

int main(int argc, char *argv[])  //命令行参数
{	 
	if(argc<2)  //输出提示信息,提示如何使用
    {
		printf("\nProduce data of Msquence 2018 ygaairspace Copyright(C)\n");
		printf("Usage: Msquence.exe index1(Max index) index2 ... ('index' is index of primitive polynomial)");
		printf("Example: Msquence.exe 6 1 0");
		return 0;
    }
	
	int a[100] = {0};  //定义初始化数组a
	int c[101] = {0};  //定义反馈选择接入数组c
	int max = atoi(argv[1]); //将字符型的“最大指数”转化为整型数
	int temp;  //temp用于存放反馈量 
	int p;  //定于p为周期变量
	
	for(int i=1;i<argc;i++)   //根据指数的数值将对应c[i]置1
	{
		int count_c = atoi(argv[i]);  //将字符型的“指数”转化为整型数
		c[count_c] = 1;
	}
	
	a[max-1] = 1;
	p = pow(2,max)-1;  //计算周期
	int m[p];
	
	for(int j=0;j<p;j++) 
	{
		m[j] = a[0];
		int count_a = max-1;
		temp = a[0];
		for(int k=1;k<max;k++)  //异或反馈量
		{
			if(c[k] == 1)
			{
				temp = temp^a[count_a];
				count_a--;
			}
			else
			{
				count_a--;
			}
		}
		for(int l=0;l<(max-1);l++)  //初始值a[]位移
		{
			a[l] = a[l+1];
		}
		a[max-1] = temp;
	}
	
	float period = 0.0;  //时间间隔
	
	for(int n=0;n<p;n++)  //输出m序列数据
	{	
		for(int q=0;q<101;q++)
		{
			period += 0.01; 
			printf("%f\t%d\n",period,m[n]);
		}
	}
}

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

1. 4阶m序列(本原多项式: f ( x ) = x 4 + x 1 + x 0 f(x)=x^4+x^1+x^0
  • 绘制序列图:
    在这里插入图片描述
  • 验证序列图:
    matlab生成的4阶m序列图:
    在这里插入图片描述
    此程序生成的4阶m序列图:
    在这里插入图片描述
    对比两图,图形一致。
2. 6阶m序列(本原多项式: f ( x ) = x 6 + x 1 + x 0 f(x)=x^6+x^1+x^0
  • 绘制序列图:
    在这里插入图片描述
  • 验证序列图:
    matlab生成的6阶m序列图:
    在这里插入图片描述
    此程序生成的6阶m序列图:
    在这里插入图片描述
    对比两图,图形一致。
4. 11阶m序列(本原多项式: f ( x ) = x 11 + x 2 + x 0 f(x)=x^{11}+x^2+x^0
  • 绘制序列图:
    在这里插入图片描述
  • 验证序列图:
    matlab生成的11阶m序列图:
    在这里插入图片描述
    此程序生成的11阶m序列图:
    在这里插入图片描述
    对比两图,图形一致。

猜你喜欢

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