2

我有 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,我的播放信号还记录了我知道的,但很可能被扬声器->麦克风往返修改了

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

重要:最后我不需要一个清晰的 f 信号,只需要关于它的响度或存在水平的信息。基本上是除了记录的往返信号 g 之外的噪声水平。

我应该如何继续收集我想要的噪音水平信息?

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

4

3 回答 3

3

vDSP_zvsub 的长度参数是要处理的复杂元素的数量,而不是元素数量的对数。您应该通过 nOver2 而不是 log2n。

这仅涉及编程方面。其他答案解决了信号处理问题。特别是,FFT 是线性的:给定信号 X 和 Y 以及常数 a 和 b,FFT(a•X+b•Y) = a•FFT(X)+b•FFT(Y)。逆 FFT 也是线性的。因此,除了通常的浮点舍入误差外,两个信号的 FFT 差值的逆 FFT 不应给您与直接减去两个信号不同的结果。

于 2012-11-27T17:11:38.067 回答
2

vDSP_zvsub你只是在每个箱子上做一个复杂的减法,这可能不是你想要的。

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

  • 将每个复频域频谱从复数转换为极性(幅度+相位)
  • 减去每个 bin的幅度
  • 将得到的极坐标数据转换回复数
于 2012-11-27T06:37:19.717 回答
0

您将需要发送到扬声器的音频和从麦克风接收的音频之间的系统脉冲响应(DAC/ADC 缓冲延迟、抗混叠滤波器组延迟、扬声器和麦克风响应、空气中的声速等)为了在时域或频域中产生(大部分)抵消信号。请注意,这包括匹配幅度和延迟,并且一组扬声器或麦克风与其他扬声器或麦克风相比很可能“异相”。

于 2012-11-27T17:07:22.943 回答