用正弦扫描计算频率响应的问题

时间:2013-01-09 04:54:20

标签: ios audio fft accelerate-framework vdsp

我目前正在尝试计算iphone扬声器/麦克风往返的频率响应。我在扬声器上进行正弦扫描,通过麦克风录制并尝试从中获得频率响应。最终目标是能够将FR乘以任何给定的声音,使其听起来像iphone扬声器/麦克风。

到目前为止

我的代码:

//apply window function
vDSP_vmul(sineSweepMic,1,hammingWindow,1,sineSweepMic,1,n);
vDSP_vmul(sineSweepFile,1,hammingWindow,1,sineSweepFile,1,n);

//put both signals in complex arrays
vDSP_ctoz((DSPComplex *)sineSweepMic, 2, &fftSineSweepMic, 1, nOver2);
vDSP_ctoz((DSPComplex *)sineSweepFile, 2, &fftSineSweepFile, 1, nOver2);

//fft of both file and mic sweeps
vDSP_fft_zrip(fftSetup, &fftSineSweepFile, 1, log2n, FFT_FORWARD);
vDSP_fft_zrip(fftSetup, &fftSineSweepMic, 1, log2n, FFT_FORWARD);

//back to interleaved
vDSP_ztoc(&fftSineSweepFile, 1, (COMPLEX *)sineSweepFile, 2, nOver2);
vDSP_ztoc(&fftSineSweepMic, 1, (COMPLEX *)sineSweepMic, 2, nOver2);

//divide mic-sweep by file-sweep to create frequency response
vDSP_vdiv(sineSweepFile, 1, sineSweepMic, 1, frequencyResponse, 1, n);
到目前为止,这是有效的,当我将FR与初始文件扫描相乘时,它听起来像麦克风扫描。

我的问题: 这仅适用于生成FR的确切文件(扫描)。只要我使用FR修改其他声音,音乐就会出现噪音。

我像这样使用FR(频域,交错,不复杂,甚至相同长度):

    vDSP_vmul(soundToModify, 1, frequencyResponse, 1, soundToModify, 1, n);

我在扬声器上播放的文件的正弦扫描: enter image description here

我录制的正弦扫描(衰减的低频可见): enter image description here

我的文件正弦扫描在频域中与在代码中生成的FR一起乘以: enter image description here

我的目标: 在我的理解中,频率响应是关于每个频率的信息,它被系统衰减或放大多少(在我的例子中它不能再现低频)。为了获得这种信息,我生成一个包含每个所需频率(正弦扫描)的声音,并通过划分记录扫描/文件扫描(代码划分)来分析每个频率的修改方式。

通过在频域中将此FR乘以任何声音,应修改频率幅度以模仿我系统上的播放,对吗?

谢谢!


更新 最后,故障是缺失的复杂算术,正弦扫描和粉红噪声都很好地作为恢复脉冲响应的冲动。

获取工作代码只是复杂 - 将记录的扫描fft数据除以初始扫描fft数据。

1 个答案:

答案 0 :(得分:3)

如果您想重新创建iPhone扬声器/麦克风的声音,理想情况下您需要找到系统的脉冲响应。

你做错了什么:找到正弦扫描的FFT是没有意义的,因为输入频率是在系统强加其自身频率响应之前开始变化(线性或指数或其他)。正如上面提到的Paul R所建议的,找到白噪声的FFT更有意义,因为在许多统计上平坦的输入频率上求平均将为您提供系统的实际频率响应。

但是,如果您的目标是重新创建系统的声音,则还需要处理阶段,这在上述任何一种方法中都没有完成。理想的'这样做的方法是捕捉iPhone扬声器/麦克风系统对“冲动”的反应。在一个完全安静和干燥(无反射)的环境中。有3种方法可以做到: 1.使用气球弹出声音或合成创建的脉冲声音。 2.使用Golay码,这是一种平均许多脉冲响应测量的简单方法 3.使用正弦扫描,然后使用相关性来找出脉冲响应。

参考:https://ccrma.stanford.edu/realsimple/imp_meas/imp_meas.pdf

一旦获得脉冲响应测量值,请将其与您尝试的信号进行卷积,然后对两个信号进行FFT,在频域中相乘,然后进行逆FFT计算。得到有色信号。

说明: 据我所知,我会尝试解释它: - 当您采用脉冲响应的FR时,您可以获取其FFT的幅度,丢弃相位数据。因此,有许多具有相同幅度FR的滤波器(系统)将为您提供完全不同的输出。例如,Allpass过滤器 - 它们都有一个平坦的FR,但如果你通过它们产生冲动,你可以根据过滤器参数获得正弦扫描。显然,这应该指出这样一个事实:尽管你总是可以从IR到FR,但是向相反方向返回意味着你正在做出任意选择。因此,即使粗略估计,也不能丢弃相位。我们无法听到阶段这一事实意味着我们可以查看FR以获取有关系统的信息,但不允许我们忽略系统建模的阶段。我希望这是有道理的? 要使用正弦扫描,请执行以下操作 - 如果s(t)= sin(A(t))和A(t)=积分[0到t](w(t)dt),则将信号e(t)关联起来= corr(v(t),sin(A(t))其中v(t)= 2 * abs(dw / dt)将产生一个脉冲。因此,如果用与被测信号的相关性替换正弦扫描,你应该获得它的冲动响应。 希望有所帮助!对不起,因为它是如此数学。