我有2个信号,其中一个包含在扬声器上播放的音频数据。第二个包含同时记录扬声器的麦克风数据。

到目前为止,我所做的是:通过相关在时域中对齐信号。对两个信号的重叠部分应用fft并彼此除以实现反卷积。
我做错了什么,因为生成的音频数据没有用。

这是我的代码:

       //put both signals in split complex vectors
       vDSP_ctoz((DSPComplex *)file, 2, &fftFileData, 1, nOver2);
       vDSP_ctoz((DSPComplex *)mic, 2, &fftMicData, 1, nOver2);


        //fft of both file and mic data
        vDSP_fft_zrip(fftSetup, &fftFileData, 1, log2n, FFT_FORWARD);
        vDSP_fft_zrip(fftSetup, &fftMicData, 1, log2n, FFT_FORWARD);


        //divide file data by mic data for deconvolution???
        vDSP_zvdiv(&fftFileData, 1, &fftMicData, 1, &fftMicData, 1, nOver2);


        //inverse fft of mic-fft-data
        vDSP_fft_zrip(fftSetup, &fftMicData, 1, log2n, FFT_INVERSE);

        //scale back signal
        vDSP_vsmul(fftMicData.realp, 1, &scale, fftMicData.realp, 1, nOver2);
        vDSP_vsmul(fftMicData.imagp, 1, &scale, fftMicData.imagp, 1, nOver2);

        //copy back to float array
        vDSP_ztoc(&fftMicData, 1, (COMPLEX *) result, 2, nOver2);

编辑进行一些澄清:
感谢@ Sammio2我现在知道,反卷积很好地描述了我的问题:

f * g = h

h是我录制的信号,包括

f,我要恢复的信号是

g,我还知道另外录制了我的播放信号,但很可能是由扬声器->麦克风往返行程修改的

现在我需要任何方法来恢复f,这是除g之外所有已录制的声音。

重要:最后,我不需要清晰的f信号,只需提供有关其响度或存在水平的信息即可。基本上除了记录的往返信号g以外的噪声水平。

我应如何继续收集所需的噪音水平信息?

我希望这有助于理解我的问题。
到目前为止,谢谢!

最佳答案

使用vDSP_zvsub,您只是在每个bin上进行了复杂的减法运算,这可能不是您想要的。

目前尚不清楚您要实现的目标,但是听起来您想从一个频谱中减去一个频谱的幅度,在这种情况下,您需要执行以下操作:

  • 将每个复杂频域频谱从复数转换为极性(幅度+相位)
  • 减去每个bin处的幅度
  • 将所得极地数据转换回复杂的
  • 09-26 12:48