Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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++ 改变音频信号的增益,而它';s播放会产生伪影_C++_Audio_Real Time_Signal Processing_Juce - Fatal编程技术网

C++ 改变音频信号的增益,而它';s播放会产生伪影

C++ 改变音频信号的增益,而它';s播放会产生伪影,c++,audio,real-time,signal-processing,juce,C++,Audio,Real Time,Signal Processing,Juce,我在程序中播放音频文件,在音频渲染回调中,我对输入信号应用增益倍增,并将其添加到输出缓冲区。下面是一些伪代码来说明我的操作: void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){ for (int i=startSample; i<numSamples+startSample; i++){ ao[i] = ai[i]*gain;

我在程序中播放音频文件,在音频渲染回调中,我对输入信号应用增益倍增,并将其添加到输出缓冲区。下面是一些伪代码来说明我的操作:

void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){
    for (int i=startSample; i<numSamples+startSample; i++){
        ao[i] = ai[i]*gain;
    }
}
void audioCallback(AudioOutputBuffer*ao、AudioInput*ai、int startSample、int numSamples){

对于(int i=startSample;i我通过以更改量的增量更改增益来修复它。例如,如果增益乘数设置为1.0,然后更改为0.8,这是0.2增益的差异。对于回调中的每个样本,将差异/numsample添加到上一个卷中,以创建模糊或逐渐的增益更改。

我修复了it以更改量的增量更改增益。例如,如果增益乘数设置为1.0,然后更改为0.8,则为0.2增益的差值。对于回调中的每个样本,将差值/numSamples添加到上一个卷中,以创建模糊或逐渐的增益更改。

问题:乘法如何操作知道哪一个操作数是音频信号,哪一个是增益吗?回答:不知道。它们都是音频信号,任何一个操作数的声音都会在输出中被听到

平坦不变的信号不会发出任何声音。只要增益保持不变,它就不会发出任何声音

突然变化的信号会非常清晰,听起来像咔哒声,包含很多高频

正如您自己确定的,降低高频内容和可听性的一种方法是使用恒定斜率将变化延伸到多个样本上。这在您有大量时间进行增益变化的应用中肯定足够了


另一种方法是对增益信号运行低通滤波器,并将其用作乘法的输入。

问题:乘法运算符如何知道哪个操作数是音频信号,哪个操作数是增益?回答:不知道。它们都是音频信号,任何一个操作数中的声音都会在输出中听到。

平坦不变的信号不会发出任何声音。只要增益保持不变,它就不会发出任何声音

突然变化的信号会非常清晰,听起来像咔哒声,包含很多高频

正如您自己确定的,降低高频内容和可听性的一种方法是使用恒定斜率将变化延伸到多个样本上。这在您有大量时间进行增益变化的应用中肯定足够了


另一种方法是对增益信号运行低通滤波器,并将其用作乘法的输入。

这是因为ao[i]可能会溢出最大值。例如,如果最大值为255,并且您试图存储更高的值,则会对其进行剪裁,从而导致伪影。我尝试使用0.0到1.0的增益乘数范围进行此操作,在这种情况下,乘数将永远不会增加信号,因此这肯定不是剪裁问题。我还通过p验证了这一点打印出所有原始音频输出值(我知道这会导致工件实时打印,但它会在不打印的情况下剪辑)。尝试不带增益。是否剪辑?如果是,您可能在原始信号中有错误,否则我不知道溢出的其他原因。还要确保两个缓冲区的类型相同,例如:未签名16。如果我不实时更改增益,则不会出现伪影。如果我应用增益,但在音频播放bac时不更改它,则k、 没有伪影。只有在音频仍在播放的情况下更改增益倍增器时,才会出现伪影。如果完全移除增益,则不会出现剪辑。这是因为ao[i]可能会溢出最大值。例如,如果最大值为255,并且您试图存储更高的值,则会对其进行剪裁,从而导致伪影。我尝试使用0.0到1.0的增益乘数范围进行此操作,在这种情况下,乘数将永远不会增加信号,因此这肯定不是剪裁问题。我还通过p验证了这一点打印出所有原始音频输出值(我知道这会导致工件实时打印,但它会在不打印的情况下剪辑)。尝试不带增益。是否剪辑?如果是,您可能在原始信号中有错误,否则我不知道溢出的其他原因。还要确保两个缓冲区的类型相同,例如:未签名16。如果我不实时更改增益,则不会出现伪影。如果我应用增益,但在音频播放bac时不更改它,则k、 没有伪影。只有在音频仍在播放时更改增益倍增器时,才会出现伪影。如果我完全删除增益,则不会出现削波。这是正确的。增益的突然变化会导致增益信号中出现大量高频。这在结果中反映出来,因为它实际上是一种组合两个信号的叠加。“混浊”这一变化极大地降低了高频含量。这是正确的。增益的突然变化会导致增益信号中出现大量高频。这一点在结果中得到反映,因为它实际上是两个信号的组合。“混浊”这一改变极大地减少了高频内容。这解释了为什么当我在我正在做的事情上改变混音时,我会点击…脸掌瞬间!这解释了为什么当我在我正在做的事情上改变混音时,我会点击…脸掌瞬间!