OFDM python实现

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.fftpack import fft, ifft
from numpy.linalg import inv

# 1. 定义OFDM系统的参数
N = 64          # 子载波数量 (FFT/IFFT的大小)
cp_len = 16     # 循环前缀长度
M = 4           # QAM调制阶数 (M=4 对应 QPSK)
num_symbols = 100 # OFDM符号数
snr = 20        # 信噪比 (dB)

# 2. 生成随机数据并进行调制
data_bits = np.random.randint(0, M, N * num_symbols)  # 生成随机数据
mod_data = np.exp(1j * (2 * np.pi * data_bits / M))  # QAM调制

# 3. 构建OFDM符号
ofdm_symbols = np.reshape(mod_data, (num_symbols, N))
ifft_data = ifft(ofdm_symbols, N)  # IFFT变换到时域

# 添加循环前缀
ofdm_symbols_with_cp = np.hstack([ifft_data[:, -cp_len:], ifft_data])
tx_signal = ofdm_symbols_with_cp.flatten()

# 4. 模拟多径衰落信道
h = np.array([0.3, 0.6, 0.4])  # 多径信道增益
rx_signal = np.convolve(tx_signal, h)[:len(tx_signal)]  # 多径信道的卷积

# 加入噪声
noise_power = 10 ** (-snr / 10)
noise = np.sqrt(noise_power / 2) * (np.random.randn(len(rx_signal)) + 1j * np.random.randn(len(rx_signal)))
rx_signal = rx_signal + noise

# 5. 接收端处理
rx_signal = np.reshape(rx_signal, (num_symbols, N + cp_len))
rx_signal = rx_signal[:, cp_len:]  # 移除循环前缀
rx_symbols = fft(rx_signal, N)  # FFT变换到频域

# 6. 信道估计与均衡
H_est = np.fft.fft(h, N)  # 理想情况下,我们知道h,可以通过导频估计得到
rx_symbols_equalized = rx_symbols / H_est  # 均衡(Zero Forcing)

# 7. QAM解调
received_data = np.angle(rx_symbols_equalized.flatten()) * M / (2 * np.pi)
received_data = np.round(received_data).astype(int) % M

# 8. 性能评估
num_errors = np.sum(data_bits != received_data)
ber = num_errors / len(data_bits)
print(f'误码率 = {ber}')

# 9. 结果可视化
plt.figure()
plt.scatter(np.real(rx_symbols_equalized.flatten()), np.imag(rx_symbols_equalized.flatten()))
plt.title('Received Constellation Diagram after Equalization')
plt.grid(True)
plt.show()

plt.figure()
plt.plot(20 * np.log10(np.abs(np.fft.fftshift(fft(rx_symbols_equalized[0])))))
plt.title('Received OFDM Symbol Spectrum after Equalization')
plt.xlabel('Subcarrier Index')
plt.ylabel('Magnitude (dB)')
plt.grid(True)
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShuaS2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值