OFDM发射器仿真Python | WiMAX 256点FFT
本页涵盖了根据WiMAX 256点FFT的OFDM发射机仿真。它包括二进制发生器,QPSK调制(映射),OFDM符号形成和各种图。
简介: OFDM是WiMAX和WLAN标准中使用的一种多载波传输方案。它已在IEEE 802.11a物理层规范中引入,后来又在IEEE 802.16-2004物理层中引入。其变体OFDMA被广泛应用于4G LTE系统和后续版本的蜂窝标准。
如图1所示,WiMAX物理层由发射机和接收机组成。发射模块包括扰频器、EFC编码器、交织器、数据调制、IFFT、CP插入等。接收机由发射模块的反向功能组成。此外,接收机还具有时偏频偏校正和信道均衡模块。请参考WiMAX OFDM物理层>>而且Wlan ofdm phy >>获取更多信息。
在这个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 ()
进口随机
将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后符号与样本的关系。
Python中其他有用的DSP代码
相关python脚本
Python编程教程
Convolution python脚本
BPSK QPSK 16QAM 64QAM调制
16点FFT代码
OFDM发射机仿真代码
瑞利衰落信道
瑞尔斯衰落信道
ASK调制python代码
FSK调制python代码
PSK调制python代码
MATLAB代码的有用链接
OFDM前导信号的产生
时间偏差估计
频率估计
信道估计
11a WLAN信道
PN序列生成
OFDMA Tx Rx
AES DES
载波聚合
CCDF
冷杉过滤器
IIR滤波器
低通FIR
维特比译码器
CRC8 CRC32