code: def perform_filter_operation(
      Y: Union[torch.Tensor, ComplexTensor],
      filter_matrix_conj: Union[torch.Tensor, ComplexTensor],
      taps,
      delay,
  ) -> Union[torch.Tensor, ComplexTensor]:
      """perform_filter_operation
  
      Args:
          Y : Complex-valued STFT signal of shape (F, C, T)
          filter Matrix (F, taps, C, C)
      """
      if isinstance(Y, ComplexTensor):
          complex_module = FC
          pad_func = FC.pad
      elif is_torch_1_9_plus and torch.is_complex(Y):
          complex_module = torch
          pad_func = F.pad
      else:
          raise ValueError(
              "Please update your PyTorch version to 1.9+ for complex support."
          )
  
      T = Y.size(-1)
      # Y_tilde: (taps, F, C, T)
      Y_tilde = complex_module.stack(
          [
              pad_func(
                  Y[:, :, : T - delay - i],
                  (delay + i, 0),
                  mode="constant",
                  value=0,
              )
              for i in range(taps)
          ],
          dim=0,
      )
      reverb_tail = complex_module.einsum(
          "fpde,pfdt->fet", (filter_matrix_conj, Y_tilde)
      )
      return Y - reverb_tail
  
file_path: espnet/espnet2/enh/layers/wpe.py
imports: from typing import Tuple, Union
  import torch
  import torch.nn.functional
  import torch_complex.functional
  from packaging.version import parse
  from torch_complex.tensor import ComplexTensor
  from espnet2.enh.layers.complex_utils import einsum, matmul, reverse
label_desc: Use image node_id 5 for calling a global function with example usage: perform_filter_operation(Y, filter_matrix_conj, taps, delay) and returns: unknown