C++实现QAM16调制解调

QAM16调制解调

简单说明QAM16调制就是QPSK和4ASK一起使用,相对单独的QPSK和4ASK来说,能够提升频谱利用效率。

暂时没有波形输出,后继版本会添加相关的波形输出代码,以及滤波器相关的设计

类中的x代表输入码的个数,类中的y代表每个周期的采样点数,其他算法相关数据依据这两点产生,其中频率默认是2000Hz,可以直接更变为更高。频率是fre参数,只能设置为整数。

抽样判决需要等低通滤波器设计完后才能实现,后继该文章会更新。

#include "pch.h"
#include <iostream>
#define _MATH_DEFINES_DEFINED
#include <math.h>
#include <stdlib.h>

static const float PI = atan(1) * 4;
static const float PI2 = atan(1);

class filter;

class QAM16
{
private:
	int sl;        //信号数目
	float *sig;    //信号数组
	float *sam_Time;   //采样点时间

	float *demod_sig1;  //解调后波形
	float *demod_sig2;  //解调后波形
	
	int *num;      //输入数据
	
	int fre;       //载波频率
	int sam;       //每个周期采样点数
	float fre_Flo;
	
	int sam_Fre;   //采样频率
	int car_Sam;   //每个载波采样个数
	int car_Num;   //多少个周期传输一个信息码
	int code_Num;  //多少个采样点传递一个信息码
	int all_Sam;   //一共多少个采样点
public:     
	QAM16(int x = 10, int y = 10); //初始化信号数组
	void set_QAM16_num();
	void set_QAM16_sig();
	void demod_QAM16_sig();

	friend class FIR_lowpassfilter;
};

QAM16::QAM16(int x, int y)
{
	if (x < 1)
	{
		std::cout << "码个数不能少于1";
		return;
	}

	if (y<2)
	{
		std::cout << "每个周期采样点数不能小于2";
		return;
	}

	sl = x;
	sam = y;

	fre = 2000;
	fre_Flo = fre * PI;
	sam_Fre = fre * y;

	car_Num = 10;
	car_Sam = y;
	code_Num = car_Num * car_Sam;
	all_Sam = code_Num * x;

	num = new int [sl];
	sig = new float [all_Sam];
	sam_Time = new float[all_Sam];
	demod_sig1 = new float[all_Sam];
	demod_sig2 = new float[all_Sam];

	for (int i = 0; i < all_Sam; i++)
		sam_Time[i] = i / sam_Fre * fre_Flo;

	return;
}

void QAM16::set_QAM16_num()
{
	for (int i = 0; i < sl; i++)
		num[i] = rand() % 16;
}

void QAM16::set_QAM16_sig() //调制
{
	int a, b;
	for (int i = 0; i < sl; i++)
	{
		a = num[i] / 4 + 1;
		b = num[i] % 4;
		for (int j = 0; j < code_Num; j++)
			sig[j] = a * cos(sam_Time[i*code_Num + j] + PI2 * b);
	}
}

void QAM16::demod_QAM16_sig()
{
	for (int j = 0; j < code_Num*sl; j++)
	{
		demod_sig1[j] = cos(sam_Time[j])*sig[j];
		demod_sig2[j] = cos(sam_Time[j] + PI2)*sig[j];
	}	
}



int main()
{
	QAM16 Signal;
	Signal.set_QAM16_sig();
	Signal.set_QAM16_num();
	Signal.demod_QAM16_sig();
}

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QAM256调制解调是一种高阶多载波调制技术,在现代通信系统中得到广泛应用。在MATLAB中实现QAM256调制解调可以采用数字信号处理(DSP)和通信工具箱中的相关函数。 QAM256调制的原理是将数据分成不同的子载波,通过不同的幅度和相位来表示不同的符号,从而实现高效的信号传输。具体实现过程如下: 1. 数据编码:将需要传输的数据进行编码,通常采用的是二进制码。 2. QAM预处理:将编码后的数据划分成多个子载波,在每个子载波上采用不同的调制格式(如QPSK、16QAM、64QAM等)进行调制,得到各子载波上的QAM信号。 3. 多载波加和:将各子载波上的QAM信号进行加和,得到多载波QAM信号。 4. 信号发送:将多载波QAM信号通过信道发送到接收端。 5. QAM解调:接收到信号后进行QAM解调,将多载波QAM信号分解成各个子载波上的QAM信号,以便进一步处理。 6. 后处理:将各子载波上的QAM信号进行解码,恢复对应的数据。 在MATLAB中,可以通过使用comm.RectangularQAMModulator和comm.RectangularQAMDemodulator等函数实现QAM256调制和解调。具体步骤包括: 1. 创建comm.RectangularQAMModulator对象,设置调制方式为256QAM,生成调制表。 qamMod = comm.RectangularQAMModulator('ModulationOrder',256); 2. 使用qamMod函数对待传输的数据进行调制。 modData = qamMod(data); 其中,data为待传输的数据。 3. 接收端解调,通过comm.RectangularQAMDemodulator对象进行解调。 qamDemod = comm.RectangularQAMDemodulator('ModulationOrder',256); demodData = qamDemod(rxSignal); 其中,rxSignal为接收到的信号。 4. 对解调数据进行后处理,恢复原始数据。 可以通过一些特定的解码算法对解调数据进行解码,得到原始数据。 总之,MATLAB提供了丰富的函数和工具箱支持,能够快速、高效地实现QAM256调制解调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值