我正在考虑/找到一个允许interleaving算法的算法,该算法大小不是2的幂。我正在使用的当前方法采用数组大小,找到平方根(n)并创建一个n x n矩阵。然后交换行和列,然后将矩阵扩展回数组。
我试图找到某种索引系统,该系统对任何输入数组大小都是灵活的,但也允许适当的数据分布并允许重建原始数组。我提供了一些示例代码,明确显示了nxn交织器是如何工作的。
import numpy as np
import math
N = 75
input_stream = np.random.random_integers(0,100,size=N)
#############
# Interleaver
#############
mat_dim = int(math.sqrt(len(input_stream)))
interleave_mat = np.zeros((mat_dim,mat_dim), dtype=np.int)
interleave_out = np.zeros(mat_dim**2, dtype=np.int)
for i in range(0,mat_dim):
for j in range(0,mat_dim):
interleave_mat[i][j] = input_stream[i*mat_dim + j]
for i in range(0,mat_dim):
for j in range(0,mat_dim):
interleave_out[i*mat_dim + j] = interleave_mat[j][i]
################
# De-Interleaver
################
deinterleave_mat = np.zeros((mat_dim,mat_dim), dtype=np.int)
deinterleave_out = np.zeros(mat_dim**2, dtype=np.int)
for i in range(0,mat_dim):
for j in range(0,mat_dim):
deinterleave_mat[i][j] = interleave_out[i*mat_dim + j]
for i in range(0,mat_dim):
for j in range(0,mat_dim):
deinterleave_out[i*mat_dim + j] = deinterleave_mat[j][i]
output_stream = deinterleave_out
error_count = sum(1 for a,b in zip(input_stream, output_stream) if a != b)
if len(input_stream) > len(output_stream):
error_count += len(input_stream) - len(output_stream)
print("Number of errors: {}").format(error_count)
print("input stream: {}").format(input_stream)
print("output stream: {}").format(output_stream)