一、系统架构设计
% 参数设置
N = 64; % 子载波数量
CP = N/4; % 循环前缀长度
M = 16; % 调制阶数 (16-QAM)
numSymbols = 100; % OFDM符号数量
snrRange = 0:2:20; % 信噪比范围(dB)
二、发射端实现
1. 数据生成与调制
% 生成随机比特流
data = randi([0 M-1], N, numSymbols);
% QAM调制
modData = qammod(data, M, 'UnitAveragePower', true);
2. OFDM调制
% IFFT变换
txSymbols = ifft(modData, N, 2);
% 添加循环前缀
txSignal = [txSymbols(:, end-CP+1:end), txSymbols];
3. 信道仿真
% AWGN信道
rxSignal = awgn(txSignal, snrRange(1), 'measured');
三、接收端实现
1. 信号处理
% 去除循环前缀
rxData = rxSignal(:, CP+1:end);
% FFT解调
rxFreq = fft(rxData, N, 2);
2. 解调与误码率计算
% QAM解调
demodData = qamdemod(rxFreq, M, 'UnitAveragePower', true);
% 误码率计算
ber = sum(data ~= demodData, 'all') / numel(data);
四、性能可视化
1. 星座图对比
figure;
subplot(1,2,1);
scatter(real(modData(:)), imag(modData(:)), 'b.');
title('发送端星座图'); axis equal square;
subplot(1,2,2);
scatter(real(rxFreq(:)), imag(rxFreq(:)), 'r.');
title('接收端星座图'); axis equal square;
2. 时域波形分析
figure;
subplot(2,1,1);
plot(abs(txSignal(1,:)), 'b', 'LineWidth', 1.5);
title('发送信号时域波形'); xlabel('样本数'); ylabel('幅度');
subplot(2,1,2);
plot(abs(rxSignal(1,:)), 'r', 'LineWidth', 1.5);
title('接收信号时域波形'); xlabel('样本数'); ylabel('幅度');
3. 误码率曲线
berResults = zeros(length(snrRange),1);
for snrIdx = 1:length(snrRange)
rxSignal = awgn(txSignal, snrRange(snrIdx), 'measured');
% ... 接收处理代码 ...
berResults(snrIdx) = sum(data ~= demodData)/numel(data);
end
semilogy(snrRange, berResults, '-o');
xlabel('SNR (dB)'); ylabel('BER'); grid on;
五、完整代码实现
%% OFDM系统仿真完整代码
clear; clc; close all;
%%%%%%% 参数设置 %%%%%%%
N = 64; % 子载波数量
CP = N/4; % 循环前缀长度
M = 16; % 调制阶数 (16-QAM)
numSymbols = 100; % OFDM符号数量
snrRange = 0:2:20; % 信噪比范围(dB)
%%%%%%% 发射端处理 %%%%%%%
% 生成随机数据
data = randi([0 M-1], N, numSymbols);
% QAM调制
modData = qammod(data, M, 'UnitAveragePower', true);
% IFFT调制
txSymbols = ifft(modData, N, 2);
% 添加循环前缀
txSignal = [txSymbols(:, end-CP+1:end), txSymbols];
%%%%%%% 信道传输 %%%%%%%
berResults = zeros(length(snrRange),1);
for snrIdx = 1:length(snrRange)
% 添加AWGN
rxSignal = awgn(txSignal, snrRange(snrIdx), 'measured');
% 接收端处理
rxData = rxSignal(:, CP+1:end);
rxFreq = fft(rxData, N, 2);
% QAM解调
demodData = qamdemod(rxFreq, M, 'UnitAveragePower', true);
% 误码率计算
berResults(snrIdx) = sum(data ~= demodData, 'all') / numel(data);
end
%%%%%%% 性能可视化 %%%%%%%
figure;
subplot(2,2,1);
stem(abs(modData(1,:)), 'filled');
title('发送端子载波幅度'); xlabel('子载波索引'); ylabel('幅度');
subplot(2,2,2);
stem(angle(modData(1,:)), 'filled');
title('发送端子载波相位'); xlabel('子载波索引'); ylabel('相位(rad)');
subplot(2,2,3);
plot(snrRange, berResults, '-o', 'LineWidth', 2);
title('BER-SNR曲线'); xlabel('SNR(dB)'); ylabel('BER'); grid on;
subplot(2,2,4);
scatter(real(modData(:)), imag(modData(:)), 'b.');
hold on;
scatter(real(rxFreq(:)), imag(rxFreq(:)), 'r.');
title('星座图对比'); legend('发送端','接收端'); axis equal square;
六、特性说明
调制方式
支持16-QAM调制,可扩展至64-QAM(修改
M参数)信道模型
当前实现为AWGN信道,可扩展多径瑞利衰落信道
性能指标
- 误码率(BER)计算
- 星座图可视化
- 子载波幅度/相位分布
参考代码 OFDM调制发射和接收仿真 www.youwenfan.com/contentale/63131.html
七、扩展改进方向
信道增强
添加多径衰落信道模型:
h = (randn(1,N)+1j*randn(1,N))/sqrt(2); % 瑞利衰落信道 rxSignal = filter(h, 1, txSignal);导频插入
在子载波中插入导频进行信道估计
自适应调制
根据信道状态动态调整调制阶数
MIMO-OFDM
扩展为多天线系统