射频和无线供应商和资源的家

一站式满足您的射频和无线需求

OFDM发射器仿真Python | WiMAX 256点FFT

本页涵盖了根据WiMAX 256点FFT的OFDM发射机仿真。它包括二进制发生器,QPSK调制(映射),OFDM符号形成和各种图。

简介: OFDM是WiMAX和WLAN标准中使用的一种多载波传输方案。它已在IEEE 802.11a物理层规范中引入,后来又在IEEE 802.16-2004物理层中引入。其变体OFDMA被广泛应用于4G LTE系统和后续版本的蜂窝标准。

wimax物理层发射机部分框图

如图1所示,WiMAX物理层由发射机和接收机组成。发射模块包括扰频器、EFC编码器、交织器、数据调制、IFFT、CP插入等。接收机由发射模块的反向功能组成。此外,接收机还具有时偏频偏校正和信道均衡模块。请参考WiMAX OFDM物理层>>而且Wlan ofdm phy >>获取更多信息。

OFDM发射机的python仿真

在这个python模拟中,我们将模拟OFDM发送模块,即二进制发生器,QPSK调制,符号形成,IFFT和CP插入模块。该代码模拟大小等于一个OFDM符号的数据,即384位,可以在携带QPSK复杂符号的192个数据载体上占用。该符号在每个OFDM符号中容纳八个导频。同样的代码可以被转换成由多个OFDM符号组成的帧。根据16QAM和64QAM调制类型,将“mu”的值分别改为4和6,可以更改为其他调制方案。

OFDM Python代码

# Python库导入
进口随机
将numpy导入为np
进口matplotlib。Pyplot作为PLT
从scipy。Fftpack导入fft, ifft, ifftshift

# Step1: WiMaX OFDM 256仿真参数配置
dataCarriers = 192 #符号中数据子载体的数量
对于QPSK调制类型,mu =每个符号2 #位(对于16QAM, mu = 4,对于64QAM, mu = 6)
payloadBits_per_OFDM = dataCarriers * mu#每个OFDM符号的有效负载位数192*2 = 384位
Input_data = ""
len1 = payloadBits_per_OFDM #输入数据长度
pilot = [1, - 1,1, -1, -1, -1, -1, 1,1] # 8
pilot_pop =[41, 66, 91, 116, 142, 167, 192, 217] #引导子载波在OFDM符号中的位置
mode = 2 # QPSK的调制顺序
Mapping_table = {
0: 0.7071 + 0.7071j,
1: - 0.7071 + 0.7071j,
2: 0.7071 - 0.7071j,
3: - 0.7071 - 0.7071j}

#步骤2:为1个符号数据载体生成二进制数据,即384位
对于范围(len1)中的I:
Temp1 = str(随机的。randint (0,1))
Input_data += temp1
打印(input_data)

#步骤3:将二进制向量转换为2位组(根据QPSK)和
# map与每个映射表相同
S1 = input_data
S2 = []
chunk = [s1[i:i+mode] for i in range(0, len(s1), mode)]
对于piece in chunks:
Temp = int(piece, 2)
s2.append(临时)
打印(s2)
Q = np. 0 ((192,), dtype=复数)
J = 0
对于s2中的val:
Q[j] = mapping_table[val]
J += 1
打印(Q)

第四步:按照WiMAX OFDM符号格式安排数据子载波
List1 = [i for i in range(29,41)]
List2 = [i for i in range(42,66)]
List3 = [i for i in range(67,91)]
List4 = [i for i in range(92,116)]
List5 = [i for i in range(117, 129)]
List6 = [i for i in range(130, 142)]
List7 = [i for i in range(143, 167)]
List8 = [i for i in range(168, 192)]
List9 = [i for i in range(193,217)]
List10 = [i for i in range(218, 230)]
List = list1 + list2 + list3 + list4 + list5 + list6 + list7 + list8 + list9 + list10
#打印(列表)
Dummy = [0 for range(256)]
打印('全零:',dummy)

第5步:调制值(到数据子载波)和导频值(到导频子载波)插入
I = 0
对于列表中的val1:
dummy[val1] = Q[i]
I += 1
打印('插入的复杂值:',dummy)
I = 0
对于pilot_pop中的val2:
Dummy [val2] = pilot[i]
I += 1
打印('先导值插入:',dummy)

第6步:整个符号大小为256的傅里叶反变换
N = 256
OFDM_sym = ifft(dummy, N)
CP =16 # 16个样本的循环前缀
CP_samples = OFDM_sym[N-CP:] #从符号中提取CP样本
OFDM_sym_cp = np。append([CP_samples], [OFDM_sym]) #连接CP和符号
x = ifftshift(OFDM_sym_cp)

#初始化subplot函数
图,轴= plt。次要情节(2,2)
#用于内置卷积
轴(0,0).plot (Q。real, Q.imag, 'bo')
轴(0,0)。set_title("QPSK星座图")
为我们自己的函数
轴[0,1]。情节(哑,“罗”)
轴[0,1]。set_title(“#分载体最终再:数据(192),飞行员(8)、空(55),直流(1)”)
轴(1,0).plot (OFDM_sym)
轴(1,0)。set_title("1符号OFDM功率(IFFT后)vs时间")
Xfft = fft(OFDM_sym, 256)
轴[1].plot (abs (Xfft))
轴[1]。set_title("OFDM绝对值(FFT后)vs频率")
plt.show ()

输出的情节

下面是上面提到的OFDM python脚本的输出图。图包括QPSK星座图、子载波(数据、导频、守护、DC)及其值、IFFT后符号与时间的关系以及FFT后符号与样本的关系。

OFDM发射器python脚本输出图

Python中其他有用的DSP代码

MATLAB代码的有用链接

射频和无线教程


翻译本页
Baidu