【问题标题】:Noise cancellation setup - combining the microphone's signals intelligently [closed]降噪设置 - 智能组合麦克风的信号 [关闭]
【发布时间】:2013-07-18 14:51:18
【问题描述】:

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

这是一个示例

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);

但这并不能消除周围的噪音,它只会产生噼啪声。

我怎样才能用我的设置来完成这项任务?我更喜欢实用的解决方案,而不是“阅读只有论文作者理解的论文”。

当我们这样做时,我如何标准化最终的单声道输出以使其尽可能响亮而不会出现削波?

【问题讨论】:

    标签: c audio cancellation echo-cancellation


    【解决方案1】:

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

    dif = r - (l * 2);
    

    消除噪音,但我可以告诉你为什么它会“产生[s]噼啪声”。 diff 中的值通常会超出 16 位音频的范围。发生这种情况时,您的简单转换函数:

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

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

    即使您解决了这个问题,也有一些事情尚不清楚,其中最重要的是要使主动降噪起作用,您通常会假设一个麦克风提供噪声源,而另一个麦克风提供信号 + 噪声。在这种情况下哪个是哪个?您是否只是将两个麦克风并排放置,并希望通过一些简单的运算后听到一些环境噪音较小的声源?那是行不通的,因为他们都听到了不同的信号和噪声组合(不仅仅是幅度,还有时间)。所以你需要回答 1. 哪个麦克风是信号源,哪个是噪音源? 2. 你想消除什么样的噪音? 3. 麦克风在听到信号和噪音方面的区别是什么? 4.等

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

    您可能有一个设置,其中一个麦克风的信号强而另一个麦克风的信号弱,并且两个麦克风都应用了噪音。在所有可能的情况下,两个麦克风都会有信号泄漏。尽管如此,我们会假设

    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。

    如果有泄漏,预计此设置也会消除低于截止频率的大量信号。

    【讨论】:

    • 此外,OP 的原始方法没有考虑两个信号之间的相位关系——这将由于两个麦克风的空间放置以及由此导致的音频路径长度不同而发生。这里假设噪声信号入射在同一样本中的两个麦克风上。为此,路径长度差必须略小于 7 毫米。
    • 正如我所说的“不仅仅是幅度,还有时间”。
    • @BjornRoche “在这种情况下是哪个?” l = 噪声,r = 源 + 噪声。设置是这样的:zuz.mimekunst.com/Nutzerbilder/1374261145.png 那种噪音是水落在陶瓷上。对于处理噼啪声,您有什么建议?
    • @Marko 我同意。我没有包括相位差。鉴于我附上的原始文件,您将如何确定它。一旦发现我假设给定一个固定的设置但稍微移动的声源,它应该保持不变。
    • @BjornRoche 幅度应该固定为 2 in dif = r - (l * 2);
    猜你喜欢
    • 2011-04-21
    • 2015-11-26
    • 2013-02-15
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多