当前位置: 首页 > article >正文

MATLAB实战:实现数字调制解调仿真

以下是使用MATLAB实现BPSK和QPSK数字调制解调仿真的完整代码。该代码包括调制、AWGN信道、匹配滤波/相关解调、星座图绘制以及误码率计算与理论值比较。

%% 清理环境
clear all; close all; clc;

%% 参数设置
numBits = 100000;           % 传输比特数
EbN0_dB = 0:2:10;          % Eb/N0范围 (dB)
modTypes = {'bpsk', 'qpsk'}; % 调制类型

%% 主循环:BPSK和QPSK仿真
for modIdx = 1:length(modTypes)
    modType = modTypes{modIdx};
    berSim = zeros(size(EbN0_dB)); % 存储仿真BER
    
    % 根据调制方式确定参数
    if strcmpi(modType, 'bpsk')
        M = 2;  % 调制阶数
        k = 1;  % 每符号比特数
        % 理论BER计算
        berTheory = berawgn(EbN0_dB, 'psk', M, 'nondiff');
    else % QPSK
        M = 4;
        k = 2;
        % Gray编码的QPSK理论BER
        berTheory = berawgn(EbN0_dB, 'psk', M, 'nondiff');
    end
    
    % 生成随机比特流
    dataBits = randi([0 1], numBits, 1);
    
    % 调制过程
    if strcmpi(modType, 'bpsk')
        % BPSK调制: 0 -> -1; 1 -> 1
        txSym = 2*dataBits - 1;
    else % QPSK调制
        % 重组比特: 每两比特构成一个符号
        reshapedBits = reshape(dataBits, k, [])';
        % Gray映射: [00->1+1j, 01->1-1j, 11->-1-1j, 10->-1+1j]
        txSym = (1 - 2*reshapedBits(:,1)) + 1j*(1 - 2*reshapedBits(:,2));
    end
    
    % 能量归一化 (确保Eb=1)
    if strcmpi(modType, 'qpsk')
        txSym = txSym / sqrt(2); % QPSK符号能量归一化为1
    end
    
    % 循环不同Eb/N0值
    for idx = 1:length(EbN0_dB)
        % 计算当前SNR对应的噪声方差
        EbN0_lin = 10^(EbN0_dB(idx)/10);
        noiseVar = 1/(2*k*EbN0_lin); % 复噪声方差
        
        % 生成复高斯噪声
        noise = sqrt(noiseVar)*randn(size(txSym)) + 1j*sqrt(noiseVar)*randn(size(txSym));
        
        % 通过AWGN信道
        rxSig = txSym + noise;
        
        % 解调过程
        if strcmpi(modType, 'bpsk')
            % BPSK解调: 实部判决
            rxBits = real(rxSig) > 0;
        else % QPSK解调
            % 提取I/Q路并判决
            I = real(rxSig) < 0;  % I路判决
            Q = imag(rxSig) < 0;  % Q路判决
            % 重组比特流
            rxBits = [I Q]';
            rxBits = rxBits(:);
        end
        
        % 计算误比特率(BER)
        bitErr = sum(dataBits ~= rxBits);
        berSim(idx) = bitErr / numBits;
    end
    
    %% 结果可视化
    % 星座图绘制
    figure(modIdx);
    scatterplot(rxSig);
    title([upper(modType) ' Constellation at Eb/N0 = ' num2str(EbN0_dB(end)) ' dB']);
    grid on;
    
    % BER曲线比较
    figure(length(modTypes)+1);
    semilogy(EbN0_dB, berSim, 'o-', 'LineWidth', 2, 'DisplayName', [upper(modType) ' Sim']);
    hold on;
    semilogy(EbN0_dB, berTheory, 's--', 'LineWidth', 2, 'DisplayName', [upper(modType) ' Theory']);
end

%% 图形美化
figure(length(modTypes)+1);
grid on; 
xlabel('Eb/N0 (dB)'); 
ylabel('Bit Error Rate (BER)');
title('BER Performance Comparison');
legend('Location', 'southwest');
set(gca, 'YScale', 'log');
ylim([1e-5 1]);

代码功能说明:

  1. 调制方式

    • BPSK:二进制相移键控(0→-1, 1→+1)

    • QPSK:正交相移键控(Gray编码:00→(1+1j)/√2, 01→(1-1j)/√2, 11→(-1-1j)/√2, 10→(-1+1j)/√2)

  2. 关键处理步骤

    • 比特生成:生成随机二进制数据

    • 调制映射:根据调制类型将比特映射为复符号

    • 能量归一化:确保单位比特能量(Eb=1)

    • AWGN信道:添加复高斯白噪声

    • 解调判决:相关解调(实部/虚部分别判决)

    • BER计算:比较发送与接收比特

  3. 可视化功能

    • 星座图(scatterplot函数)

    • BER曲线:仿真结果与理论值(berawgn函数)对比

  4. 理论BER参考

    • BPSK理论BER:0.5*erfc(sqrt(Eb/N0))

    • QPSK理论BER:与BPSK相同(Gray编码时)

运行结果示例:

  1. 星座图

    • BPSK:两点分布在实轴±1位置

    • QPSK:四点分布在复平面四个象限

  2. BER曲线

    • 仿真曲线(带标记)与理论曲线(虚线)紧密重合

    • 随Eb/N0增加,BER指数下降

关键函数说明:

  1. berawgn:计算AWGN信道理论BER

  2. scatterplot:绘制信号星座图

  3. randi:生成随机比特序列

  4. semilogy:绘制对数坐标BER曲线

此代码完整实现了数字调制解调系统仿真流程,通过调整参数(如numBitsEbN0_dB)可进行不同规模的仿真实验。

http://www.lryc.cn/news/2398578.html

相关文章:

  • ccf中学生计算机程序设计入门篇课后题p164页test(1)-2 输入一个数,统计这个数二进制中1的个数
  • 实现Cursor + Pycharm 交互
  • C++标准模板库
  • dvwa6——Insecure CAPTCHA
  • 【机器学习及深度学习】机器学习模型的误差:偏差、方差及噪声
  • 【学习笔记】On the Biology of a Large Language Model
  • 飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程
  • 星野录(博客系统)测试报告
  • 使用 Java 实现一个简单且高效的任务调度框架
  • 2022—2025年:申博之路及硕士阶段总结
  • 项目执行中缺乏灵活应对机制,如何增强适应性?
  • Agentic Workflow是什么?Agentic Workflow会成为下一个AI风口吗?
  • 大模型模型推理的成本过高,如何进行量化或蒸馏优化
  • BUUCTF[极客大挑战 2019]EasySQL 1题解
  • Css样式中设置gap: 12px以后左右出现距离问题解析
  • MySQL问题:count(*)与count(1)有什么区别
  • 大模型 提示模板 设计
  • excel表格记账 : 操作单元格进行加减乘除 | Excel中Evaluate函数
  • 20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s
  • 如何合理设计缓存 Key的命名规范,以避免在共享 Redis 或跨服务场景下的冲突?
  • Trae CN IDE自动生成注释功能测试与效率提升全解析
  • 让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作
  • C++概率论算法详解:理论基础与实践应用
  • ssh登录wsl2
  • 黑马Java面试笔记之 消息中间件篇(Kafka)
  • LeetCode - 234. 回文链表
  • PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构
  • nginx+tomcat动静分离、负载均衡
  • SQL进阶之旅 Day 13:CTE与递归查询技术
  • 【PmHub面试篇】Gateway全局过滤器统计接口调用耗时面试要点解析