寻找正弦波阵列的频率

时间:2014-03-19 10:43:40

标签: c arrays frequency wave sine

我试图找到一种方法来计算以阵列形式呈现的正弦波的频率,基于索引通过获取索引的差异。我所知道的是两个相邻指数之间的时间,所以我可以将这个时间常数乘以两个最大点(或最小点)之间的指数差。

这是我的方法:

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循环也存在错误,所以我猜这个语法错了?当我找到一个单波时,我想停止,即最大,最小和另一个最大点或最小,最大和另一个最小点。正弦数据有噪声,因此最小点和最大点不会相等,但这种噪声非常小。

3 个答案:

答案 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.