【发布时间】:2014-01-31 05:12:54
【问题描述】:
我有一个相当简单的问题,但我找不到简单的解决方案。
事情是这样的,我有一个信号让我们说 x 的长度是 32.x[32]。这个数组在每一步都得到了实时信号的值。在第一步我得到 [0:31] 值,第二步 [1:32],第三步 [2:33] 等等。为了获得我想要重叠的最终信号,添加这些值并将它们存储到一个数组中。我尝试这样做的方法是声明一个特定长度的数组,比如说 150。xfinal[150]。
然后,为了填充 xfinal,我这样做了。
Step 1. xfinal[0:31] = x[0:31].
Step 2. xfinal[1:31] = xfinal[1:31] + x[0:30].
xfinal[32] = x[31];
Step 3. xfinal[2:32] = xfinal[2:32] + x[0:30].
xfinal[33] = x[31];
等等。这样,在 33 个信号之后,x_final 中的每个值都将是 32 的总和。
我用 C 编写的代码是(它有点复杂,因为 x 是一个帧,所以我必须逐个像素地复制。
void Overlapadd ( float **final_X, float **all_frames_X, int add_index,int w, int h)
{
for (int i=0; i< frame_size ; i++) { // for every pixel
for( int j=add_index; j<add_index+32; j++){
final_X[j][i] += all_frames_S[j-add_index][i];
}
}
add_index++;
}
这段代码的问题是,当我长时间运行它时,final_X 数组将填满,final_X[add_index+32] 将耗尽内存。这就是为什么我想以循环方式存储它。所以当我到达终点时,我回到 0。问题是当我到达final_X 中的一个点时,假设 add_index=60。所以final_X[add_index] 将是 32 帧的总和,但final_X[add_index+1] 将是仅 31 帧中的一些,final_X[add_index+2] 将是仅 30 帧中的一些,依此类推。这些值对我很重要,因为它们通过添加新 x 帮助我获得新值。
我不知道我是否说清楚了,可能没有,但我希望能得到一些帮助。所以问题是我如何重叠添加信号并将它们长期存储在向量中。
【问题讨论】:
-
从您的问题中我发现有两件事难以理解:1)虽然您的解释和草图将
final_X视为一维数组,但您的代码将其用作二维数组。 2)目前尚不清楚您如何确定“内存不足”的情况。能否包括分配步骤? -
我将 final_X 视为一维数组,以便于理解。 x 本身是一个数组,所以 final_x 将是一个数组的数组,但原理是一样的。内存不足的意思是我为 final_X 分配了 150 帧,在某些时候我会调用 final_X[151]。