def forward(self, input):
        """
        Forward pass through the Bidirectional LSTM network.

        Args:
            input (torch.Tensor): Input tensor of shape (T, b, nIn), where T is the sequence length, 
                                  b is the batch size, and nIn is the input feature size.

        Returns:
            torch.Tensor: Output tensor of shape (T, b, nOut), where nOut is the output feature size.
        """
        recurrent, _ = self.rnn(input)  # Process the input through the GRU layer
        # Get the shape of the recurrent output
        T, b, h = recurrent.size()
        t_rec = recurrent.view(T * b, h)  # Flatten the output for the embedding layer
        output = self.embedding(t_rec)  # Apply the linear embedding layer
        output = output.view(T, b, -1)  # Reshape back to (T, b, nOut)

        return output

        Forward pass through the Bidirectional LSTM network.

        Args:
            input (torch.Tensor): Input tensor of shape (T, b, nIn), where T is the sequence length, 
                                  b is the batch size, and nIn is the input feature size.

        Returns:
            torch.Tensor: Output tensor of shape (T, b, nOut), where nOut is the output feature size.
        
clearvoice/clearvoice/models/frcrn_se/complex_nn.py