消除录制声音中的已知音频,通过反卷积估计背景声音级别

时间:2012-11-27 03:37:10

标签: ios fft accelerate-framework vdsp

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

到目前为止我做了什么:通过相关性在时域中对齐信号。将fft应用于两个信号的重叠部分并相互分开以实现反卷积 由于产生的audiodata无用,我做错了什么。

这是我的代码:

       //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 *克= H

h是我录制的信号,由

组成

f,我希望恢复信号

g,我的播放信号另外录制,我知道,但被扬声器修改 - > mic往返很可能

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

重要:最后我不需要f的明确信号,只需要有关其响度或存在水平的信息。基本上除了记录的往返信号g之外的噪声水平。

我该如何处理我想要的噪音水平信息?

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

目前尚不清楚你想要实现的目标,但听起来你想从另一个频谱中减去一个频谱的幅度,在这种情况下你需要做以下事情:

  • 将每个复频域频谱从复数转换为极性(幅度+相位)
  • 减去每个垃圾箱的幅度
  • 将生成的极地数据转换回复杂的

答案 2 :(得分:0)

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