C 求数组的平均值
我真的很难从数组中找到加权和。 我有一个称为频率[28]的数组(1D大小为28),还有一个称为峰值[28]的相同大小的索引数组。数组将始终具有值或零。我想要实现的是遍历数组,从频率和幅值数组中检索两个值,同时忽略零。此外,我并没有试图找到整个数组的加权平均值 我想我说得不够清楚 比如说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] 因此,我想忽略前三个
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