编辑:原来我不需要乘以FRAMESIZE。框架来自libsndfile API(我忽略了),语义与我的程序中框架的定义不同。因此,大小帧* 2和单声道大小帧。
我接受了下面的答案并不完全正确,但却把我推向了正确的方向。谢谢jxh。
我正在做一些音频工作,用C ++写一个效果。我有一个输入源,它是一个交错的2通道样本数组。我发现将该立体声阵列转换为单声道阵列(getMono()
)的功能只会导致一次大量内存膨胀(之前为12.7MB,之后为3.69GB)。它也非常慢。在我的测试用例中,立体声阵列的大小为800254.
我对C ++比较陌生。我在大学里做了很多嵌入式C,但没有这样的。所以,这可能是一个初学者错误。
我已将代码修剪为理解和重现错误所需的最少量代码。本质上,setInput在Sukothai构造函数中调用,然后生成输入数组的单声道版本。
#define SAMPLE float
#define RANDOMWIN .5
#define FRAMESIZE 512
void Sukothai::getMono(SAMPLE * stereo, SAMPLE * mono, int monoSize){
for (int j = 0; j < monoSize; j++) {
mono[j] = .7071*(stereo[j*2] + stereo[j*2+1]);
}
}
void Sukothai::setInput(SAMPLE * in, int frames) {
// per-iteration additional time in terms of seconds
//float extraTime = RANDOMWIN*2;
// new buffer size in terms of samples
//int newSize = ((int)(maxIter*extraTime*2*THE_SRATE)+frames*FRAMESIZE*2);
//SAMPLE * current_buffer = new SAMPLE[newSize];
SAMPLE * mono;
int currentMonoSize = 0;
currentMonoSize = frames*FRAMESIZE;
mono = new SAMPLE[currentMonoSize];
getMono(in, mono, currentMonoSize);
}
现在,这里有三行被注释掉了。这些行创建变量extraTime
,newSize
和current_buffer
。这些都是我效果不同部分的一部分。我在这里评论它们表明它们与立体声到单声道功能没有关系,但是如果我在我的代码中对它们进行评论,我就会出现分段错误。
有谁知道这里发生了什么?
编辑添加了FRAMESIZE定义
答案 0 :(得分:0)
您在输入数组frames
中只有in
个元素,并且您将currentMonoSize
计算为该数量的512
倍。然后,在getMono()
中,您继续从in
(不称为stereo
)读取currentMonoSize
的两倍。这意味着您阅读的内容远远超出您指定的in
中的元素数量。
逻辑上,mono
数组的元素应该是stereo
输入的一半。