演示如何通过C代码计算QPSK、QAM、M-PSK星座图数据并用gnuplot作图

2023-11-22 20:32

本文主要是介绍演示如何通过C代码计算QPSK、QAM、M-PSK星座图数据并用gnuplot作图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看QPSK的。
用C语言计算出模拟的QPSK解调信号I路和Q路数据,然后以gnuplot作图。C代码演示了如何通过命令行参数输入噪声大小及解调参考相位。同时也给出了标准正态分布随机数的计算函数。

C代码文件名为:QPSKconst.c

编译:

gcc QPSKconst.c

生成a.exe

执行时输入噪声大小系数,如0.1,解调相位角(度数),如15:

a.exe 0.1 15

则从屏幕输出1000行星座图信号坐标点。在gnuplot中作图即可。作图环境可用以下设置。

set size square
set grid
unset key

然后,在gnuplot命令窗中输入作图命令

gnuplot> plot [-2:2] [-2:2] "<a.exe 0.3 0"  w p pt 6 lc 3

"<a.exe 0.3 0"是执行带参数的exe文件并将结果重定向输入到plot命令中。
得:
在这里插入图片描述
又,减小噪声,得

gnuplot> plot [-2:2] [-2:2] "<a.exe 0.05 0"  w p pt 6 lc 3

)

又,相位偏移-10度,得

plot [-2:2] [-2:2] "<a.exe 0.05 -10"  w p pt 6 lc 3

)

噪声很大的情况,星座图点散开。

plot [-2:2] [-2:2] "<a.exe 1 0"  w p pt 6 lc 3

)

附:C代码

//QPSK信号星座图QPSKconst.c
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.14159265double randn()//标准高斯噪声产生(0均值,方差1)
{double r1,r2;r1=(double)rand()/RAND_MAX;r2=(double)rand()/RAND_MAX;return sqrt(-2*log(r1+1e-100))*cos(2*PI*r2);//1e-100防止溢出
}main(int argc, char *argv[])
{double x,y,x1,y1,s=45;//s相位旋转角(度)int i;double a=0.05;srand(1234);//随机数种子if(argc!=3){ //如果输入参数不足或多了则按默认参数计算printf("#Usage: a.exe att angle\n");printf("#Default: a.exe 0.05 45\n");}else{a=atof(argv[1]);s=atof(argv[2]);}s=s/180.0*PI;//角度制转弧度for(i=0; i<1000; i++){//标准QPSK解调信号x=((double)rand()/RAND_MAX>0.5)? 1:-1;y=((double)rand()/RAND_MAX>0.5)? 1:-1;x=x+a*randn();//加复高斯噪声y=y+a*randn();x1=x*cos(s)-y*sin(s);//相位旋转y1=x*sin(s)+y*cos(s);printf("%f\t%f\n",x1,y1);//输出星座图数据}
}

以此类似,可得16QAM、64QAM、BPSK、8PSK的星座图程序。

//QPSK信号星座图QAMconst.c
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.14159265double randn()//标准高斯噪声产生(0均值,方差1)
{double r1,r2;r1=(double)rand()/RAND_MAX;r2=(double)rand()/RAND_MAX;return sqrt(-2*log(r1+1e-100))*cos(2*PI*r2);
}main(int argc, char *argv[])
{double x,y,x1,y1,s=0;//s相位旋转角(度)int i;int M=sqrt(64);double a=0.05;srand(1234);//随机数种子if(argc!=4){ //如果输入参数不足或多了则按默认参数计算printf("#Usage: a.exe att angle\n");printf("#Default: 64QAM  a.exe 0.05 0 64\n");}else{a=atof(argv[1]);s=atof(argv[2]);M=sqrt(atoi(argv[3]));}s=s/180.0*PI;//角度制转弧度for(i=0; i<1000; i++){//标准QAM解调信号x=(rand()%M)*2-M+1;y=(rand()%M)*2-M+1;x=x+a*randn();//加复高斯噪声y=y+a*randn();x1=x*cos(s)-y*sin(s);//相位旋转y1=x*sin(s)+y*cos(s);printf("%f\t%f\n",x1,y1);//输出星座图数据}
}

编译作图64QAM:

gnuplot> plot [-12:12] [-12:12] "<a.exe 0.1 0 64"  w p pt 6 lc 3

在这里插入图片描述

gnuplot> plot [-12:12][-12:12] "<a.exe 0.1 0 16"  w p pt 6 lc 3

在这里插入图片描述

M-PSK

//M-PSK信号星座图MPSKconst.c
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.14159265double randn()//标准高斯噪声产生(0均值,方差1)
{double r1,r2;r1=(double)rand()/RAND_MAX;r2=(double)rand()/RAND_MAX;return sqrt(-2*log(r1+1e-100))*cos(2*PI*r2);
}main(int argc, char *argv[])
{double x,y,x1,y1,s=0;//s相位旋转角(度)int i;int M=8;double a=0.05;srand(12345678);//随机数种子if(argc!=4){ //如果输入参数不足或多了则按默认参数计算printf("#Usage: a.exe att angle\n");printf("#Default: 8PSK  a.exe 0.05 0 8\n");}else{a=atof(argv[1]);s=atof(argv[2]);M=atoi(argv[3]);}s=s/180.0*PI;//角度制转弧度for(i=0; i<1000; i++){//标准MPSK解调信号x=(double)(rand()%M)/M*2*PI;y=10*sin(x);x=10*cos(x);x=x+a*randn();//加复高斯噪声y=y+a*randn();x1=x*cos(s)-y*sin(s);//相位旋转y1=x*sin(s)+y*cos(s);printf("%f\t%f\n",x1,y1);//输出星座图数据}
}

编译作图:

plot [-12:12][-12:12] "<a.exe 0.1 0 2"  w p pt 6 lc 3

)

8PSK

plot [-12:12][-12:12] "<a.exe 0.1 0 8"  w p pt 6 lc 3

在这里插入图片描述

这篇关于演示如何通过C代码计算QPSK、QAM、M-PSK星座图数据并用gnuplot作图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412741

相关文章

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da