嗨,我在matlab中进行以下操作
values = [0;1;0;0;1;0;1;0]; % can contain only 0s and 1s h = modem.oqpskmod; y = modulate(h, values); g = modem.oqpskdemod(h); z = demodulate(g,y); BER = sum(logical(values(:)-z(:)))/numel(values); % thanks to gnovice! 在计算BER之前,您是否认为我必须仅将数组z转换为1s和0s的数组...例如,我的z可能由3s和0s组成,那么我是否必须将所有大于0的数字转换为1和所有0不变。这样一来,我最终获得了BER的正确比较?
回答:
这取决于您要如何比较输入和输出。
我为您提供的用于计算BER
的代码会将输入和输出之间的
任何差异都视为错误。因此,输出的3值和输入的1值被视为
不同 。
如果您想以其他方式计算BER,则可以使用以下两个选项。这些每个假设values仅包含零和一:
- 将任何非零输出值都计为1:在这种情况下,可以使用LOGICAL函数将z 任何非零值(即值3、0.5,-1等)转换为1,而将完全为零的值保持不变:
BER = sum(values(:)-logical(z(:)))/numel(values);
- 将正值计数为1,将负值计数为0:此解决方案仅使用比较运算符代替LOGICAL :
BER = sum(values(:)-(z(:) > 0))/numel(values);
您可能还想尝试将
modem.oqpskdemod对象的'OutputType'属性设置为'bit'以确保二进制输出。然后,您不必对z做任何事情:
... g = modem.oqpskdemod(h,'OutputType','bit'); z = demodulate(g,y); BER = sum(values(:)-z(:))/numel(values);
更多&回答...