def forward(self, x):
        """
        Forward pass through the ComplexUniDeepFsmn model.

        Parameters:
        - x (Tensor): Input tensor of shape (batch_size, channels, height, time, 2) where 
                      the last dimension represents the real and imaginary parts.

        Returns:
        - Tensor: Output tensor after processing.
        """
        # Reshape input to [b, c*h, T, 2]
        b, c, h, T, d = x.size()
        x = torch.reshape(x, (b, c * h, T, d))  # Flatten channel and height
        x = torch.transpose(x, 1, 2)  # Permute to [b, T, c*h, 2]

        # Process the real and imaginary parts
        real_L1 = self.fsmn_re_L1(x[..., 0]) - self.fsmn_im_L1(x[..., 1])
        imaginary_L1 = self.fsmn_re_L1(x[..., 1]) + self.fsmn_im_L1(x[..., 0])
        
        # Process the second layer
        real = self.fsmn_re_L2(real_L1) - self.fsmn_im_L2(imaginary_L1)
        imaginary = self.fsmn_re_L2(imaginary_L1) + self.fsmn_im_L2(real_L1)

        # Combine real and imaginary parts into output tensor
        output = torch.stack((real, imaginary), dim=-1)  # Shape: [b, T, h, 2]
        output = torch.transpose(output, 1, 2)  # Shape: [b, h, T, 2]
        output = torch.reshape(output, (b, c, h, T, d))  # Restore original shape

        return output

        Forward pass through the ComplexUniDeepFsmn model.

        Parameters:
        - x (Tensor): Input tensor of shape (batch_size, channels, height, time, 2) where 
                      the last dimension represents the real and imaginary parts.

        Returns:
        - Tensor: Output tensor after processing.
        
clearvoice/clearvoice/models/frcrn_se/complex_nn.py