Octave 如何在倍频程中模拟概率

Octave 如何在倍频程中模拟概率,octave,probability,Octave,Probability,我的任务是用二进制消息模拟一个信号,该信号通过一个误码率为千分之一的噪声信道。这就是我所做的 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

我的任务是用二进制消息模拟一个信号,该信号通过一个误码率为千分之一的噪声信道。这就是我所做的

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]中的所有整数是否具有相同的概率?

我想说,这种解释的主要问题不一定是使用randivs
rand
,或者它的可靠性有多高,而是您始终保证信号中不会出现多个错误,这不是一个好的假设

这不是1:1000的错误率通常意味着什么。这意味着每一位都有1:1000的翻转机会。也就是说,每一位都要进行贝努利试验,贝努利参数为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
函数[OutputSignal,HasFlipped]=应用噪声(InputSignal,mu=0.001)
%InputSignal:0或1值的水平向量
%mu:表示错误事件概率的伯努利参数
N=长度(输入信号);

ErrorPositions=rand(1,N)我想说,这种解释的主要问题不一定是使用
randi
vs
rand
,或者这有多可靠,而是你总是保证信号中不会有多个错误,这不是一个好的假设

这不是1:1000的错误率通常意味着什么。这意味着每一位都有1:1000的翻转机会。也就是说,每一位都要进行贝努利试验,贝努利参数为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
函数[OutputSignal,HasFlipped]=应用噪声(InputSignal,mu=0.001)
%InputSignal:0或1值的水平向量
%mu:表示错误事件概率的伯努利参数
N=长度(输入信号);
ErrorPositions=rand(1,N)