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.pswp.cn/pingmian/83093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化的定义和类型

数据可视化是一种将数据转换为图形或视觉表示的方法。想象一下&#xff0c;你面前有一堆数字和表格&#xff0c;看着这些&#xff0c;可能会让人头大。数据可视化就像是给这些枯燥的数字画上一幅画。它用图表、地图和各种有趣的图形&#xff0c;帮我们把难懂的数字变得容易看懂…

*JavaScript中的Symbol类型:唯一标识符的艺术

JavaScript中的Symbol类型&#xff1a;唯一标识符的艺术 在JavaScript的世界中&#xff0c;数据类型一直是开发者关注的焦点。从基本的Number、String到后来的Symbol&#xff0c;每一种类型的引入都为语言本身注入了新的活力。而今天我们要聊的主角——Symbol&#xff0c;是ES…

粽叶飘香时 山水有相逢

粽叶飘香时 山水有相逢 尊敬的广大客户们&#xff1a; 五月初五&#xff0c;艾叶幽香。值此端午佳节&#xff0c;衡益科技全体同仁向您致以最诚挚的祝福&#xff01; 这一年我们如同协同竞渡的龙舟&#xff0c;在数字化转型的浪潮中默契配合。每一次技术对接、每轮方案优化&a…

一文认识并学会c++模板初阶

文章目录 泛型编程&#xff1a;概念 函数模板概念&#xff1a;&#x1f6a9;函数模板格式原理&#xff1a;&#x1f6a9;函数模板实例化与非模板函数共存 类模板类模板实例化 泛型编程&#xff1a; 概念 &#x1f6a9;编写与类型无关的通用代码&#xff0c;是代码复写一种手段…

Python实现VTK-自学笔记(5):在三维世界里自由舞蹈——高级交互与动态可视化

深夜的台灯在屏幕上投下温暖的弧光,指尖敲击键盘的节奏逐渐与窗外雨滴声融为一体。这是我在VTK世界的第五次探险,此刻显示器里旋转的彩色分子模型仿佛在对我眨眼——它渴望被触摸、被塑造、被赋予生命。今天,就让我们用Python为这些沉默的数据注入灵魂,见证静态可视化如何蜕…

智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?

随着新能源汽车的普及&#xff0c;智慧充电桩作为基础设施的重要组成部分&#xff0c;正逐步向数字化、智能化方向发展。环境监测与动态数据可视化技术的应用&#xff0c;为充电桩的高效管理和运维提供了全新解决方案。通过实时采集环境参数与运行数据&#xff0c;并结合可视化…

LVS +Keepalived高可用群集

目录 一&#xff1a;Keepalived双机热备基础知识 1.Keepalived 概述及安装 1.1.Keepalived的热备方式 1.2.Keepalived 的安装与服务控制 &#xff08;1&#xff09;安装Keepalived &#xff08;2&#xff09;控制Keepalived服务 2.使用Keepalived实现双机热备 2.1.主服务…

深入剖析Java类加载机制:双亲委派模型的突破与实战应用

引言&#xff1a;一个诡异的NoClassDefFoundError 某金融系统在迁移到微服务架构后&#xff0c;突然出现了一个诡异问题&#xff1a;在调用核心交易模块时&#xff0c;频繁抛出NoClassDefFoundError&#xff0c;但类明明存在于classpath中。经过排查&#xff0c;发现是由于不同…

Go语言的context

Golang context 实现原理 本篇文章是基于小徐先生的文章的修改和个人注解&#xff0c;要查看原文可以点击上述的链接查看 目前我这篇文章的go语言版本是1.24.1 context上下文 context被当作第一个参数&#xff08;官方建议&#xff09;&#xff0c;并且不断的传递下去&…

BERT、GPT-3与超越:NLP模型演进全解析

