关于m序列的构建方法
在我之前的博客中已详细介绍,请点击 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序列(本原多项式: )
- 绘制序列图:
- 验证序列图:
matlab生成的4阶m序列图:
此程序生成的4阶m序列图:
对比两图,图形一致。
2. 6阶m序列(本原多项式: )
- 绘制序列图:
- 验证序列图:
matlab生成的6阶m序列图:
此程序生成的6阶m序列图:
对比两图,图形一致。
4. 11阶m序列(本原多项式: )
- 绘制序列图:
- 验证序列图:
matlab生成的11阶m序列图:
此程序生成的11阶m序列图:
对比两图,图形一致。