C 求数组的平均值

C 求数组的平均值,c,arrays,algorithm,average,C,Arrays,Algorithm,Average,我真的很难从数组中找到加权和。 我有一个称为频率[28]的数组(1D大小为28),还有一个称为峰值[28]的相同大小的索引数组。数组将始终具有值或零。我想要实现的是遍历数组,从频率和幅值数组中检索两个值,同时忽略零。此外,我并没有试图找到整个数组的加权平均值 我想我说得不够清楚 比如说 frequency[n] = [0,0,0, a,b, 0,0,0, c,d,e, 0,0, f] peak[n] = [0,0,0, z,y, 0,0,0, x,w,v, 0,0, u] 因此,我想忽略前三个

我真的很难从数组中找到加权和。 我有一个称为频率[28]的数组(1D大小为28),还有一个称为峰值[28]的相同大小的索引数组。数组将始终具有值或零。我想要实现的是遍历数组,从频率和幅值数组中检索两个值,同时忽略零。此外,我并没有试图找到整个数组的加权平均值

我想我说得不够清楚

比如说

frequency[n] = [0,0,0, a,b, 0,0,0, c,d,e, 0,0, f]
peak[n] = [0,0,0, z,y, 0,0,0, x,w,v, 0,0, u]
因此,我想忽略前三个料仓,因为它们是零,求(a,b)与(z,y)的加权平均值,忽略后三个料仓,然后再次求(c,d,e)与(x,w,v)的加权平均值,依此类推。
请注意,数组中的值(大小是固定的)不是固定的。可能出现值的索引总是变化的

我已经附上了检索数组的代码片段。 任何建议或指导都会大有帮助

