如何解决如何在 Octave 中模拟概率
我的任务是用二进制消息模拟一个信号,它通过一个噪声通道,误码率为 1000 分之一。这是我所做的。
function [r f] = generateBitError(d,ber)
flag = false;
if(randi(round(ber^(-1))) == 1)
i = randi(length(d));
d(i) = not(d(i));
flag = true;
endif
r = d;
f = flag;
endfunction
d 是一个矩阵,其单元格包含二进制数字,ber 通常取值 10^(-3)。它在实践中似乎工作正常,但这是模拟千分之一错误机会的有效方法吗?对于区间 [1,1000] 中的所有整数,randi 是否具有相同的概率?
解决方法
我想说这个解释的主要问题不一定是使用randi
vs rand
,或者这有多可靠,而是你总是保证会有信号中的错误永远不会超过一个,这不是一个好的假设。
这不是 1:1000 的错误率通常意味着什么。这意味着 每个 位都有 1:1000 的机会被翻转。 IE。每个位都经过伯努利试验,伯努利参数为 0.001。在整个信号中翻转 2 位或更多位应该完全可能;它不应该是非常可能。
所以我会改写成这样:
function [ OutputSignal,HasFlipped ] = apply_noise( InputSignal,mu = 0.001 )
% InputSignal: A horizontal vector of 0 or 1 values
% mu: Bernoulli parameter denoting probability of error event
N = length( InputSignal );
ErrorPositions = rand( 1,N ) <= mu;
OutputSignal = InputSignal;
OutputSignal( ErrorPositions ) = ~OutputSignal( ErrorPositions );
HasFlipped = any( ErrorPositions );
end
另外,避免使用无意义的变量名,如 r、f、d、ber 等。它们使这样的代码很难阅读,而实际上代码的逻辑很简单。一个月后,当您需要调试此代码时,您未来的自己将感激涕零。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。