QPSK瑞利信道的误码率(C语言实现) 您所在的位置:网站首页 瑞利信道参数设置在哪里 QPSK瑞利信道的误码率(C语言实现)

QPSK瑞利信道的误码率(C语言实现)

2024-06-12 21:19| 来源: 网络整理| 查看: 265

目录

一、实验思路

二、文件说明

三、实验代码

四、实验结果

记录用C语言实现QPSK瑞利信道误码率的实验,在实现过程中我找了很多资料和多次询问老师进行学习与验证,最终终于实现。所以第一篇文章我想记录下这次实验的过程,以免遗忘。同时,此次实验也有许多不足,希望能够和各位交流学习,共同进步。

一、实验思路

第一次写代码流程图,写得不太好 -_-

二、文件说明

 

Randnum.c 生成随机比特序列

QPSK_Mapping.c 通过QPSK调制比特串得到QPSK信号

Gaussrand.c 生成服从高斯分布的随机数

Noise.c 生成噪声序列

Rayleigh.c生成瑞利衰落信号

UnityR.c合成信号

Distance.c通过最小欧氏距实现均衡检测,同时进行解映射

De_Mapping.c 统计误码率

Complie.c 进行一次信噪比和误码率关系的信道检测

System.c 主函数输出数据

printresult.py 通过得到的数据进行可视化      [C语言不能进行数据的可视化]

三、实验代码

Complie.h (其中一个头文件说明)

N的设置根据代码最终输出的曲线进行调整,如果曲线不够平滑则增大数据量

#ifndef _Complie_H_ #define _Complie_H_ #include #include "RandNum.h"//生成比特序列 #include "QPSK_Mapping.h"//映射 #include "Noise.h"//生成噪声序列 #include "Rayleigh.h"//生成瑞利衰落信道信号 #include "UnityR.h"//合成信号(y=hx+z)复数计算 #include "Distance.h"//最小欧氏距算距离 #include "De_Mapping.h"//统计错误个数 #define N 10000000 double Complie(double result[], double SNR); #endif

0、主函数:进行整个误码率的运算及输出 

#include #include "Complie.h"//输出误码率 int main() { double result[31] = { 0 };//保存误码率 printf("误码率为:\n"); int i = 0;//i作为SNR输入 for (i = 0; i 0.5 标注1, 0.5) num[i] = 1; else num[i] = 0; } //返回数组 return num; }

2、QPSK_Mapping.c 通过QPSK调制比特串得到QPSK信号,将随机比特串作为输入

生成的信号都是复信号,我使用数组进行保存及组合。

/*将比特序列映射成 N个QPSK 信号 =(x1,x2,……,xN) * 1、输入比特串 * 2、映射比特串成 N个QPSK 信号 * QPSK:1、比特串经过星座图的映射得到I路Q路 * 2、[I=cos(w1t) Q=sin(w2t)] 归一化?正交调制 sqrt{I^2+Q^2}振幅 * 3、I路:10(1)[√2/2] 11(1)[√2/2] 00(-1)[-√2/2] 01(-1) [-√2/2] * Q路: 10(-1)[-√2/2] 11(1)[√2/2] 00(-1)[-√2/2] 01(1) [√2/2] * 4、调制后的I,Q两路信号之和为QPSK信号 s(t)=Icosωt−Qsinωt * 3、保存信号 * i为I路 i+1为Q路*/ #include "QPSK_Mapping.h" double* QPSK_Mapping(double QPSK[], int num[],int n) { //比特序列输入,开始映射 int i; for (i = 0; i < n; i=i+2) { //归一化 //I、Q两路信号相加得到QPSK信号,I路为实部,Q部为虚部,合成复数 double w = sqrt(1/2.0); if (num[i] == 1 && num[i + 1] == 1) { QPSK[i] = w; QPSK[i+1] = w; } if (num[i] == 1 && num[i + 1] == 0) { QPSK[i] = w; QPSK[i+1] = -w; } if (num[i] == 0 && num[i + 1] == 1) { QPSK[i] = -w; QPSK[i+1] = w; } if (num[i] == 0 && num[i + 1] == 0) { QPSK[i] = -w; QPSK[i+1] = -w; } } return QPSK; }

3、Gaussrand.c 生成服从高斯分布的随机数

这个正态分布的随机数的生成通过学习网上许多资料才学会的

/*box - muller:先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。*/ /*1、生成两个服从U(0,1)的随机数 2、x=cos(2*pi*u1)*√[(-2)*ln(u2)] y=sin(2*pi*u1)*√[(-2)*ln(u2)] x、y服从CN(0,1) 但是直接使用公式计算得出的结果不稳定 3、使用极坐标的表示的公式计算: x=u1*[√[(-2)*ln((u1^2+u2^2))/(u1^2+u2^2)] y=u2*[√[(-2)*ln((u1^2+u2^2))/√(u1^2+u2^2)]*/ #include "Gaussrand.h" double Gaussrand(int mean, double stdc) { double u1,u2,v1,v2;//随机数 double w=0,x=0; double grandrand = 0;//服从高斯分布的随机数 //产生两个(0,1)均匀分布的随机数 do { u1 = rand()/ (double)RAND_MAX ; u2 = rand() / (double)RAND_MAX; v1 = 2 * u1 - 1; v2 = 2 * u2 - 1; w = v1 * v1 + v2 * v2; } while (w = 1.0); //服从(0,1)均匀分布的随机数 //产生服从(0,1)高斯分布的随机数 x = sqrt(( - 2) * log(w) / w) * u1; //产生服从(mean,stdc)高斯分布的随机数 grandrand = mean + x * stdc; return grandrand; }

4、Noise.c 生成噪声序列

/*产生 N 个噪声序列 z = (z1, z2, …… , zN ) 白噪声:服从正态分布 非平均分布白噪声实部服从,虚部服从CN(0,sigma^2/2) 产生噪声序列==产生正态分布的随机数 */ #include "Noise.h" double* Noise(double noise[],double sigma,int n) { for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有