我有一个C数组fftArray[64]
,其中包含我想要平均并放入另一个数组frequencyBar[8]
的值。使用for语句可以很容易地获得整个数组的平均值。
int average, sum = 0;
for (i = 0; i < 64; i++)
{
sum += fftArray[i];
}
average = sum/64;
但我似乎无法弄清楚如何从fftArray[0]
到fftArray[8]
获取平均值并将其存储在frequencyBar[0]
中,fftArray[9]
到fftArray[16]
的平均值{1}}并将其存储在frequencyBar[1]
等等。任何人都可以帮我解决这个问题吗?感谢
答案 0 :(得分:4)
这看起来像是一项家庭作业,所以,不要只给你一个彻头彻尾的答案,我宁愿只指出你正确的方向......
使用嵌套循环(一个在另一个内)。一个循环循环0-7,另一个循环0 - 63.使用较小的循环填充切片平均值。
或者更好的是使用%运算符来查看您何时浏览了8个元素并进行了总计的平均值,然后重置下一组的总数。然后你就会学会如何使用%运算符! :)
[编辑] 好吧,如果不是家庭作业,那么这样的事情...我在5年内没有写过C,所以把它视为伪代码:
//assuming you have a fftArray[64] with data, as per your question
int i,sum,avCounter,total;
int averages[8];
for(i=0 , avCounter=0, total=0 ; i<64; ){
total += fftArray[i];
if(++i % 8 == 0){ //%gives you the remainder which will be 0 every 8th cycle
averages[avCounter++] = total / 8
total = 0; //reset for next cycle
}
}
我认为这比嵌套循环更好......但是我不确定,因为%是除了加法处理器更重的除法......但是......我怀疑有人会注意到:)
答案 1 :(得分:2)
int i, j;
for (i = 0; i < 8; i++) {
int sum = 0;
for (j = 0; j < 8; j++) {
sum += fftArray[ 8*i + j ];
}
frequencyBar[i] = sum / 8;
}
奖励练习:优化此代码以提高所选平台的速度。
答案 2 :(得分:2)
TF,
免责声明:这段代码不在我的脑海中......它甚至没有编译过,更不用说经过测试了。
// returns the average of array[first..last] inclusive.
int average(int[] array, int first, int last) {
int sum = 0;
for (i = first; i <= last; i++)
sum += array[i];
return sum / (last - first + 1); // not sure about the +1
}
那么你要做的是循环遍历frequencyBar
数组[0..7]的索引,设置frequencyBar[i] = average(array, first, last);
......棘手的一点是计算first
和last
索引...分别尝试i*8
和(i+1)*8
......这可能不完全正确,但它会很接近; - )
干杯。基思。
编辑:无聊......等待我的测试结果回来。没有消息是好消息,对吗? ; - )
事实证明,传递length
比传递last
索引要简单得多。
#include <stdio.h>
int sum(int array[], int first, int length) {
int sum = 0;
for (int i = first; i < first+length; i++)
sum += array[i];
return sum;
}
double average(int array[], int first, int length) {
double total = sum(array, first, length);
#ifdef DEBUG
printf("DEBUG: [%2d..%2d] %d", first, first+length-1, array[first]);
for (int i = first+1; i < first+length; i++)
printf(" + %d", array[i]);
printf(" = %d / %d = %f\n", (int)total, length, total/length);
#endif
return total / length;
}
int main(int argc, char* argv[]) {
int array[] = { // average
1, 2, 3, 4, 5, 1, 2, 3, // 2.625
4, 5, 1, 2, 3, 4, 5, 1, // 3.125
2, 3, 4, 5, 1, 2, 3, 4, // 3
5, 1, 2, 3, 4, 5, 1, 2, // 2.875
3, 4, 5, 1, 2, 3, 4, 5, // 3.375
1, 2, 3, 4, 5, 1, 2, 3, // 2.625
4, 5, 1, 2, 3, 4, 5, 1, // 3.125
2, 3, 4, 5, 1, 2, 3, 4 // 3
};
double frequency[8];
for (int i = 0; i < 8; i++)
frequency[i] = average(array, i*8, 8);
for (int i = 0; i < 8; i++)
printf("%f ", frequency[i]);
printf("\n");
}
答案 3 :(得分:0)
如果sum
的值很大,请注意fftArray
没有包围!