Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 噪音消除设置-组合麦克风和x27;智能地发送信号_C_Audio_Cancellation_Echo Cancellation - Fatal编程技术网

C 噪音消除设置-组合麦克风和x27;智能地发送信号

C 噪音消除设置-组合麦克风和x27;智能地发送信号,c,audio,cancellation,echo-cancellation,C,Audio,Cancellation,Echo Cancellation,我用两个麦克风和两个不同的麦克风前置放大器构建了一个噪音消除装置,它们可以连接到立体声录音的两个不同通道 这是一个样本 我试过了 char ergebnis[80]; sprintf(ergebnis, "%s.neu.raw", Datei); FILE* ausgabe = fopen(ergebnis, "wb"); FILE* f = fopen(Datei, "rb"); if (

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

这是一个样本

我试过了

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);
为了消除噪音,我可以告诉你为什么它会“发出噼啪声”。dif中的值通常超出16位音频的范围。发生这种情况时,您的简单转换函数:

    putc((char)( (unsigned)dif       & 0xff), ausgabe);
    putc((char)(((unsigned)dif >> 8) & 0xff), ausgabe); 
将失败。您的音频将从较大的正值跳到较大的负值,而不是平滑曲线。如果这让你困惑的话

即使你解决了这个问题,有几件事还是不清楚,尤其是对于有源噪声抵消,你通常假设一个麦克风提供噪声源,另一个提供信号+噪声。在这种情况下,哪个是哪个?你是不是把两个麦克风放在一起,通过简单的运算,希望听到一些环境噪音更小的声源?这是行不通的,因为他们都能听到信号和噪声的不同组合(不仅仅是振幅,还有时间)。所以你需要回答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最初的方法没有考虑两个信号之间的相位关系,这是由于两个话筒的空间位置以及到音频的不同路径长度造成的。这里假设噪声信号入射到同一样本中的两个话筒上。在这种情况下,pathlegnth差必须小于7mm。正如我所说的“不仅在振幅上,而且在时间上”。@BjornRoche“在这种情况下是哪一个?”l=噪声,r=源+噪声。设置是这样的:这种噪音是水落在陶瓷上的声音。你对处理爆裂声有什么建议?@Marko我同意。我没有包括相位差。鉴于我所附的原始文件,您将如何确定它。一旦计算出来,它应该保持不变,我假设给定了一个固定的设置,但稍微移动的声源。@BjornRoche振幅应该由2 in dif=r-(l*2)固定;
Speed of sound = 13 397 inches / sec
desired wavelength = 4*3 inches = 12 inches
frequency = 13,397 / 12 = 1116 Hz