// peak search
threshold = 0;
for (ctr=0; ctr<n1; ctr++)
{   
    peak[ctr] = 0; // initialise arrays
    freq_bin[ctr] =0;
    frequency[ctr] = 0;

    // magnitude calculation from fft output
    fft_mag[ctr] = 10*(sqrt((fft_output[ctr].r * fft_output[ctr].r) + (fft_output[ctr].i * fft_output[ctr].i)))/(n);
    threshold = 12; 
    if (fft_mag[ctr] >= threshold) // extract fft magnitudes only above threshold
    {
        peak[ctr] = fft_mag[ctr]; // store magnitude above threshold into peak array
        freq_bin[ctr] = ctr;        // location of each magnitude above threshold
        frequency[ctr] = (freq_bin[ctr]*(10989/n)); // frequency calculation from magnitude location        
    }
}
因此,我需要计算:

  • 平均1=(14x462)/14=462 Hz
  • 平均2=(14x714)/14=714 Hz
  • 平均值3=(29x924+74x966+45x1008)/(29+74+45)=938.8 Hz

    • 您可以将其视为一个状态机。它一次读入一个符号,并根据它更改状态

      有两种状态:开始状态和已读取某些数据的状态

      在开始状态下,如果下一个符号为零,则保持此状态。如果没有,请处理符号并更改状态

      在另一种状态下,如果下一个符号为零,则发出结果并更改状态。如果没有,请进行处理。如果在此状态下遇到端点,则发出结果

      下面是一个非常干净的Python实现:

      class Averager:
      
          def __init__(self):
      
              self.averages = []
      
              self.sumOfNumbers = 0
              self.count = 0
      
          def addToAverage(self, number, weight):
              self.sumOfNumbers += number * weight
              self.count += weight
      
          def emitAverage(self):
              self.averages.append(self.sumOfNumbers / self.count)
              self.sumOfNumbers = 0
              self.count = 0
      
      
      def averagesOf(data, weights):
      
          averager = Averager()
          dataRead = False
      
          def emitIfData():
              if dataRead:
                  averager.emitAverage()
      
          for number, weight in zip(data, weights):
              if number == 0:
                  emitIfData()
                  dataRead = False
              else:
                  averager.addToAverage(number, weight)
                  dataRead = True
      
          emitIfData()
      
          return averager.averages
      
      print(averagesOf([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 0, 714, 0, 0, 0, 924, 966, 1008, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  14, 0, 0, 0, 0, 0, 0,  14, 0, 0, 0,  29,  74,   45, 0, 0, 0, 0]))
      
      输出:

      [462.0, 714.0, 970.5405405405405]
      

      你可以把它看作一个状态机。它一次读入一个符号,并根据它更改状态

      有两种状态:开始状态和已读取某些数据的状态

      在开始状态下,如果下一个符号为零,则保持此状态。如果没有,请处理符号并更改状态

      在另一种状态下,如果下一个符号为零,则发出结果并更改状态。如果没有,请进行处理。如果在此状态下遇到端点,则发出结果

      下面是一个非常干净的Python实现:

      class Averager:
      
          def __init__(self):
      
              self.averages = []
      
              self.sumOfNumbers = 0
              self.count = 0
      
          def addToAverage(self, number, weight):
              self.sumOfNumbers += number * weight
              self.count += weight
      
          def emitAverage(self):
              self.averages.append(self.sumOfNumbers / self.count)
              self.sumOfNumbers = 0
              self.count = 0
      
      
      def averagesOf(data, weights):
      
          averager = Averager()
          dataRead = False
      
          def emitIfData():
              if dataRead:
                  averager.emitAverage()
      
          for number, weight in zip(data, weights):
              if number == 0:
                  emitIfData()
                  dataRead = False
              else:
                  averager.addToAverage(number, weight)
                  dataRead = True
      
          emitIfData()
      
          return averager.averages
      
      print(averagesOf([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 0, 714, 0, 0, 0, 924, 966, 1008, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  14, 0, 0, 0, 0, 0, 0,  14, 0, 0, 0,  29,  74,   45, 0, 0, 0, 0]))
      
      输出:

      [462.0, 714.0, 970.5405405405405]
      

      下面是一些近似于MCVE()的代码。除此之外,我还通过在非零数据集之前和之间保留一组零来压缩操作/有趣的数据。3期加权平均数的计算在以下问题上似乎是错误的:

      • 平均值3=(29x924+74x966+45x1008)/(29+74+45)=938.8 Hz
      • 平均值3=(26796+71484+45360)/148
      • 平均值3=143640/148
      • 平均值3=970.54
      这与程序的计算结果一致

      代码:

      有很大的空间来改进输出(例如,回显输入数据的相关子集不是一个坏主意)


      有了这个框架,您可以通过从FFT输出中的值计算
      peak
      freq
      中的值,而不是使用硬编码数组,从而使场景复杂化。

      下面是一些近似MCVE()的代码。除此之外,我还通过在非零数据集之前和之间保留一组零来压缩操作/有趣的数据。3期加权平均数的计算在以下问题上似乎是错误的:

      • 平均值3=(29x924+74x966+45x1008)/(29+74+45)=938.8 Hz
      • 平均值3=(26796+71484+45360)/148
      • 平均值3=143640/148
      • 平均值3=970.54
      这与程序的计算结果一致

      代码:

      有很大的空间来改进输出(例如,回显输入数据的相关子集不是一个坏主意)


      有了这个框架,您可以通过从FFT输出中的值计算
      peak
      freq
      中的值,而不是使用硬编码数组,从而使场景复杂化。

      您能描述一下您的程序做错了什么吗?包括样本输入、预期输出和实际输出。一个编译和再现这个问题的实际程序也能帮助你得到答案。正如我在学校和Nick Cave学到的:“零也是一个数字”(或一个值)。你真的需要解释
      峰值
      频率
      fft\u mag
      fft\u输出
      数组的用途;您在问题中只提到了两个数组。我想您需要两个数组索引。一是"投入"指标,;您可以继续调用它
      ctr
      ,它将保持不变。另一个可以称为
      out
      ;将其设置为零,仅当在
      if
      语句体中将非零值分配给
      峰值[out]
      频率[out]
      频率[out]
      时,才将其递增,当您选择了值时,将
      out++
      添加到增量
      输出的末尾。循环结束后,您有包含值的元素[0..out]。我刚刚详细阐述了这个问题。很抱歉,如果我让您感到困惑,我也会感到困惑。请研究如何创建MCVE()或SSCCE()-两个名称和链接用于相同的基本思想。您仍然有未记录的变量(
      n
      n1
      fft\u输出
      fft\u mag
      freq\u bin
      ,仅举五例)虽然我们可以对它们的意思进行有根据的猜测,但这些都是我们不应该猜测的。也没有关于类型的文档。在循环外部将
      阈值设置为
      0
      ,在循环内部设置为
      12
      ,这似乎很奇怪。等等。您能描述一下您的程序出了什么问题吗?包括sample输入、预期输出和实际输出。编译和再现问题的实际程序也将帮助您获得
      1 .. 1:  462.0
      3 .. 3:  714.0
      5 .. 7:  970.5