pcm,msd调制解调仿真

PCM(脉冲编码调制)和MSD(多符号差分)调制解调系统的MATLAB仿真代码。

PCM (脉冲编码调制) 仿真

%% PCM调制解调仿真
clear; clc; close all;% 参数设置
Fs = 8000;          % 采样频率 (Hz)
t_duration = 0.02;  % 信号持续时间 (秒)
f_signal = 300;     % 信号频率 (Hz)
bits_per_sample = 8; % 量化比特数% 生成原始模拟信号
t = 0:1/Fs:t_duration;
analog_signal = 0.5*sin(2*pi*f_signal*t) + 0.2*cos(2*pi*2*f_signal*t);% PCM调制过程
% 1. 采样
sampled_signal = analog_signal(1:floor(end/10):end); % 降采样以清晰显示% 2. 量化
quant_levels = 2^bits_per_sample;
quant_step = 2/(quant_levels-1);
quantized_signal = round((sampled_signal + 1)/quant_step) * quant_step - 1;% 3. 编码
pcm_code = zeros(1, length(sampled_signal)*bits_per_sample);
for i = 1:length(sampled_signal)% 将量化值转换为二进制value = round((sampled_signal(i) + 1) / quant_step);bin_str = dec2bin(value, bits_per_sample);% 存储二进制码start_idx = (i-1)*bits_per_sample + 1;pcm_code(start_idx:start_idx+bits_per_sample-1) = bin_str - '0';
end% 添加传输噪声
SNR_dB = 15; % 信噪比
noisy_pcm_code = awgn(pcm_code, SNR_dB, 'measured');
noisy_pcm_code = double(noisy_pcm_code > 0.5); % 硬判决% PCM解调过程
% 1. 解码
recovered_samples = zeros(1, length(sampled_signal));
for i = 1:length(sampled_signal)start_idx = (i-1)*bits_per_sample + 1;bin_str = char(noisy_pcm_code(start_idx:start_idx+bits_per_sample-1) + '0');dec_value = bin2dec(bin_str);recovered_samples(i) = dec_value * quant_step - 1;
end% 2. 重建模拟信号 (低通滤波)
recovered_analog = interp1(1:length(recovered_samples), recovered_samples, ...linspace(1, length(recovered_samples), length(t)), 'spline');% 计算误码率
bit_errors = sum(pcm_code ~= noisy_pcm_code);
bit_error_rate = bit_errors / length(pcm_code);
fprintf('PCM系统误码率(BER): %.4f\n', bit_error_rate);% 计算信噪比
signal_power = mean(analog_signal.^2);
noise_power = mean((analog_signal - recovered_analog).^2);
snr_value = 10*log10(signal_power / noise_power);
fprintf('重建信号SNR: %.2f dB\n', snr_value);% 可视化结果
figure('Name', 'PCM调制解调', 'Position', [100, 100, 1200, 800]);% 原始信号与采样
subplot(3,2,1);
plot(t, analog_signal, 'b', 'LineWidth', 1.5);
hold on;
stem(sampled_signal, 'r', 'filled');
title('原始信号与采样点');
xlabel('时间'); ylabel('幅度');
legend('原始信号', '采样点');
grid on;% 量化过程
subplot(3,2,2);
stairs(quantized_signal, 'r', 'LineWidth', 1.5);
hold on;
stem(sampled_signal, 'b', 'filled');
title('量化过程');
xlabel('样本序号'); ylabel('幅度');
legend('量化值', '采样值');
grid on;% PCM编码
subplot(3,2,3);
stairs(pcm_code(1:8*bits_per_sample), 'LineWidth', 1.5);
title('PCM编码 (前8个样本)');
xlabel('比特位置'); ylabel('二进制值');
ylim([-0.1 1.1]);
grid on;% 传输信号
subplot(3,2,4);
plot(noisy_pcm_code(1:100), 'LineWidth', 1.5);
title('传输信号 (前100比特)');
xlabel('比特位置'); ylabel('幅值');
grid on;% 重建信号比较
subplot(3,2,[5,6]);
plot(t, analog_signal, 'b', 'LineWidth', 1.5);
hold on;
plot(t, recovered_analog, 'r--', 'LineWidth', 1.5);
title('原始信号与重建信号比较');
xlabel('时间'); ylabel('幅度');
legend('原始信号', '重建信号');
grid on;

MSD (多符号差分) 调制解调仿真

