Audio 将wav文件与libsndfile混合时的瑕疵

Audio 将wav文件与libsndfile混合时的瑕疵,audio,wav,mixing,libsndfile,Audio,Wav,Mixing,Libsndfile,我正在尝试实现一个混合钢琴样本的软件。我想创建一个wav文件,其中包含一种声音,另一种声音以及两者的混合 我在一秒钟内对样品进行trunc,因此我有以下内容: [声音1的1秒][声音2的1秒][声音1的1秒+声音2] 问题是在每个过渡处都有一个奇怪的声音伪影。有人知道它来自哪里吗 提前谢谢 以下是我正在使用的代码: #include "stdafx.h" #include <cstdlib> #include <sndfile.h> int _tmain(int ar

我正在尝试实现一个混合钢琴样本的软件。我想创建一个wav文件,其中包含一种声音,另一种声音以及两者的混合

我在一秒钟内对样品进行trunc,因此我有以下内容: [声音1的1秒][声音2的1秒][声音1的1秒+声音2]

问题是在每个过渡处都有一个奇怪的声音伪影。有人知道它来自哪里吗

提前谢谢

以下是我正在使用的代码:

#include "stdafx.h"
#include <cstdlib>
#include <sndfile.h>


int _tmain(int argc, _TCHAR* argv[])
{
    SF_INFO sInfo1;
    SF_INFO sInfo2;
    SF_INFO sInfo3;

    SNDFILE *sFile1 = NULL;
    SNDFILE *sFile2 = NULL;
    SNDFILE *sFile3 = NULL;

    double *buff1;
    double *buff2;
    double *buff3;

    sf_count_t count1 = 0;
    sf_count_t count2 = 0;
    sf_count_t count3 = 0;

    buff1 = (double*)malloc(88200*sizeof(double));
    buff2 = (double*)malloc(88200*sizeof(double));
    buff3 = (double*)malloc(88200*sizeof(double));

    sInfo1.format = 0;
    sInfo2.format = 0;
    sFile1 = sf_open("C:/samples/mezzo forte/mcg_mf_022.wav", SFM_READ, &sInfo1);
    sFile2 = sf_open("C:/samples/mezzo forte/mcg_mf_046.wav", SFM_READ, &sInfo2);

    sInfo3 = sInfo2;
    sFile3 = sf_open("C:/samples/test1.wav", SFM_WRITE, &sInfo3);

    count1 = sf_read_double(sFile1, buff1, 88200);
    count2 = sf_read_double(sFile2, buff2, 88200);

    for(int i=0; i<88200; i++)
    {
        buff3[i] = buff1[i] + buff2[i] - ( buff1[i] * buff2[i] );
    }

    count1 = sf_write_double(sFile3, buff1, 88200);
    count2 = sf_write_double(sFile3, buff2, 88200);
    count3 = sf_write_double(sFile3, buff3, 88200);

    sf_close(sFile1);
    sf_close(sFile2);
    sf_close(sFile3);

    free(buff1);
    free(buff2);
    free(buff3);

    //getchar();
    return 0;
}
#包括“stdafx.h”
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
SF_信息信源1;
SF_信息sInfo2;
SF_信息sInfo3;
SNDFILE*sFile1=NULL;
SNDFILE*sFile2=NULL;
SNDFILE*sFile3=NULL;
双*1;
双倍*2;
双*3;
sf_count_t count1=0;
sf_count_t count2=0;
sf_count_t count3=0;
buff1=(双*)malloc(88200*sizeof(双));
buff2=(双*)malloc(88200*sizeof(双));
buff3=(双*)malloc(88200*sizeof(双));
sInfo1.format=0;
sInfo2.format=0;
sFile1=sf_open(“C:/samples/mezzo forte/mcg_mf_022.wav”、SFM_READ和sInfo1);
sFile2=sf_open(“C:/samples/mezzo forte/mcg_mf_046.wav”、SFM_READ和sInfo2);
sInfo3=sInfo2;
sFile3=sf_open(“C:/samples/test1.wav”、SFM_WRITE和sInfo3);
count1=sf\u read\u double(sFile1,buff1,88200);
count2=sf\u read\u double(sFile2,buff2,88200);

