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

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.dtcms.com/a/303243.html

相关文章:

  • WCF服务通信框架
  • 用友NC漏洞批量检测工具,支持POC显示、单一检测、批量检测、结果导出、AI交互等
  • Parasoft Virtualize用服务虚拟化加速银行系统的软件测试
  • Red Hat OpenShift AI 产品简介
  • XCF32PVOG48C Xilinx Platform Flash PROM
  • 神经网络CNN、RNN、Transform
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Docker 部署 Supabase并连接
  • 【Linux】重生之从零开始学习运维之Mysql
  • 深度学习篇---层与层之间搭配
  • 基于Qlearning强化学习的水下无人航行器路径规划与避障系统matlab性能仿真
  • 免费离线翻译软件LibreTranslate免安装一键启动整合包下载
  • JavaScript 回调函数讲解_callback
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • 波形发生器AWG硬件设计方案
  • AW2013 LED驱动芯片 工作方式介绍
  • Java线程池详解:核心参数与工作原理
  • PBR(策略路由)
  • 力扣-39.组合总和
  • 一段英文自我介绍
  • Source Insight的快速使用
  • gpfs磁盘相关命令及使用
  • nvim编辑器
  • CLion运行多个main函数
  • MySQL存储过程(二):存储过程实例(增删改查)及调用
  • Web3技术解析:从网络架构到业务创新的范式的变革
  • mysql全量备份、全量恢复demo
  • 二叉树基本概念
  • 安装anaconda后,如何进入python解释器
  • 禾纳AET3156AP数据手册,增强型p沟道MOSFET芯片,替代AO4805方案