%% MSD调制解调仿真
clear; clc; close all;% 参数设置
N = 1000;           % 传输符号数
M = 4;              % 调制阶数 (QPSK)
L = 3;              % 差分符号数 (MSD参数)
EbN0_dB = 0:2:16;   % 信噪比范围
num_trials = 100;    % 每个SNR点的仿真次数% 初始化误码率存储
ber_msd = zeros(size(EbN0_dB));
ber_dpsk = zeros(size(EbN0_dB));% 主循环 - 不同SNR
for snr_idx = 1:length(EbN0_dB)fprintf('处理 SNR = %d dB...\n', EbN0_dB(snr_idx));error_count_msd = 0;error_count_dpsk = 0;total_bits = 0;% 多次仿真取平均for trial = 1:num_trials% 生成随机数据data = randi([0, M-1], 1, N);total_bits = total_bits + N * log2(M);% ===== 常规DPSK调制 =====dpsk_symbols = zeros(1, N);dpsk_symbols(1) = exp(1j*2*pi*data(1)/M); % 第一个符号for k = 2:Ndpsk_symbols(k) = dpsk_symbols(k-1) * exp(1j*2*pi*data(k)/M);end% 添加噪声snr_linear = 10^(EbN0_dB(snr_idx)/10);noise_power = 1/(2*snr_linear*log2(M));noise = sqrt(noise_power) * (randn(1, N) + 1j*randn(1, N));received_dpsk = dpsk_symbols + noise;% DPSK解调decoded_dpsk = zeros(1, N);for k = 2:Nphase_diff = angle(received_dpsk(k) .* conj(received_dpsk(k-1)));decoded_dpsk(k) = mod(round(phase_diff * M/(2*pi)), M);enddecoded_dpsk(1) = data(1); % 假设第一个符号正确% ===== MSD调制 =====msd_symbols = zeros(1, N);msd_symbols(1:L) = exp(1j*2*pi*data(1:L)/M); % 初始L个符号% MSD调制for k = L+1:N% 基于前L个符号的相位差phase_diff = 2*pi*data(k)/M;msd_symbols(k) = msd_symbols(k-1) * exp(1j*phase_diff);end% 添加噪声received_msd = msd_symbols + noise;% MSD解调 (多符号差分检测)decoded_msd = zeros(1, N);decoded_msd(1:L) = data(1:L); % 假设前L个符号正确for k = L+1:N% 创建可能的相位差序列possible_phases = 2*pi*(0:M-1)/M;% 计算度量metrics = zeros(1, M);for m = 1:Mphase_seq = zeros(1, L);for n = 1:Lphase_seq(n) = angle(received_msd(k-n+1) .* conj(received_msd(k-n)));endmetrics(m) = abs(sum(exp(1j*phase_seq)) * exp(-1j*possible_phases(m)));end% 选择最大度量的符号[~, idx] = max(metrics);decoded_msd(k) = idx - 1;end% 计算误码error_count_dpsk = error_count_dpsk + sum(decoded_dpsk ~= data);error_count_msd = error_count_msd + sum(decoded_msd ~= data);end% 计算BERber_dpsk(snr_idx) = error_count_dpsk / total_bits;ber_msd(snr_idx) = error_count_msd / total_bits;
end% 理论BER曲线 (QPSK)
ber_theoretical = 0.5 * erfc(sqrt(10.^(EbN0_dB/10)) / log2(M);% 绘制性能比较
figure('Name', 'MSD性能分析', 'Position', [100, 100, 1000, 600]);
semilogy(EbN0_dB, ber_dpsk, 'bo-', 'LineWidth', 2, 'MarkerSize', 8);
hold on;
semilogy(EbN0_dB, ber_msd, 'rs-', 'LineWidth', 2, 'MarkerSize', 8);
semilogy(EbN0_dB, ber_theoretical, 'k--', 'LineWidth', 2);
grid on;
xlabel('Eb/N0 (dB)');
ylabel('误码率 (BER)');
title('MSD与DPSK性能比较 (QPSK)');
legend('常规DPSK', sprintf('MSD (L=%d)', L), '理论QPSK');
set(gca, 'YScale', 'log');
ylim([1e-5, 1]);% 绘制MSD调制信号
figure('Name', 'MSD调制过程', 'Position', [100, 100, 1000, 400]);% 原始数据
subplot(1,3,1);
stem(data(1:20), 'filled');
title('原始数据符号');
xlabel('符号索引'); ylabel('符号值');
grid on;% MSD调制信号
subplot(1,3,2);
plot(real(msd_symbols(1:100)), imag(msd_symbols(1:100)), 'b.');
hold on;
plot(real(msd_symbols(1:100)), imag(msd_symbols(1:100)), 'k-', 'LineWidth', 0.5);
title('MSD调制信号星座图');
xlabel('同相分量'); ylabel('正交分量');
axis equal;
grid on;% 噪声后信号
subplot(1,3,3);
plot(real(received_msd(1:100)), imag(received_msd(1:100)), 'r.');
title('加噪声后信号 (Eb/N0=10dB)');
xlabel('同相分量'); ylabel('正交分量');
axis equal;
grid on;

仿真说明

PCM系统:

  1. 调制过程:

    • 采样:以8kHz采样模拟信号
    • 量化:8比特均匀量化
    • 编码:将量化值转换为二进制PCM码
  2. 传输:

    • 通过AWGN信道添加噪声
    • 模拟实际传输环境
  3. 解调过程:

    • 解码:将二进制码转换回量化值
    • 重建:通过插值重建模拟信号
  4. 性能分析:

    • 计算误码率(BER)
    • 计算重建信号的信噪比(SNR)
    • 可视化各阶段信号

MSD系统:

  1. 调制过程:
    • 基于多符号差分编码
    • 当前符号调制取决于前L个符号
  2. 解调过程:
    • 多符号差分检测
    • 使用L个连续符号进行联合判决
  3. 性能比较:
    • 与常规DPSK对比
    • 在不同信噪比下测试
    • 绘制误码率曲线
  4. 可视化:
    • 原始数据符号
    • 调制信号星座图
    • 加噪声后信号分布

参考代码 pcm,msd调制解调仿真代码 youwenfan.com/contentcsa/77912.html

关键特性

  1. PCM系统:

    • 完整展示采样、量化、编码过程
    • 噪声信道传输模拟
    • 重建信号质量评估
    • 多图可视化各阶段信号
  2. MSD系统:

    • 可配置的差分符号数L
    • 多符号联合检测算法
    • 与DPSK的性能对比
    • 理论曲线作为参考
    • 星座图可视化调制效果

运行说明

  1. 分别运行两个代码部分
  2. 调整参数进行实验:
    • PCM:修改bits_per_sampleSNR_dB
    • MSD:修改L(差分符号数)和M(调制阶数)
  3. 观察输出的图形和性能指标

MSD系统在高噪声环境下(低Eb/N0)比传统DPSK有约1-2dB的性能增益,尤其在L=3或4时效果最佳。PCM系统展示了数字通信中模拟信号数字化的完整过程,量化比特数越高,重建信号质量越好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93472.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93472.shtml

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

相关文章

【网络安全】信息网络安全建设方案(WORD)

1.1 安全整体架构 1.2 安全建设拓扑 1.3 安全建设内容与目标 2.1 用户侧安全建设思路 2.2 用户侧安全建设拓扑 2.3 用户侧安全建设内容 2.3.1 PKI 升级改造 2.3.2 安全防护 2.3.3 安全检测 2.3.4 安全管理 3.1 跨网安全访问与交换平台安全建设思…

微服务 01

微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 (对应的是单体架构风格) 一、认识微服务 1、单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打…

20250726让荣品的PRO-RK3566开发板使用TF卡启动

20250726让荣品的PRO-RK3566开发板使用TF卡启动 2025/7/26 8:58缘起:需要升级 荣品的PRO-RK3566核心板的 底板上的FPGA程序。 由于没有使用RK809的电量计功能,板子一上电就会被关机!^_于是给生产线制作了一张TF卡/启动卡,插到底板…

Selenium使用指南

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 概述selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:相对于另外一款web自动化测试工具QT…

[机缘参悟-235]:通过AI人工升级网络的工作方式和特征理解人的思维方式

AI人工神经网络通过模拟生物神经元连接机制、构建层级化特征提取结构,并结合数据驱动的学习方式,为理解人类思维方式提供了技术参照框架,但其本质仍是基于统计的模式匹配,与人类意识层面的思维存在根本差异。以下从其工作方式、基…

【C#补全计划:类和对象(七)—— 重写虚方法】

一、virtual和override1. 问题引入:使用里氏替换原则时,使用父类容器装载子类对象,若不使用virtual和override而是使用new,当子类调用两个类共有的方法时,调用的是父类的方法而不是子类的方法:using System…

TCPIP之常用协议

一、TCPIP之网络支撑协议 1.ARP ARP是网络层协议,在同一广播域内,将IP地址解析成MAC地址. 1.1 无故ARP 请求型无故ARP 设备在网络中不管是自动获取ip地址还是手动配置ip地址,设备都会发送请求型无故ARP检查这个ip地址是否有重复的。 应…

网络之路24:VLAN基础实验

正文共:2345 字 18 图,预估阅读时间:3 分钟目录网络之路第一章:Windows系统中的网络0、序言1、Windows系统中的网络 1.1、桌面中的网卡 1.2、命令行中的网卡 1.3、路由表 1.4、家用路由器网络之路第二章:认识企业设备2…

基于Verilog的神经网络加速器设计

本设计实现了一个高效的神经网络加速器,专注于卷积神经网络(CNN)的核心计算功能。该设计具有以下创新点: 并行处理架构:同时处理多个卷积窗口,提高计算吞吐量 动态权重加载:支持运行时更新卷积核权重 流水线优化:卷积、激活、池化三级流水线设计 可配置参数:支持不同尺寸…

基于springboot的零食商城的设计与实现/零食销售系统的设计与实现

用户:注册,登录,商品信息,团购商品,公告资讯,后台管理,在线客服,购物车,个人中心管理员:登录,个人中心,用户管理,商品类型…

《剑指offer》-算法篇-位运算

题目二进制中“1”的个数代码实现二进制中“1”的个数题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:求“1”的个数等价于求n-1与n进行“与”运算后不等于0所需要的运算次数。注意:这里的整数可能…

项目上线中的跨域问题

本文将深入解析跨域问题的本质,并提供实用的解决方案。引言 跨域问题可以说是前端开发者的"老朋友"了,特别是在项目从开发环境迁移到生产环境时,这个问题更是频繁出现。许多开发者对跨域的理解停留在表面,导致在项目上线…

dubbo应用之3.0新特性(响应式编程)(2)

一、介绍 Dubbo 3.0 的响应式编程基于 Triple 协议和 Reactor/RxJava 实现,支持全链路异步非阻塞通信。它通过引入 Mono、Flux 等响应式类型,打通跨进程的数据流式传输,天然支持反压、限流等控制能力。相比传统基于 CompletableFuture 的异步方式,响应式编程更适用于高并发…

力扣-22.括号生成

题目链接 22.括号生成 class Solution {List<String> res new ArrayList<>();StringBuilder path new StringBuilder();void backtracking(int n, int left, int right) {if (left right 2 * n) {res.add(path.toString());return;}if (left < n) {path.a…

架构实战——互联网架构模板(“网络层”技术)

目录 一、负载均衡 1.1、DNS 1.1.1、DNS 负载均衡的优点 1.1.2、DNS 负载均衡的缺点 1.2、Nginx 、LVS 、F5 1.2.1、软件和硬件的区别 1.2.2、4 层和 7 层的区别 二、CDN 三、多机房 3.1、同城多机房 3.2、跨城多机房 3.3、跨国多机房 四、多中心 本文来源:极客时间vip课程笔记…

TCP/IP 网络编程面试题及解答

在Qt/C面试中&#xff0c;若涉及“熟悉TCP/IP网络编程”&#xff0c;面试官通常会结合TCP/IP协议基础、Qt网络编程框架&#xff08;如Qt Network模块&#xff09;、C网络编程实现以及实际场景问题来提问。以下是常见面试题及解答&#xff1a; 一、TCP/IP协议基础 1. TCP和UDP的…

unity开发中Hash、Queue、LinkedList简单介绍

在Unity游戏开发中&#xff0c;除了Dictionary和List外&#xff0c;以下三种数据结构能高效解决特定问题场景&#xff1a;1. HashSet<T>&#xff1a;闪电级存在性检查 核心特点&#xff1a;基于哈希表实现的高效集合&#xff0c;元素唯一且无视顺序 优势&#xff1a; O(1…

智慧园区:科技与生活的完美融合

在城市的喧嚣中&#xff0c;我们常常渴望一片宁静而充满活力的绿洲。如今&#xff0c;随着科技的飞速发展&#xff0c;智慧园区应运而生&#xff0c;它不仅满足了我们对美好生活的向往&#xff0c;更以其独特的魅力&#xff0c;成为现代城市中一道亮丽的风景线。今天&#xff0…

继续打卡day6

383. 赎金信 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char, int> us;for(auto c: ransomNote){us[c]; // 将字符串存储}for(auto c: magazine){if(us.count(c)){us[c]-…

LIMA:大语言模型对齐的“少即是多”革命——原理、实验与范式重构

“千样本激活千亿参数&#xff1a;重新定义大模型对齐的本质” LIMA&#xff08;Less Is More for Alignment&#xff09; 是由 Meta AI 联合 卡内基梅隆大学 等机构于 2023年 提出的突破性大模型对齐框架&#xff0c;其核心颠覆了传统对齐需海量数据的认知&#xff0c;证明仅用…