如何在Octave中模拟概率
How to simulate probability in Octave
我的任务是模拟一个带有二进制消息的信号通过噪声信道,误码率为千分之一。这就是我所做的。
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)。它在实践中似乎工作正常,但这是模拟千分之一错误机会的有效方法吗? randi 对 [1, 1000] 区间内所有整数的概率是否相同?
我想说这种解释的主要问题不一定是使用 randi
与 rand
,或者这有多可靠,但事实上你总是保证 randi
与 rand
=21=]永远不会信号中有一个以上的错误,这不是一个好的假设。
这不是 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 和 stuff。它们使这样的代码很难阅读,而实际上代码的逻辑很简单。一个月后,当您需要调试此代码时,您未来的自己将会感激不尽。
我的任务是模拟一个带有二进制消息的信号通过噪声信道,误码率为千分之一。这就是我所做的。
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)。它在实践中似乎工作正常,但这是模拟千分之一错误机会的有效方法吗? randi 对 [1, 1000] 区间内所有整数的概率是否相同?
我想说这种解释的主要问题不一定是使用 randi
与 rand
,或者这有多可靠,但事实上你总是保证 randi
与 rand
=21=]永远不会信号中有一个以上的错误,这不是一个好的假设。
这不是 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 和 stuff。它们使这样的代码很难阅读,而实际上代码的逻辑很简单。一个月后,当您需要调试此代码时,您未来的自己将会感激不尽。