Source code for sweep_design.prepared_sweeps.code_m_sequence

from typing import Union
import math
import random

import numpy as np
from scipy.signal import max_len_seq  # type: ignore

from ..relation import Relation
from ..axis import ArrayAxis, get_array_axis_from_array


[docs]def get_m_sequence_code(length_code: int, is_full=False) -> np.ndarray: '''Create m-sequence array Args: length_code (int): length of m-sequence array. is_full (bool, optional): parameter to return full sequence if True. sequence can be longer then requested length code. If False return sequence which size equal length_code. Defaults to False. Returns: np.ndarray: array of m-sequence. ''' len_sequence = math.ceil(math.log((length_code - 1), 2)) start_sequence = np.array([random.randint(0, 1) for _ in range(len_sequence)]) if np.all(start_sequence == 0): start_sequence[0] = 1 m_sequence = max_len_seq(nbits=len_sequence, state=start_sequence)[0] if is_full: return m_sequence return m_sequence[:length_code - 1]
[docs]def get_relation_m_sequence(time: Union[ArrayAxis, np.ndarray], start_sequence: np.ndarray = None, is_full=False) -> Relation: '''Create m-sequence relation. Args: time (Union[ArrayAxis, np.ndarray]): time of sequence. start_sequence (np.ndarray, optional): start array sequence of -1 and 1 to create m-sequence. Defaults to None. is_full (bool, optional): if True return full m-sequence with new time with equal size to m-sequence array. Defaults to False. Returns: Relation: relation of m-sequence. ''' if not isinstance(time, ArrayAxis): time = get_array_axis_from_array(time) len_seq = math.ceil(math.log((time.size - 1), 2)) if start_sequence is None: start_sequence = np.array([random.randint(0, 1) for _ in range(len_seq)]) if np.all(start_sequence == 0): start_sequence[0] = 1 m_sequence = max_len_seq( nbits=start_sequence.size, state=start_sequence)[0] if is_full: new_time = ArrayAxis( 0, time.sample * (m_sequence.size - 1), time.sample) return Relation(new_time, m_sequence) return Relation(time, m_sequence[:time.size])