Как я могу усреднить подмножество массива и сохранить результат в другом массиве? - PullRequest
4 голосов
/ 18 октября 2011

У меня есть массив 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]и сохраните это в frequencyBar[1] и т. д. Кто-нибудь может мне помочь с этим?Спасибо

Ответы [ 4 ]

4 голосов
/ 18 октября 2011

Это похоже на домашнее задание, поэтому вместо того, чтобы дать вам прямой ответ, я бы просто указал вам правильное направление ...

используйте вложенный цикл (один внутри другого),Один цикл цикличен 0-7, другой 0 - 63. Используйте меньший, чтобы заполнить ваши нарезанные средние.

или, что еще лучше, используйте оператор%, чтобы увидеть, когда вы прошли 8 элементов, и наберите среднее значение для вашей общей суммы, а затем сбросьте сумму для следующего набора.Тогда вы также узнаете, как использовать оператор%!:)

[РЕДАКТИРОВАТЬ] хорошо, если не домашняя работа, то что-то вроде этого ... Я не писал C в течение 5 лет, так что рассматривайте это как псевдокод:

//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
    }
}

Iдумаю, что это будет работать лучше, чем вложенный цикл ... но я не уверен, так как% это деление, которое требует больше ресурсов процессора, чем сложение ... однако ... я сомневаюсь, что кто-нибудь заметит:)

2 голосов
/ 18 октября 2011

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 соответственно ... это может быть не совсем верно, но это будет близко; -)

Приветствия. Кит.


РЕДАКТИРОВАТЬ: Скучно ... жду, когда вернутся результаты моего теста. Нет новостей, это хорошие новости, верно? ; -) * 1 021 *

Оказывается, что передача 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");
}
2 голосов
/ 18 октября 2011
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;
}

Бонусное упражнение: оптимизируйте этот код для скорости на выбранной вами платформе.

0 голосов
/ 18 октября 2011

Следите за тем, чтобы sum не переворачивалось, если fftArray имеет большое значение!

...