通信系统仿真速成第5天:PAM系统在AWGN信道下的互信息
来源:互联网 发布:淘宝开店不交保证金 编辑:程序博客网 时间:2024/05/14 21:15
信息论也好,通信原理也好,有个互信息的概念。
互信息(Mutual Information)是信息论里一种有用的信息度量。
它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,
或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。
百度百科:互信息
数字通信原理 Digital Communication (作者:Proakis)
还有一个东西叫AWGN下的信道容量。当初上课的时候,我确实没有想过,书上这种图是怎么画出来的……
后来写了些代码画了一些图。这里放上求PAM的互信息的代码。
基本想法就是,不断地发,然后统计误符号率,估算系统传递矩阵,根据公式求出I(X;Y)。
百度百科:PAM(脉冲幅度调制)
%% PAM-m的AIR% 内容:希望作一条AIR v.s Eb/N0 的curve% 作者:qcy% 版本:v1.5% 说明:希望多次循环,求I的平均%%clear;close all;clc%%d = 1; % 固定星座点的距离mod_order = 4;x_table = (1:mod_order).' * d;x_table = x_table - mean(x_table);Nsym = 1e5; % 一次循环中,仿多少个符号% rand('seed',1);iMsg = randi(mod_order,Nsym,1);x_data = x_table(iMsg);% scatterplot(x);% grid on;% title('PAM4');N_iter = 2e1; % 多次循环,求I的平均%%Eb_N0_dB_array = (2:.5:12).';I_array = zeros(size(Eb_N0_dB_array));for k_Eb_N0_dB_array = 1:length(Eb_N0_dB_array) Eb_N0_dB = Eb_N0_dB_array(k_Eb_N0_dB_array); px = ones(length(x_table),1) * 1/ length(x_table); % 等概率分布 for k_iter = 1:N_iter x_noise = add_awgn_pam_1(x_data,x_table,Eb_N0_dB,px); msg_decision = pam_decision_1( x_noise,x_table ); system_property = calc_system_property_1( iMsg , msg_decision , mod_order ); I_array(k_Eb_N0_dB_array) = I_array(k_Eb_N0_dB_array) + system_property.IXY; end I_array(k_Eb_N0_dB_array) = I_array(k_Eb_N0_dB_array) / N_iter;end%%figure(1);clf;plot(Eb_N0_dB_array,I_array);grid on;axis([Eb_N0_dB_array(1) Eb_N0_dB_array(end) 1 log2(mod_order)*1.1]);legend(['Uniform PAM-' num2str(mod_order)]);xlabel('E_b/N_0 [dB]');ylabel('I(X;Y) [bit/symbol]');title(['Uniform PAM-' num2str(mod_order)]);
function [ x_noise,noise ] = add_awgn_pam_1( x_data,x_table,Eb_N0_dB,px )%function [ x_noise,noise ] = add_awgn_pam_1( x_data,x_table,Eb_N0_dB,px )% 向1-D信号加入awgn% 输入参数% x_data:基带信息 int型msg% x_table:星座图映射表% Eb_N0_dB:用dB表示的比特信噪比% 返回参数% x_noise:带噪基带信号% noise:噪声mod_order = length(x_table);if nargin < 3 % 如果没有指定分布,就默认先验等概 px = ones(mod_order,1) * 1/ mod_order;endNsym = length(x_data);Es = sum((abs(x_table).^2).*px);Eb = Es / log2(mod_order); % 【问】 每个比特携带的能量% 【注意】好像是这样。。。(你们有兴趣可以再检查一下)% 是除以-_- 不是乘以% e.g. 2个比特携带Es的能量,那么1个比特携带Eb = Es/2的能量;Eb_N0_linear = 10 ^ (Eb_N0_dB/10);N0 = Eb / Eb_N0_linear;% N0_2 = N0/2;sigma2 = N0/2; % sigma^2;sigma = sqrt(sigma2);noise = sigma * randn(Nsym,1);x_noise = x_data + noise;end
function [ msg_decision ] = pam_decision_1( x_input,x_table )%function [ msg_decision ] = pam_decision_1( x_input,x_table )% 1-D信号判决函数。% 输入参数% x_input:带判决% x_table:星座映射表% 返回参数% msg_decision:判决成星座表中的下标idx%% 作者:qcy% 版本:v1.0msg_decision = zeros(size(x_input));for m = 1:length(x_input) x_temp = x_input(m); dist_min = inf; k_min = 0; for n = 1 : length(x_table) dist = abs(x_temp - x_table(n)); if dist < dist_min dist_min = dist; k_min = n; end end msg_decision(m) = k_min;endend
function [ system_property ] = calc_system_property_1( iMsg,msg_decision,mod_order )%function [ system_property ] = calc_system_property_1( iMsg,msg_decision,mod_order )% 计算任意系统特性(信源熵、传输概率矩阵)% [注意]% 此时的信源熵,是根据iMsg中,各信源符号出现的频率代替概率来计算的。% 并不是根据信源的分布律来算的。% 此时算出来的先验概率,其实也只是频率。% 转移矩阵的各个元素,其实也只是频率。% 依据:频率是可以趋近于概率的。%% 输入参数% iMsg:原始的发送符号(1、2、3、4、……)% msg_decision:接收判决后的符号(1、2、3、4、……)% mod_order:调制阶数% 返回参数% system_property:能零误码达到的最大信息速率(bit/symbol)% system_property.TP:转移概率矩阵% system_property.Px:信源先验概率% system_property.IXY:系统平均互信息%% 作者:qcy% 版本:v1.0Nsym = length(iMsg);% 初始化structuresystem_property.TP = zeros(mod_order,mod_order); % 转移概率矩阵system_property.IXY = 0; % 互信息system_property.Hx = 0; % 信源熵for m = 1:mod_order for n = 1:mod_order send_x_idx = (iMsg==m); % 发m,那一位为1,否则为0 decision_y_idx = (msg_decision==n); % 判n,那一位为1,否则为0 temp = (send_x_idx + decision_y_idx); % 加起来 都是 2 ,那一位才代表 发1,判1 f_num = length(find(temp==2)); system_property.TP(m,n) = (f_num / (nnz(iMsg == m)+eps)); % 发m,判n的概率 -_-? endend% system_property.Psystem_property.Px = zeros(mod_order,1);for k = 1:mod_order system_property.Px(k) = nnz(iMsg == k) / Nsym;end% system_property.HxHx = -sum(system_property.Px .* log2(system_property.Px+eps));system_property.Hx = Hx;I_part1 = Hx;I_part2 = 0;mod_order = length(system_property.Px);for m = 1:mod_order % i for n = 1:mod_order % j pxi = system_property.Px(m); pyjxi = system_property.TP(m,n); xxx1 = 0; % log里的分子 for k = 1:mod_order pxk = system_property.Px(k); pyjxk = system_property.TP(m,k); xxx1 = xxx1 + pxk * pyjxk; end xxx2 = pyjxi * pxi + eps;% log里的分母 mylog = log2((xxx1+eps)/xxx2); % log I_part2 = I_part2 + pxi*pyjxi*mylog; endendI_part2 = I_part2 * (-1);I = I_part1 + I_part2;system_property.IXY = I;end
麻烦就麻烦在:
1. 好像要简单用一下Bayes公式(好像我是在Z99火车上写的。
之前的博文也提到了,我是去广州看张学友演唱会。。。
周围的人都把我看着。看得出来搞这东西好像有点另类)
2. 三重求和有点麻烦(好像是3重……)
纵轴应该就是信道容量了吧。
阅读全文
0 0
- 通信系统仿真速成第5天:PAM系统在AWGN信道下的互信息
- 通信系统仿真速成第4天:频分复用FDM
- 通信系统仿真速成第1天:QPSK调制与解调(Matlab仿真)
- 通信系统仿真速成第6天:OFDM基带仿真(简单教学版)
- 通信系统仿真速成第2天:QPSK调制与解调(实验)
- 通信系统仿真速成第3天:16QAM调制与解调(实验)
- 通信系统仿真
- 通信系统仿真
- 利用软件仿真完整的通信系统
- 加性高斯白噪声信道(AWGN)下的digital调制格式识别分类
- BPSK+AWGN信道下画出误符号率和误比特率的性能曲线
- PAM LDAP在Linux Redhat 5和Solaris 10系统上的用户认证
- 通信算法之九:通信系统的链路级仿真思路
- 从零开始的仿真之旅——在Ubuntu下配置V-Rep仿真平台下的搭载ROS系统的机器人仿真
- 基于Matlab的MIMO通信系统仿真(上)
- linux系统pam配置
- OFDM系统的仿真
- 通信系统传输模型仿真实现
- mybatis 之 if test 条件
- 原生HTML5 Canvas 参考API文档
- 快速排序
- STM单片机命名规则
- 软件体系结构
- 通信系统仿真速成第5天:PAM系统在AWGN信道下的互信息
- Maven私有库和本地库的安装与配置 Sonatype Nexus
- Tinker热修复示例
- 程序员考试涉及的排序算法
- Android自定义圆形进度条
- 115. Distinct Subsequences
- WebService到底是什么?
- 【LeetCode】561.Array Partition I解题报告
- 常用的选择器及特殊性