对于(int i=0;i我一点也不清楚你想做什么。你的描述是:“我想创建一个包含一种声音、另一种声音以及两者混合的wav文件。”如果你想将一种声音和另一种声音结合起来,为什么还要将两者结合起来呢?这就像把牛奶和奶油混合在一起,然后加入一些

也许您试图使输出为三秒长,第一秒包含第一个声音,第二秒包含第二个声音,第三秒包含两个声音的混合,但是您的代码不是这样的,所以我将忽略这种可能性

让我们做一些基本的练习

要复制第一个文件的第一秒钟,循环如下所示:

buff3[i] = buff1[i] ;
buff3[i] = buff2[i] ;
要复制第二个文件的第一秒,循环如下所示:

buff3[i] = buff1[i] ;
buff3[i] = buff2[i] ;
要混合这两种信号,只需将它们相加。混合与组合是一样的。有时我们说我们将两个信号“叠加”在一起:

buff3[i] = buff1[i] + buff2[i] ;
您通常希望除以2以防止信号“越界”:


请注意,我们在任何地方都没有将信号的样本值相乘。像您这样的逐样本乘法是为非常不寻常的情况保留的,例如AM合成。

我根本不清楚您要做什么。您的描述中说:“我想创建一个包含一种声音、另一种声音以及两者的混合的wav文件。”如果你想将一种声音和另一种声音结合起来,为什么还要将两者结合起来呢?这就像把牛奶和奶油混合在一起,然后加入一些

也许您试图使输出为三秒长,第一秒包含第一个声音,第二秒包含第二个声音,第三秒包含两个声音的混合,但是您的代码不是这样的,所以我将忽略这种可能性

让我们做一些基本的练习

要复制第一个文件的第一秒钟,循环如下所示:

buff3[i] = buff1[i] ;
buff3[i] = buff2[i] ;
要复制第二个文件的第一秒,循环如下所示:

buff3[i] = buff1[i] ;
buff3[i] = buff2[i] ;
要混合这两种信号,只需将它们相加。混合与组合是一样的。有时我们说我们将两个信号“叠加”在一起:

buff3[i] = buff1[i] + buff2[i] ;
您通常希望除以2以防止信号“越界”:


请注意,我们在任何地方都没有将信号的采样值相乘。像您这样的逐采样相乘是为非常不寻常的情况保留的,如AM合成。

这不是libsndfile问题。这是一个一般音频合成问题

无论何时将样本截断为任意值(例如,1秒),您都可以期望听到(或看到,如果您要将结果文件加载到Audacity中,并在转换边界处检查频谱图和波形)一个伪影。这是因为采样波形的突然变化。我将跳过讨论带宽限制问题的尝试,只是敦促您快速淡出采样,而不仅仅是截断采样。这会迫使您的音频波形在过渡之前[快速]接近零-平稳

您可能会发现,您还需要淡入(或交叉淡入,如果您与平滑过渡重叠)下一个样本,方法是将其前几个样本的权重设置为接近零的值,并将其向上倾斜[快速,否则您将错过攻击]首先,在每次转换之前,先做一个快速的淡入淡出,并且只有在需要的时候,才担心淡入。实现是一样的(一个样本缩放值会上升或下降),但可能是在1秒内任意截断(结束)样本造成了最大的麻烦

您需要使用一些不同的参数来查看哪些参数有效。例如,为了简单起见,您可能希望从线性缓降开始,而不是从指数或抛物线衰减函数开始。在任何情况下,您都必须确定采样数(或毫秒数)从转换点开始缩放采样值

编辑:

我最初认为你的混音很好,因为你只询问了过渡工件。我的回答解决了这个问题。但是值得注意的是,考虑到你所陈述的目标,我不知道你为什么会像现在这样混音到
buff3
中。如果我理解正确的话,你想简单地将这两种声音组合成
buff3
,只需将另外两个对应的示例添加在一起即可