基于MATLAB的OFDM调制发射与接收仿真

一、系统架构设计

% 参数设置
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;

六、特性

  1. 调制方式

    支持16-QAM调制,可扩展至64-QAM(修改M参数)

  2. 信道模型

    当前实现为AWGN信道,可扩展多径瑞利衰落信道

  3. 性能指标

    • 误码率(BER)计算
    • 星座图可视化
    • 子载波幅度/相位分布

参考代码 OFDM调制发射和接收仿真 www.youwenfan.com/contentcnj/63131.html

七、扩展

  1. 信道增强

    添加多径衰落信道模型:

    h = (randn(1,N)+1j*randn(1,N))/sqrt(2); % 瑞利衰落信道
    rxSignal = filter(h, 1, txSignal);
    
  2. 导频插入

    在子载波中插入导频进行信道估计

  3. 自适应调制

    根据信道状态动态调整调制阶数

  4. MIMO-OFDM

    扩展为多天线系统

posted @ 2025-10-16 17:51  晃悠人生  阅读(69)  评论(0)    收藏  举报