def block_single_error_Pb_bound(j,SNRdB,coded=True,M=<NUM_LIT:2>):
Pb = np.zeros_like(SNRdB)<EOL>Ps = np.zeros_like(SNRdB)<EOL>SNR = <NUM_LIT>**(SNRdB/<NUM_LIT>)<EOL>n = <NUM_LIT:2>**j-<NUM_LIT:1><EOL>k = n-j<EOL>for i,SNRn in enumerate(SNR):<EOL><INDENT>if coded: <EOL><INDENT>if M == <NUM_LIT:2>:<EOL><INDENT>Ps[i] = Q_fctn(np.sqrt(k*<NUM_LIT>*SNRn/n))<EOL><DEDENT>else:<EOL><INDENT>Ps[i] = <NUM_LIT>/np.log2(M)*(<NUM_LIT:1> - <NUM_LIT:1>/np.sqrt(M))*np.gaussQ(np.sqrt(<NUM_LIT:3>*np.log2(M)/(M-<NUM_LIT:1>)*SNRn))/k<EOL><DEDENT><DEDENT>else: <EOL><INDENT>if M == <NUM_LIT:2>:<EOL><INDENT>Pb[i] = Q_fctn(np.sqrt(<NUM_LIT>*SNRn))<EOL><DEDENT>else:<EOL><INDENT>Pb[i] = <NUM_LIT>/np.log2(M)*(<NUM_LIT:1> - <NUM_LIT:1>/np.sqrt(M))*np.gaussQ(np.sqrt(<NUM_LIT:3>*np.log2(M)/(M-<NUM_LIT:1>)*SNRn))<EOL><DEDENT><DEDENT><DEDENT>if coded:<EOL><INDENT>Pb = ser2ber(M,n,<NUM_LIT:3>,<NUM_LIT:1>,Ps)<EOL><DEDENT>return Pb<EOL>
Finds the bit error probability bounds according to Ziemer and Tranter 
page 656.

parameters:
-----------
j: number of parity bits used in single error correction block code
SNRdB: Eb/N0 values in dB
coded: Select single error correction code (True) or uncoded (False)
M: modulation order

returns:
--------
Pb: bit error probability bound