gpt4 book ai didi

c - 将重叠相加值存储在数组中

转载 作者:行者123 更新时间:2023-11-30 17:41:30 25 4
gpt4 key购买 nike

我有一个相当简单的问题,但我找不到简单的解决方案。事情是这样的,我有一个信号,假设 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 来获取新值。

我不知道我是否说清楚了,可能没有,但我希望得到一些帮助。所以问题是如何重叠添加信号并将它们长期存储在 vector 中。 enter image description here

最佳答案

您可以使用模算术来实现这一点,但代价是在最内层循环中增加一个变量作为计数器,而另一个变量作为位置索引。

#define FINAL_X_LEN 150

void Overlapadd(float **final_X, float **all_frames_X, int add_index)
{
for (int i = 0; i < frame_size; i++)
for(int j = add_index, int k = 0; k < 32; j = (j+1)%FINAL_X_LEN)
final_X[j][i] += all_frames_S[k][i];

}

这里,k 用于计算迭代次数,j 是您要索引的真实位置。

要小心 Overlapadd 末尾的 add_index++;,这很可能不会按您期望的方式工作。值通过副本传递,因此 add_index++ 仅增加 add_index 的本地副本,此更改对调用者不可见。如果您想模拟按引用传递,则必须将 add_index 作为指针传递。

另外,请注意,您组织代码的方式对于缓存来说不是很友好。 final_X[j][i] += ... 不好,因为 j 在最内层循环的每次迭代中都会更改,这会破坏空间局部性并增加缓存未命中率。如果访问阵列中的附近位置,则可以增加缓存命中时间和整体程序性能。我建议复制每个位置 j 的每一帧,而不是为每个位置 j 一次复制一帧(这就是您现在正在做的事情)。在这种情况下,这就像交换循环的顺序一样简单:

void Overlapadd(float **final_X, float **all_frames_X, int add_index)
{
for(int j = add_index, int k = 0; k < 32; j = (j+1)%FINAL_X_LEN)
for (int i = 0; i < frame_size; i++)
final_X[j][i] += all_frames_S[k][i];

}

关于c - 将重叠相加值存储在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21074660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com