LCAV / pyroomacoustics

Pyroomacoustics is a package for audio signal processing for indoor applications. It was developed as a fast prototyping platform for beamforming algorithms in indoor scenarios.
https://pyroomacoustics.readthedocs.io
MIT License
1.33k stars 417 forks source link

Bug in auxiva? Script did not show any error, but got nan in the result of source matrix #337

Open datalw opened 3 months ago

datalw commented 3 months ago

Hello,

I tried the function pyroomacoustics.bss.auxiva.auxiva and got some results. But for one test signal, I got only nan in the result without getting any error while running the script. I don't know where the error could be, whether it is a bug or it's because of the signal.

Sometimes I got RuntimeWarning: invalid value encountered in sqrt W[:, s, :] /= np.sqrt(denom[:, :, 0]). But sometimes there is no warning, and the result was still nan.

Could you help me with this? Thanks a lot!

The test signal in time-frequency presentation (ntime n frequency band nchannel) in .npy format is here: https://drive.google.com/file/d/1POObDnmY5ej5fdpeumS_PA0Ja8ZIb9W0/view?usp=sharing

Btw. I didn't use STFT, because I needed VMD to decomposite the signal. So in a sense, it is a time-frequency presentation.

test_singal=np.load("test_signal.npy")

scvs,demix=pra.bss.auxiva(test_signal,n_src=test_signal.shape[-1],n_iter=20,proj_back=True,model='laplace',init_eig=False,return_filters=True )
datalw commented 3 months ago

Oh, I've just realized the problem is, that there is only one source in this test signal and it is overdetermined.

datalw commented 2 weeks ago

Hi, I have to reopen this issue, because the reason was apparently not what I have found earlier. With other data, I experience this warning as well.

The correct reason is that in the function auxiva() in the script auxiva.py, WV has got nan first, after the line WV = np.matmul(W_hat, V) . If I have understood it right - please correct me if not - W_hat is initialized at the beginning and the value should not change, after the iterations have begun. But it changes anyway sometimes along the iterations. I looked into the code, there are variable assignments like

W = W_hat[:, :n_src, :]
J = W_hat[:, n_src:, :n_src] 

In this case, if W or J change after the assignments, W_hat will be partially changed along. I not sure, if this is the way the codes are supposed to run. A simple example of unexpected change of a variable see here.

Codes to re-produce the warning:

import pyroomacoustics as pra
import numpy as np

iva_input = np.load("0th_iva_input.npy")
epoch_scvs, demix = pra.bss.auxiva(iva_input, n_src=iva_input.shape[-1], n_iter=20, proj_back=False, model='laplace',
                                   init_eig=False, return_filters=True)

The sample input can be found here.

Because the warning does not happen in every run, one might have to run it several times.