**You just have to check the rank of the matrix.** When you look a discrete signals, it is customary to express their product the following way. If vectors are considered "column-wise", then you typically use the transpose operation: $$ x[n_1,n_2] = f[n_1]^T g[n_2]$$ This implies that the 2D signal is of rank one or less (rank being the maximal number of linearly independent rows or columns). Conversely, any (infinite) matrix of rank $0$ or $1$ is separable. [Note: the separation is not unique in general][1]. [1]: https://dsp.stackexchange.com/a/35296/15892