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:N
            dpsk_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:N
            phase_diff = angle(received_dpsk(k) .* conj(received_dpsk(k-1)));
            decoded_dpsk(k) = mod(round(phase_diff * M/(2*pi)), M);
        end
        decoded_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:M
                phase_seq = zeros(1, L);
                for n = 1:L
                    phase_seq(n) = angle(received_msd(k-n+1) .* conj(received_msd(k-n)));
                end
                metrics(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
    
    % 计算BER
    ber_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系统展示了数字通信中模拟信号数字化的完整过程,量化比特数越高,重建信号质量越好。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值