2

ビット誤り率を計算するために numpy で matlab コードを変換しようとしています コードの一部が問題を引き起こしています これは変換したい matlab コードです

SNR=6:22;
display(SNR)
display(length(SNR))
BER=zeros(1,length(SNR));

display(BER)
display(length(BER))
Es=10;


for ii=1:length(SNR)
   variance=Es*10^(-SNR(ii)/10);
   std_dev=sqrt(variance/2);
   noise=(randn(1,length(S))+sqrt(-1)*randn(1,length(S)))*std_dev;
   S_noisy=S+noise;


end
display(variance)

Python コード SNR=arange(6,23,1)

BER=zeros(len(SNR))  
print(BER)
Es=10


for ii in arange(0,len(SNR)):

   variance=Es*10**(-SNR[ii]/10)
   std_dev=cmath.sqrt(variance/2)
   noise=(np.random.randn(len(S))+cmath.sqrt(-1)*np.random.randn(len(S))) *std_dev
   S_noisy=S+noise

  print(variance)

分散の答えは python では 0.063 bt である必要があり、0.01 plzz ヘルプが表示されます

4

1 に答える 1

3

SNR はデフォルトで dtypeint32です。Python2 では、を で割るとintint得られますint(または が発生します)。ZeroDivisionErrorそう

SNR[ii]/10

あなたに間違った結果を与える:

In [15]: SNR
Out[15]: array([ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22])

In [16]: SNR/10
Out[16]: array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2])

修正するには、次のいずれかを置きます

from __future__ import division

Pythonコードの最初(インポートステートメントの前)、または使用

variance = Es*10**(-SNR[ii]/10.0)

この変更により、最終結果は0.063095734448.

注: Python3 では、intdivided byintはデフォルトで float を返します。


NumPy を使用する際のパフォーマンスを向上させるには、可能であれば Python ループを NumPy 配列全体の操作に置き換えることをお勧めします。コードは次のように記述されます。

import numpy as np
SNR = np.arange(6, 23)
BER = np.zeros(len(SNR))
print(BER)
Es = 10

variance = Es * 10 ** (-SNR / 10.0)
std_dev = np.sqrt(variance / 2)
noise = (np.random.randn(len(SNR)) + 1j * np.random.randn(len(SNR))) * std_dev
S_noisy = SNR + noise
print(variance[-1])
于 2013-07-21T11:57:54.110 に答える