噪音消除设置 - 智能地组合麦克风的信号

时间:2013-07-19 10:36:09

标签: c audio cancellation echo-cancellation

我使用两个麦克风和两个不同的麦克风前置放大器构建了一个噪声消除设置,可以连接两个不同的立体声录音通道。

这是一个示例

http://filestore.to/?d=U5FN2IH96K

我试过

char  ergebnis[80];                                                  
sprintf(ergebnis, "%s.neu.raw", Datei);
FILE* ausgabe = fopen(ergebnis, "wb");
FILE* f = fopen(Datei, "rb");

if (f == NULL) 
{
    return;
}

int i   = -1;
int r1  =  0;
int r2  =  0;
int l1  =  0;
int l2  =  0;
int l   =  0;
int r   =  0;
int wo  =  0;
int dif =  0;

while (wo != EOF) 
{
    wo = getc(f);  
    i++;

    if (i == 0) 
    {
        r1 = (unsigned)wo;
    }

    if (i == 1) 
    {
        r2 = (unsigned)wo;
        r = (r2 << 8) + r1;   //r1 | r2 << 8;  
    }

    if (i == 2) 
    {
        l1 = (unsigned)wo;
    }

    if (i == 3) 
    {
        l2  = (unsigned)wo;
        l   = (l2 << 8) + l1;   //l1 | l2 << 8;   
        dif = r - (l * 2);
        putc((char)( (unsigned)dif       & 0xff), ausgabe);
        putc((char)(((unsigned)dif >> 8) & 0xff), ausgabe); 
        i = -1;
    }
} 

当魔术发生在

dif = r - (l * 2);

但这并没有消除它周围的噪音,所有这一切都会产生噼里啪啦的声音。

我如何使用我的设置来完成此任务?我更喜欢实用的解决方案而不是“阅读本文只有论文的作者理解”。

虽然我们在这里,但我如何规范化最终的单声道输出以使其尽可能大而不会剪辑?

1 个答案:

答案 0 :(得分:2)

我不知道为什么你会期待这个

dif = r - (l * 2);

取消噪音,但我可以告诉你为什么它会产生噼里啪啦的声音&#34;。 dif的值通常超出16位音频的范围。发生这种情况时,您的简单转换功能是:

    putc((char)( (unsigned)dif       & 0xff), ausgabe);
    putc((char)(((unsigned)dif >> 8) & 0xff), ausgabe); 

会失败。您的音频将从大的正值跳到大的负值,而不是平滑的曲线。如果这让您感到困惑,maybe this post will help

即使你解决了这个问题,一些事情也不清楚,其中最重要的是有效的噪音消除工作你通常认为一个麦克风提供噪音源而另一个提供信号+噪声。在这种情况下哪个是哪个?您是否只是将两个麦克风彼此相邻放置并希望在经过一些简单的算术后听到一些噪声较小的声源?这不会起作用,因为他们都听到了信号和噪声的不同组合(不仅仅是幅度,还有时间)。所以你需要回答1.哪个麦克风是信号源,哪个是噪声源?你试图取消什么样的噪音? 3.麦克风能够听到信号和噪音的区别是什么?等等。

更新:我仍然不清楚您的设置,但这里可能有所帮助:

你可能有一个设置,你的信号在一个麦克风中很强而在另一个麦克风中较弱,并且两个麦克风都会产生噪音。在所有可能的情况下,两个麦克风都会有信号泄漏。不过,我们假设

l = noise1
r = signal + noise2

请注意,我没有为l和r假设相同的噪声值,这反映了由于时间延迟和其他因素导致两个麦克风将拾取不同噪声值的现实。但是,通常情况(在您的设置中可能或可能不是这种情况)噪声1和噪声2在低频率相关。因此,如果我们有一个低通滤波器lp,我们可以在低频中实现一些降噪,如下所示:

out = r - lp(l) = signal + noise2 - lp(noise1)

当然,这假设l和r处的噪音水平相同,可能会也可能不会,具体取决于您的设置。您可能希望为此目的留下手动参数,以便在最后进行手动调整:

out = r - g*lp(l)

其中g是您的调整参数并接近1.我相信一些高端降噪系统,g会不断自动调整。

为lp滤波器选择截止频率就是剩下的。您可以使用的近似值是,您可以取消的最高频率的波长等于麦克风之间距离的1/4。当然,我真的挥舞着手臂,因为它很大程度上取决于声音的来源,你的麦克风的方向性等等,但它是一个起点。

相距3英寸的麦克风的样本计算:

Speed of sound = 13 397 inches / sec
desired wavelength = 4*3 inches = 12 inches
frequency = 13,397 / 12 = 1116 Hz

因此,如果麦克风间隔3英寸,您的滤波器的截止频率应为1116 Hz。

如果有出血,预计此设置会取消低于截止频率的大量信号。

相关问题