我试图找到一种方法来计算以阵列形式呈现的正弦波的频率,基于索引通过获取索引的差异。我所知道的是两个相邻指数之间的时间,所以我可以将这个时间常数乘以两个最大点(或最小点)之间的指数差。
这是我的方法:
float find_freq(uint16_t array[500])
{
int i = 0;
int max1 = 0;
int max2 = 0;
int max1_index = 0;
int max2_index = 0;
int min1 = 0;
int min2 = 0;
int min1_index = 0;
int min2_index = 0;
int foundperiod = 0;
int samples = 0;
while(foundperiod == 0)
{
uint16_t current_element = array[i];
uint16_t next = array[i+1];
if (current_element < next && min1 == 0)
{
min1 = 1;
min1_index = i;
}
if (current_element > next && max1 == 0)
{
max1 = 1;
max1_index = i;
}
if (current_element < next && min1 == 1)
{
min2 = 1;
min2_index = i;
}
if (current_element > next && max1 == 1)
{
max1 = 1;
max1_index = i;
}
i++;
if (max1 == max2 == min1 == 1 || min1 == max1 == min2 == 1)
{
foundperiod = 1;
}
}
if (max1 == max2 == min1 == 1)
{
samples = max2_index - max1_index;
}
else if (min1 == max1 == min2 == 1)
{
samples = min2_index - min1_index;
}
//Irrelevant part
uint16_t n = 55000;
int cycles = 3;
float frequency = 1 / (samples*(n/cycles));
return frequency;
}
在while循环退出之前,在部件上失败
if (max1 == max2 == min1 == 1 || min1 == max1 == min2 == 1)
{
foundperiod = 1;
}
即使我的正弦波数组具有正确的值,while循环也存在错误,所以我猜这个语法错了?当我找到一个单波时,我想停止,即最大,最小和另一个最大点或最小,最大和另一个最小点。正弦数据有噪声,因此最小点和最大点不会相等,但这种噪声非常小。
答案 0 :(得分:2)
运算符==
返回0或1的逻辑结果。
max1 == max2 == min1 == 1
将被解释为
( ( max1 == max2 ) == min1 ) == 1
当min1
等于0时,max2
等于1,max1
等于0,表达式将被计算为
( ( 0 == 1 ) == 0 ) == 1
( 0 == 0 ) == 1
1 == 1
1
,你的循环将退出。
答案 1 :(得分:0)
你可能想要
if (max1 == max2 && max1 == min1 && max1 == 1 || min1 == max1 && min1 == min2 && min1 == 1)
{
foundperiod = 1;
}
答案 2 :(得分:0)
哦,是的,你不能这样使用==。 C,不是真正的类型安全,愉快地将bool转换为int。 a == b == c
编译为(a==b) == c
,其中a == b为0(false)或1.