code: def convmtx_mc_numpy(
      x: np.ndarray,
      filter_length: int,
      delay: int = 0,
      n_steps: Optional[int] = None,
  ) -> np.ndarray:
      """Construct a causal multi-channel convolutional matrix from `x` delayed by `delay` samples.
  
      Args:
          x: input signal, shape (N, M)
          filter_length: length of the filter in samples
          delay: delay the signal by a number of samples
          n_steps: total number of time steps (rows) for the output matrix
  
      Returns:
          Multi-channel convolutional matrix, shape (n_steps, M * filter_length)
      """
      if x.ndim != 2:
          raise ValueError(
              f"Expecting two-dimensional signal. Received signal with shape {x.shape}"
          )
  
      mc_mtx = []
  
      for m in range(x.shape[1]):
          mc_mtx.append(
              convmtx_numpy(
                  x[:, m],
                  filter_length=filter_length,
                  delay=delay,
                  n_steps=n_steps,
              )
          )
  
      return np.hstack(mc_mtx)
  
imports: import math
  from typing import Iterable, Optional, Union
  import librosa
  import numpy
  import numpy.typing
  import scipy
  import soundfile
  import torch
  from scipy.spatial.distance import pdist, squareform
  from nemo.utils import logging
label_desc: Use image node_id 16 for calling a global function with example usage: convmtx_mc_numpy(x, filter_length, delay, n_steps) and returns: np