自然语言处理&#xff08;NLP&#xff09;领域近年来经历了前所未有的变革&#xff0c;从早期的统计方法到如今的深度学习大模型&#xff0c;技术的进步推动了机器理解、生成和交互能力的飞跃。其中&#xff0c;BERT和GPT-3作为两个里程碑式的模型&#xff0c;分别代表了不同的…

Kanass入门教程- 事项管理

kanass是一款国产开源免费、简洁易用的项目管理工具&#xff0c;包含项目管理、项目集管理、事项管理、版本管理、迭代管理、计划管理等相关模块。工具功能完善&#xff0c;用户界面友好&#xff0c;操作流畅。本文主要介绍事项管理使用指南。 1、添加事项 事项有多种类型 分…

2025年5月个人工作生活总结

本文为 2025年5月工作生活总结。 研发编码 一个项目的临时记录 月初和另一项目同事向业主汇报方案&#xff0c;两个项目都不满意&#xff0c;后来领导做了调整&#xff0c;将项目合并&#xff0c;拆分了好几大块。原来我做的一些工作&#xff0c;如数据库、中间件等&#xff…

⭐ Unity AVProVideo插件自带播放器 脚本重构 实现视频激活重置功能

一、功能概述 本笔记记录直接修改插件自带的场景播放其中 原始的 MediaPlayerUI 脚本,实现激活时自动重置播放器的功能。 我用的插件版本是 AVPro Video - Ultra Edition 2.7.3 修改后的脚本将具备以下特性: 激活 GameObject 时自动重置播放位置到开头 可配置是否在重置后自…

5.31 数学复习笔记 22

前面的笔记&#xff0c;全部写成一段&#xff0c;有点难以阅读。现在改进一下排版。另外&#xff0c;写笔记实际上就是图一个放松呢&#xff0c;关键还是在于练习。 目前的计划是&#xff0c;把讲义上面的高数例题搞清楚之后&#xff0c;大量刷练习册上面的题。感觉不做几本练…

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程

什么是 WPF 技术&#xff1f;什么是 WPF 样式&#xff1f;下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…

ROS2与Unitree机器人集成指南

Tested systems and ROS2 distro systemsROS2 distroUbuntu 20.04foxyUbuntu 22.04humblesrc目录上级才可以colcon build git clone https://github.com/unitreerobotics/unitree_ros2 Install Unitree ROS2 package 1. Dependencies sudo apt install ros-humble-rmw-cyclon…

深入探讨集合与数组转换方法

目录 1、Arrays.asList() 1.1、方法作用 1.2、内部实现 1.3、修改元素的影响 1.4、注意事项 2、list.toArray() 2.1、方法作用 2.2、内部实现 2.3、修改元素的影响 2.4、特殊情况 1、对象引用 2、数组copy 3、对比总结 4、常见误区与解决方案 5、实际应用建议…

深入理解交叉熵损失函数——全面推演各种形式

带你从不一样的视角综合认识交叉熵损失&#xff0c;阅读这篇文章&#xff0c;帮你建立其分类问题&#xff0c;对比学习&#xff0c;行人重识别&#xff0c;人脸识别等问题的联系&#xff0c;阅读这篇文章相信对你阅读各种底层深度学习论文有帮助。 引言 1. 重新理解全连接层&…

STM32之FreeRTOS移植(重点)

RTOS的基本概念 实时操作系统&#xff08;Real Time Operating System&#xff09;的简称就叫做RTOS&#xff0c;是指具有实时性、能支持实时控制系统工作的操作系统&#xff0c;RTOS的首要任务就是调度所有可以利用的资源来完成实时控制任务的工作&#xff0c;其次才是提高工…

MySQL connection close 后, mysql server上的行为是什么

本文着重讲述的是通过 msql client 连接到 mysql server &#xff0c;发起 update 、 select 操作(由于数据量非常大&#xff0c;所以 update、select 操作都很耗时&#xff0c;即在结果返回前我们有足够的时间执行一些操作) 。 在客户端分别尝试执行 ctrl C 结束关闭 mysql c…