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

标签 ios fft accelerate-framework vdsp

我有 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 的长度参数是要处理的复数元素的数量,而不是元素数量的对数。您应该传递 nOver2 而不是 log2n。

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

关于ios - 从录制的声音中消除已知音频,通过反卷积估计背景声级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577013/

相关文章:

javascript - angular js - 基于设备方向的代码流

ios - UIActivityViewController - 如何更改取消按钮文本

ios - 在 Typhoon 中使用非属性方法初始化对象

objective-c - 使用 LAPACK 求解 Ax=B,其中 x >= 0

arrays - Swift 线性插值和上采样

ios - 哪个是 Xcode for iOS 项目中多环境设置的最佳实践?

c++ - ifft 结果与原始信号不同

java - 使用JAVA通过仅具有频率阵列和截止频率来实现频率低通滤波器

python - 在 python 中计算一致性

macos - 在 Accelerate 中调用稀疏矩阵乘积