Skip to main content

Convolutional Encoder and Viterbi Decoder built with Rust bindings for integration with Python

Project description

rs_fec_conv

PyPi Docs

Getting Started

The package rs_fec_conv is a rust binding built with pyo3. rs_fec_conv is intended to be used in parallel with the scikit-dsp-comm package. The rust binding improve the processing time of the conv_encoder and viterbi_decoder algorithms.

Rust Install

Rust is not needed on the system to execute the binaries since the functions are already pre-compiled. Although, Rust can be downloaded online or installed on Windows Subsystem for Linux.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Package Requirements

This package requires Python 3.7.x.

rs_fec_conv Install

You can download the package rs_fec_conv from PyPi PyPi, or by the command

pip install rs_fec_conv

Note: The preferred method is to download from PyPi. If downloading directly from GitHub you will need to install Rust prior.

Results

BEP Simulation (EbN0=4,100000 bits) G, depth Python Time (sec) Rust Time (sec) Rust Speed Factor Increase
('111', '101'), 10 39.88 0.79 50.24
('11111','11011','10101'), 25 675.00 21.32 31.66
('1111001','1011011'), 25 217.02 9.27 23.41

Tutorial

Convolutional Encoder

The function conv_encoder_rs can be implemented

import numpy as np
import matplotlib.pyplot as plt
import sk_dsp_comm.rs_fec_conv as rs_fec

# Generate random data
N = 20
x = randint(0,2,N)

# Initialize fec_conv object with either G length 2 or 3
G =('111','101')
# G = ('11110111','11011001','10010101')
cc1 = rs_fec.fec_conv(G,10)
state = '00'

# Convolutionally Encode Signal
y,state = cc1.conv_encoder(x,state)

# Plot input signal
subplot(211)
stem(x)
xlabel('Number of Samples')
ylabel('x')
title('Input Signal')

# Plot convolutionally encoded signal
subplot(212)
stem(y)
xlabel('Number of Samples')
ylabel('y')
title('Convolutionally Encoded Signal')
tight_layout()
savefig('conv_enc.png')

Convolutionally Encoded Signal

Viterbi Decoder

The function viterbi_decoder_rs can be implemented by

# Viterbi decode
z = cc1.viterbi_decoder(y.astype(int), 'hard', 3)

# Plot input signal
subplot(211)
stem(x[:11])
xlabel('Number of Samples')
ylabel('x')
title('Input Signal')
xlim([0,10])

# Plot viterbi decoded signal
subplot(212)
stem(z)
xlabel('Number of Samples')
ylabel('z')
title('Viterbi decoded Signal')
xlim([0,10])
tight_layout()
savefig('viterbi_dec.png')

Viterbi Decoded Signal

Since there is no channel noise added to the signal the Viterbi decoded signal results in no bit errors from the original signal.

Channel Simulation

A simulation using AWGN can be done using by integrating with other functions provided in the scikit-dsp-comm toolbox

# Soft decision rate 1/2 simulation
N_bits_per_frame = 100000
EbN0 = 4
total_bit_errors = 0
total_bit_count = 0
cc1 = rs_fec.fec_conv(('11101','10011'),25)

# Encode with shift register starting state of '0000'
state = '0000'
while total_bit_errors < 100:
	# Create 100000 random 0/1 bits
	x = randint(0,2,N_bits_per_frame)
	y,state = cc1.conv_encoder(x,state)

	# Add channel noise to bits, include antipodal level shift to [-1,1]
	# Channel SNR is 3 dB less for rate 1/2
	yn_soft = dc.cpx_AWGN(2*y-1,EbN0-3,1) 
	yn_hard = ((np.sign(yn_soft.real)+1)/2).astype(int)
	z = cc1.viterbi_decoder(yn_hard,'hard')

	# Count bit errors
	bit_count, bit_errors = dc.bit_errors(x,z)
	total_bit_errors += bit_errors
	total_bit_count += bit_count
	print('Bits Received = %d, Bit errors = %d, BEP = %1.2e' %\
		  (total_bit_count, total_bit_errors,\
		   total_bit_errors/total_bit_count))

print('*****************************************************')
print('Bits Received = %d, Bit errors = %d, BEP = %1.2e' %\
	  (total_bit_count, total_bit_errors,\
	   total_bit_errors/total_bit_count))

Rate 1/2 Object

kmax = 0, taumax = 0

Bits Received = 99976, Bit errors = 845, BEP = 8.45e-03


Bits Received = 99976, Bit errors = 845, BEP = 8.45e-03

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

rs_fec_conv-0.4.5-cp37-none-win_amd64.whl (178.3 kB view details)

Uploaded CPython 3.7Windows x86-64

rs_fec_conv-0.4.5-cp37-cp37m-manylinux1_x86_64.whl (163.4 kB view details)

Uploaded CPython 3.7m

rs_fec_conv-0.4.5-cp37-cp37m-macosx_10_7_x86_64.whl (399.8 kB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

File details

Details for the file rs_fec_conv-0.4.5-cp37-none-win_amd64.whl.

File metadata

File hashes

Hashes for rs_fec_conv-0.4.5-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 b17da03664597a84b8aea48b4f15baff36316f14358447269d6b5a93f71d2967
MD5 0860d942a1638e964d4cc05834115470
BLAKE2b-256 26b912a5dc63cada9b23fa3f713e5735701db6efdc94bf8145bfb55b27cb3149

See more details on using hashes here.

File details

Details for the file rs_fec_conv-0.4.5-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for rs_fec_conv-0.4.5-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 992b6dd6ccbafeafd1b5462a42d69df50d1e9d6c31977e7518f835fab128117a
MD5 38e082f9efb8fdb0fe4713e84676a970
BLAKE2b-256 abc7a8d181792618ae3073f61c1a5f178722ac22549fda0c4e3c850d4e5f4de8

See more details on using hashes here.

File details

Details for the file rs_fec_conv-0.4.5-cp37-cp37m-macosx_10_7_x86_64.whl.

File metadata

  • Download URL: rs_fec_conv-0.4.5-cp37-cp37m-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 399.8 kB
  • Tags: CPython 3.7m, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.4

File hashes

Hashes for rs_fec_conv-0.4.5-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 ee1e379ee30f4a3e35ea7af031f203daae43d3c47399e9cdb25e8e266fa9c697
MD5 4ee7f1768913209291d5c768a25cafb2
BLAKE2b-256 a5cdc2d4c03e56211cb654577b93eda176fbeb671c1ecce3f42950e371c7d03c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page