演示如何通过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

相关文章

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra